上一篇:1、快速上手第一个Mybatis程序

2.1、准备工作

  1. 由于测试方法执行前都需要获取SqlSession对象和Dao/Mapper接口的代理对象,所以我们将获取两个对象的代码写在 init()方法中,并在 init()上加@Before注解(表示在测试方法执行之前执行);
  2. 由于测试方法执行后都需要提交事务释放资源,所以我们将提交事务和释放资源的代码写在 destroy()方法中,并在 destroy()上加@After注解(表示在测试方法执行之后执行);
  3. 由于在 destroy() 方法中需要关闭SqlSession,在其他测试方法中需要userDao代理 对象,所以将两个对象抽取到方法外提升作用域;
  4. 在测试类中加入如下代码:
private SqlSession sqlSession;
private UserDao userDao;

@Before
public void init() {
    // 1、获取SqlSession对象
    sqlSession = MybatisUtils.getSqlSession();
    // 2、获取UserDao的代理对象
    userDao = sqlSession.getMapper(UserDao.class);
}

@After
public void destroy() {
    // 1、提交事务(Mybatis的插入、删除、更新等采用了事务管理)
    sqlSession.commit();
    // 2、释放资源
    sqlSession.close();
}

2.2、增

  1. 编写Dao/Mapper接口对应的方法

    // 1、增加用户
    int addUser(User user);
    
  2. 编写方法对应的Mapper.xml中的SQL语句

    <!-- 1、添加用户 -->
    <insert id="addUser" parameterType="com.mybatis.pojo.User">
        insert into user (username, password, sex, birthday, address) values (#{username}, #{password}, #{sex}, #{birthday}, #{address})
    </insert>
    
  3. 编写测试方法及进行测试

    @Test
    public void addUser() {
        // 1、执行添加方法
        userDao.addUser(new User(null,"黄瑾晨","h321456","男",new Date(),"遵义市-红花岗区"));
    }
    
  4. 测试结果
    在这里插入图片描述

2.3、删

  1. 编写Dao/Mapper接口对应的方法

    // 2、根据id删除用户
    int deleteUser(int id);
    
  2. 编写方法对应的Mapper.xml中的SQL语句

    <!-- 2、根据id删除用户 -->
    <delete id="deleteUser" parameterType="int">
        delete from user where id = #{id}
    </delete>
    
  3. 编写测试方法及进行测试

    @Test
    public void deleteUser() {
        // 1、执行根据id删除用户方法
        userDao.deleteUser(5);
    }
    
  4. 测试结果
    在这里插入图片描述

2.4、改

  1. 编写Dao/Mapper接口对应的方法

    // 3、更改用户信息
    int updateUser(User user);
    
  2. 编写方法对应的Mapper.xml中的SQL语句

    <!-- 3、更改用户信息 -->
    <update id="updateUser" parameterType="com.mybatis.pojo.User">
        update user set username=#{username},password=#{password},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}
    </update>
    
  3. 编写测试方法及进行测试

    @Test
    public void updateUser() {
        User user = new User();
        user.setId(4);
        user.setUsername("苏安然");
        user.setPassword("s778855");
        user.setSex("男");
        user.setBirthday(new Date());
        user.setAddress("贵阳市-观山湖区");
        // 执行更新用户信息方法
        userDao.updateUser(user);
    }
    
  4. 测试结果
    在这里插入图片描述

2.5、查

  1. 编写Dao/Mapper接口对应的方法

    // 4、查询所有用户信息
    List<User> findAll();
    
    // 5、根据id查找用户信息
    User findById(int id);
    
  2. 编写方法对应的Mapper.xml中的SQL语句

    <!-- 4、查新所有用户信息 -->
    <select id="findAll" resultType="com.mybatis.pojo.User">
        select * from user
    </select>
    
    <!-- 5、根据id查询用户信息 -->
    <select id="findById" parameterType="int" resultType="com.mybatis.pojo.User">
        select * from user where id = #{id}
    </select>
    
  3. 编写测试方法及进行测试

    @Test
    public void findAll() {
        // 1、执行查询所有方法
        List<User> users = userDao.findAll();
        // 2、打印查询结果
        for(User user: users) {
            System.out.println(user);
        }
    }
    
    @Test
    public void findById() {
        // 1、执行根据id查询用户方法
        User users = userDao.findById(3);
        // 2、打印查询结果
        System.out.println(users);
    }
    
  4. 测试结果
    在这里插入图片描述

2.6、使用Map传参

  1. 当实体类参数过多、数据库表字段过多时,我们可以考虑使用Map;

    • 使用Map传参,直接在SQL语句中取出key即可!【parameterType="map"】
    • 使用对象传参,直接在SQL语句中取出对象的属性即可!【parameterType="Object"】
    • 使用一个基本类型传参,可直接在SQL中取到!【parameterType="基本类型" 可以不写这个属性】
    • 多个参数用Map或者注解
  2. 编写Dao/Mapper接口

    // 6、使用Map传参查询用户
    User findByNameAndPwd(Map<String, Object> map);
    
  3. 编写Mapper.xml

    <!-- 6、通过Map传参查询用户信息 -->
    <select id="findByNameAndPwd" parameterType="map" resultType="com.mybatis.pojo.User">
        select * from user where username = #{name} and password = #{pwd}
    </select>
    
  4. 编写测试方法及进行测试

    @Test
    public void findByNameAndPwd() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", "苏瑞韩");
        map.put("pwd", "s653249");
        User user = userDao.findByNameAndPwd(map);
        System.out.println(user);
    }
    
  5. 执行结果
    在这里插入图片描述

