4、mybatis使用动态带代理实现增删改查CRUD

在上一篇https://blog.csdn.net/LOVEYSUXIN/article/details/103464456的基础上,进一步改造,采用动态代理的方式使得mybatis实现crud操作。

具体代码如下:

1、创建UserMapper接口(对应原UserDao)

package com.xl.dao;

import com.xl.mybatis.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface UserMapper {
    /**
     * 登录(直接使用注解指定传入参数名称)
     * @param userName
     * @param password
     * @return
     */
    public User login(@Param("userName") String userName, @Param("password") String password);

    /**
     * 根据表名查询用户信息(直接使用注解指定传入参数名称)
     * @param tableName
     * @return
     */

    public List<User> queryUserByTableName(@Param("tableName") String tableName);

    /**
     * 根据uId查询用户信息
     * @param uid
     * @return
     */
    public User queryUserById(Long uid);

    /**
     * 查询所有用户信息
     * @return
     */
    public List<User> queryUserAll();

    /**
     * 新增用户信息
     * @param user
     */
    public void insertUser(User user);

    /**
     * 根据uid更新用户信息
     * @param user
     */
    public void updateUser(User user);

    /**
     * 根据uid删除用户信息
     * @param uid
     */
    public void deleteUserById(Integer uid);
}

2、创建UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper:根标签,namespace:命名空间,随便写,一般保证命名空间唯一 ,为了使用接口动态代理,这里必须是接口的全路径名-->
<mapper namespace="com.xl.dao.UserMapper">
    <!--
     1.#{},预编译的方式preparedstatement,使用占位符替换,防止sql注入,一个参数的时候,任意参数名可以接收
     2.${},普通的Statement,字符串直接拼接,不可以防止sql注入,一个参数的时候,必须使用${value}接收参数
   -->

    <select id="queryUserByTableName" resultType="com.xl.mybatis.User">
        select * from ${tableName}
    </select>

    <select id="login" resultType="com.xl.mybatis.User">
        select * from user where username = #{username} and password = #{password}
    </select>

    <!-- statement,内容:sql语句。
       id:唯一标识,随便写,在同一个命名空间下保持唯一,使用动态代理之后要求和方法名保持一致
       resultType:sql语句查询结果集的封装类型,使用动态代理之后和方法的返回类型一致;resultMap:二选一
       parameterType:参数的类型,使用动态代理之后和方法的参数类型一致
     -->
    <select id="queryUserById" resultType="com.xl.mybatis.User">
        select * from user where uid = #{uid}
    </select>
    <select id="queryUserAll" resultType="com.xl.mybatis.User">
        select * from user
    </select>
    <!-- 新增的Statement
       id:唯一标识,随便写,在同一个命名空间下保持唯一,使用动态代理之后要求和方法名保持一致
       parameterType:参数的类型,使用动态代理之后和方法的参数类型一致
       useGeneratedKeys:开启主键回写
       keyColumn:指定数据库的主键
       keyProperty:主键对应的pojo属性名
     -->
    <insert id="insertUser" useGeneratedKeys="true" keyColumn="uid" keyProperty="uid"
            parameterType="com.xl.mybatis.User">
        INSERT INTO user (
        uid,
        uname,
        usex
        )
        VALUES
        (
        #{uid},
        #{uname},
        #{usex}
        );
    </insert>
    <!--
       更新的statement
       id:唯一标识,随便写,在同一个命名空间下保持唯一,使用动态代理之后要求和方法名保持一致
       parameterType:参数的类型,使用动态代理之后和方法的参数类型一致
     -->
    <update id="updateUser" parameterType="com.xl.mybatis.User">
        UPDATE user
        <trim prefix="set" suffixOverrides=",">
            <if test="uname!=null">uname = #{uname},</if>
            <if test="usex!=null">usex = #{usex},</if>
        </trim>
        WHERE
        (uid = #{uid});
    </update>
    <!--
       删除的statement
       id:唯一标识,随便写,在同一个命名空间下保持唯一,使用动态代理之后要求和方法名保持一致
       parameterType:参数的类型,使用动态代理之后和方法的参数类型一致
     -->
    <delete id="deleteUserById" parameterType="java.lang.Integer">
        delete from user where uid=#{uid}
    </delete>
</mapper>

全局配置文件mybatis-config.xml引入UserMapper.xml

3、创建UserMapper测试用例

package com.xl.mybatis.test;

import com.xl.dao.UserMapper;
import com.xl.mybatis.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

import static org.junit.Assert.*;

public class UserMapperTest {
    public UserMapper userMapper;

    @Before
    public void setUp() throws Exception {
        // 指定配置文件
        String resource = "mybatis-config.xml";
        // 读取配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 构建sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        // 1. 映射文件的命名空间(namespace)必须是mapper接口的全路径
        // 2. 映射文件的statement的id必须和mapper接口的方法名保持一致
        // 3. Statement的resultType必须和mapper接口方法的返回类型一致
        // 4. statement的parameterType必须和mapper接口方法的参数类型一致(不一定)
        this.userMapper = sqlSession.getMapper(UserMapper.class);
    }

    @Test
    public void login() {
        System.out.println(this.userMapper.login("root", "123456"));
    }

    @Test
    public void queryUserByTableName() {
        List<User> userList = this.userMapper.queryUserByTableName("user");
        for (User user : userList) {
            System.out.println(user);
        }
    }

    @Test
    public void queryUserById() {
        System.out.println(this.userMapper.queryUserById(1l));
    }

    @Test
    public void queryUserAll() {
        List<User> userList = this.userMapper.queryUserAll();
        for (User user : userList) {
            System.out.println(user);
        }
    }

    @Test
    public void insertUser() {
        User user = new User();
        user.setUid(5);
        user.setUname("Test");
        user.setUsex("F");
        this.userMapper.insertUser(user);
        System.out.println(user.getUid());
    }

    @Test
    public void updateUser() {
        User user = new User();
        user.setUid(5);
        user.setUsex("M");
        user.setUname("L");
        this.userMapper.updateUser(user);
    }

    @Test
    public void deleteUserById() {
        this.userMapper.deleteUserById(5);
    }
}
发布了70 篇原创文章 · 获赞 29 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/LOVEYSUXIN/article/details/103474247