Mybatis的增删改查操作

查询语句

selcet, 选择, 查询语句

对以下代码分析:

1
2
3
4
5
6
<mapper namespace="com.lxb.dao.UserMapper">
<select id="getUserList" resultType="com.lxb.pojo.User">
select * from mybatis.user;
</select>

</mapper>
  • id: 就是对应的namespace中的方法名

  • resultType: SQL语句执行的返回值

  • parameterType: 传入参数的类型

再来写一个根据id 查询的例子:

  1. 在接口中添加方法名:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public interface UserMapper {

    // 获取全部用户
    List<User> getUserList();

    // 根据id查询用户
    User getUserById(int id);


    }
  2. UserMapper.xml 文件中添加标签

    1
    2
    3
    <select id="getUserById" parameterType="int" resultType="com.lxb.pojo.User">
    select * from mybatis.user where id = #{id};
    </select>
  3. 在测试类中进行测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Test
    public void getUserById() {
    // 获取SqlSession对象
    SqlSession sqlSession = MybtisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.getUserById(2);
    System.out.println(user);

    // 关闭SqlSession
    sqlSession.close();
    }
  4. 输出为:

    比之前方便太多了!!

插入操作

  1. 在接口中添加方法名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public interface UserMapper {

    // 获取全部用户
    List<User> getUserList();

    // 根据id查询用户
    User getUserById(int id);

    // insert一个用户
    int addUser(User user);

    }
  2. UserMapper.xml 文件中添加标签

    1
    2
    3
    <insert id="addUser" parameterType="com.lxb.pojo.User">
    insert into mybatis.user (id, name, pwd) values (#{id}, #{name}, #{pwd});
    </insert>
  3. 在测试类中进行测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Test
    public void addUser(){
    // 获取SqlSession对象
    SqlSession sqlSession = MybtisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    mapper.addUser(new User(4, "啦啦啦", "89746"));

    // 关闭SqlSession
    sqlSession.close();
    }

    但是结果并没有添加成功:

    这是因为增删改必须要提交事物

  4. 添加提交事务的语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Test
    public void addUser(){
    // 获取SqlSession对象
    SqlSession sqlSession = MybtisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    mapper.addUser(new User(4, "啦啦啦", "89746"));

    // 提交事物
    sqlSession.commit();

    // 关闭SqlSession
    sqlSession.close();
    }

    再进行查询, 就发现成功了, 不再贴出来

修改操作

  1. 在接口中添加方法名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public interface UserMapper {

    // 获取全部用户
    List<User> getUserList();

    // 根据id查询用户
    User getUserById(int id);

    // insert一个用户
    int addUser(User user);

    // 修改用户
    int updateUser(User user);
    }
  2. UserMapper.xml 文件中添加标签

    1
    2
    3
    <update id="updateUser" parameterType="com.lxb.pojo.User">
    update mybatis.user set name = #{name},pwd = #{pwd} where id = #{id};
    </update>
  3. 在测试类中进行测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Test
    public void updateUser() {
    // 获取SqlSession对象
    SqlSession sqlSession = MybtisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    mapper.updateUser(new User(4, "呵呵呵", "74155"));

    // 提交事物
    sqlSession.commit();

    // 关闭SqlSession
    sqlSession.close();
    }
  4. 结果为:

删除操作

  1. 在接口中添加方法名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public interface UserMapper {

    // 获取全部用户
    List<User> getUserList();

    // 根据id查询用户
    User getUserById(int id);

    // insert一个用户
    int addUser(User user);

    // 修改用户
    int updateUser(User user);

    // 删除用户
    int deleteUser(int id);
    }
  2. UserMapper.xml 文件中添加标签

    1
    2
    3
    <delete id="deleteUser" parameterType="int">
    delete from mybatis.user where id = #{id};
    </delete>
  3. 在测试类中进行测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Test
    public void deleteUser(){
    // 获取SqlSession对象
    SqlSession sqlSession = MybtisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    mapper.deleteUser(2);

    // 提交事物
    sqlSession.commit();

    // 关闭SqlSession
    sqlSession.close();
    }
  4. 结果为:

自动提交事物

在使用openSession() 方法时, 可以传入一个布尔值, 来控制是否开启自动提交事物, 源码如下:

1
2
3
SqlSession openSession();

SqlSession openSession(boolean autoCommit);

如果这样设置, 就不需要在添加, 删除, 修改操作后手动提交了:

1
2
3
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession(true);
}