2.7、模糊查询

  1. Java代码执行时,传入通配符% %

    List<User> users = userDao.findLike("%苏%");
    
    <!-- 7、根据名称模糊查询 -->
    <select id="findLike" parameterType="string" resultType="com.mybatis.pojo.User">
        select * from user where username like #{value}
    </select>
    
  2. 在SQL拼接中使用通配符(不安全,存在SQL注入问题)

    List<User> users = userDao.findLike("苏");
    
    <!-- 7、根据名称模糊查询 -->
    <select id="findLike" parameterType="string" resultType="com.mybatis.pojo.User">
        select * from user where username like "%"#{value}"%"
    </select>
    
  3. 执行findLike()模糊查询

    @Test
    public void findLike() {
        List<User> users = userDao.findLike("%苏%");
        // List<User> users = userDao.findLike("苏");
        for (User user:users) {
            System.out.println(user);
        }
    }
    
  4. 执行结果
    在这里插入图片描述

2.7、源码

  • UserDao.java

    /**
     * 用户持久层
     */
    public interface UserDao {
    
        // 1、增加用户
        int addUser(User user);
    
        // 2、根据id删除用户
        int deleteUser(int id);
    
        // 3、更改用户信息
        int updateUser(User user);
    
        // 4、查询所有用户信息
        List<User> findAll();
    
        // 5、根据id查找用户信息
        User findById(int id);
    
        // 6、使用Map传参查询用户
        User findByNameAndPwd(Map<String, Object> map);
    
        // 7、模糊查询
        List<User> findLike(String value);
    }
    
  • 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">
    <!-- namespace属性的值为UserDao接口的全限定类名 -->
    <mapper namespace="com.mybatis.dao.UserDao">
        <!-- 1、添加用户 -->
        <insert id="addUser" parameterType="com.mybatis.pojo.User">
            insert into user (username, password, sex, birthday, address) values (#{username}, #{password}, #{sex}, #{birthday}, #{address})
        </insert>
        <!-- 2、根据id删除用户 -->
        <delete id="deleteUser" parameterType="int">
            delete from user where id = #{id}
        </delete>
        <!-- 3、更改用户信息 -->
        <update id="updateUser" parameterType="com.mybatis.pojo.User">
            update user set username=#{username},password=#{password},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}
        </update>
        <!-- 4、查新所有用户信息 -->
        <select id="findAll" resultType="com.mybatis.pojo.User">
            select * from user
        </select>
        <!-- 5、根据id查询用户信息 -->
        <select id="findById" parameterType="int" resultType="com.mybatis.pojo.User">
            select * from user where id = #{id}
        </select>
        <!-- 6、通过Map传参查询用户信息 -->
        <select id="findByNameAndPwd" parameterType="map" resultType="com.mybatis.pojo.User">
            select * from user where username = #{name} and password = #{pwd}
        </select>
        <!-- 7、根据名称模糊查询 -->
        <select id="findLike" parameterType="string" resultType="com.mybatis.pojo.User">
            select * from user where username like #{value}
        </select>
    </mapper>
    
  • UserDaoTest.java

    public class UserDaoTest {
    
        private SqlSession sqlSession;
        private UserDao userDao;
    
        @Before
        public void init() {
            // 1、获取SqlSession对象
            sqlSession = MybatisUtils.getSqlSession();
            // 2、获取UserDao的代理对象
            userDao = sqlSession.getMapper(UserDao.class);
        }
    
        @After
        public void destroy() {
            // 1、提交事务(Mybatis的插入、删除、更新等采用了事务管理)
            sqlSession.commit();
            // 2、释放资源
            sqlSession.close();
        }
    
        @Test
        public void addUser() {
            // 1、执行添加方法
            userDao.addUser(new User(null,"黄瑾晨","h321456","男",new Date(),"遵义市-红花岗区"));
        }
    
        @Test
        public void deleteUser() {
            // 1、执行根据id删除用户方法
            userDao.deleteUser(5);
        }
    
        @Test
        public void updateUser() {
            User user = new User();
            user.setId(4);
            user.setUsername("苏安然");
            user.setPassword("s778855");
            user.setSex("男");
            user.setBirthday(new Date());
            user.setAddress("贵阳市-观山湖区");
            // 执行更新用户信息方法
            userDao.updateUser(user);
        }
    
        @Test
        public void findAll() {
            // 1、执行查询所有方法
            List<User> users = userDao.findAll();
            // 2、打印查询结果
            for(User user: users) {
                System.out.println(user);
            }
        }
    
        @Test
        public void findById() {
            // 1、执行根据id查询用户方法
            User users = userDao.findById(3);
            // 2、打印查询结果
            System.out.println(users);
        }
    
        @Test
        public void findByNameAndPwd() {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("name", "苏瑞韩");
            map.put("pwd", "s653249");
            User user = userDao.findByNameAndPwd(map);
            System.out.println(user);
        }
    
        @Test
        public void findLike() {
            List<User> users = userDao.findLike("%苏%");
            // List<User> users = userDao.findLike("苏");
            for (User user:users) {
                System.out.println(user);
            }
        }
    }
    

    以上为Mybatis简单的CRUD操作!

Q.E.D.


Keep going, believe in yourself, and never give up.