传递MAP

对于插入或者修改操作, 如果一个对象有非常多的字段(属性), 那么按照之前的方法写SQL语句的话就会非常臃肿.

或者说如果想要修改某些属性, 如果不用map的话就需要新建一个对象进行传递, 使用map就解决了整个问题, 需要改动什么就传什么

  1. 在接口中添加方法名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public interface UserMapper {

    // 获取全部用户
    List<User> getUserList();

    // 根据id查询用户
    User getUserById(int id);

    // insert一个用户
    int addUser(User user);

    // 运用万能的map
    int addUser2(Map<String, Object> map);


    // 修改用户
    int updateUser(User user);

    // 删除用户
    int deleteUser(int id);
    }
  2. UserMapper.xml 文件中添加标签

    1
    2
    3
    4
    <!--传递map中的key-->
    <insert id="addUser2" parameterType="map">
    insert into mybatis.user (id, name, pwd) values (#{id}, #{name}, #{pwd});
    </insert>
  3. 在测试类中进行测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @Test
    public void addUser2(){
    SqlSession sqlSession = MybtisUtils.getSqlSession();

    HashMap<String, Object> map = new HashMap<>();
    map.put("id", 4);
    map.put("name", "sdlfew");
    map.put("pwd", "5498764");

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    mapper.addUser2(map);
    sqlSession.commit();

    sqlSession.close();
    }

Map传递参数, 直接在SQL中取出KEY即可 parameterType=”map”

对象传递参数, 直接在SQL中取出对象的属性即可 parameterType=”Object”

多个参数用Map, 或者注解

模糊查询

  1. 在接口中添加方法名

    1
    2
    // 获取全部用户
    List<User> getUserList();
  2. UserMapper.xml 文件中添加标签

    1
    2
    3
    <select id="getUserLike" resultType="com.lxb.pojo.User">
    select * from user where name like #{value};
    </select>
  3. 在测试类中进行测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @Test
    public void getUserLike(){
    SqlSession sqlSession = MybtisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> users = mapper.getUserLike("J%");

    for (User user : users) {
    System.out.println(user);
    }

    sqlSession.close();
    }
  4. 输出为

注意传入参数要加通配符

  • 要么在Java代码中传递

    1
    List<User> users = mapper.getUserLike("J%");
  • 要么在SQL拼接中使用

    1
    select * from user where name like "%"#{value}"%";

ResultMap 结果集映射

问题

解决属性名和字段名不一致的问题

新建一个项目, 验证这个问题

  1. User 类中将pwd 字段改为 password

    1
    2
    3
    private int id;
    private String name;
    private String password;
  2. 查询

    1
    User user = mapper.getUserById(2);
  3. 结果为

    1
    User{id=2, name='John', password='null'}

解决方法: 起别名

  1. 把sql语句改为:

    1
    select id, name, pwd as password from mybatis.user where id = #{id};
  2. 结果集映射

结果集映射的使用

  1. 在UserMapper.xml文件中添加resultMap标签

    1
    2
    3
    4
    5
    <resultMap id="UserMap" type="User">
    <result column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="pwd" property="password"/>
    </resultMap>

    只修改不一样的属性字段也可以

  2. 在select标签中绑定resultMap

    1
    2
    3
    <select id="getUserById" parameterType="int" resultMap="UserMap">
    select * from mybatis.user where id = #{id};
    </select>

    不需要在使用resultType

-------------本文结束感谢您的阅读-------------
可以请我喝杯奶茶吗