• 【MyBatis笔记03】MyBatis实现CRUD增删改查功能


    这篇文章,主要介绍如何通过MyBatis框架实现CRUD增删改查的功能。

    目录

    一、MyBatis增删改查

    1.1、添加数据

    (1)定义Mapper接口

    (2)编写XML映射文件

    (3)测试代码

    (4)如何获取主键ID

    1.2、删除数据

    (1)创建Mapper接口

    (2)编写XML映射文件

    (3)测试代码

    1.3、更新数据

    (1)编写Mapper接口

    (2)编写XML映射文件

    (3)测试代码

    1.4、查询数据

    (1)创建Mapper接口

    (2)定义Mapper映射文件

    (3)测试代码


    一、MyBatis增删改查

    MyBatis作为一个持久层框架,那必然缺少不了对数据库的增删改查操作,下面介绍一下如何通过MyBatis实现增删改查的功能。

    1.1、添加数据

    MyBatis提供了【】标签用于添加数据到数据库里面,【】标签具有如下属性:

    标签属性:

    • id:唯一标识,这个id值必须和Mapper接口中方法名称相同(一个XML映射文件里面不能存在相同的id值)。
    • parameterType:参数类型(这个用于指定方法的参数数据类型)。
    • useGeneratedKeys:是否返回主键ID值(这个属性设置为true后,可以获取到数据库当前添加的数据主键ID值)。
    • keyProperty:这个用于设置数据表中主键自动对应Java实体类中的哪个属性值。
    • keyColumn:这个用于设置数据表中的主键字段名称。
    • databaseId:指定数据库类型,在一个项目中存在多个数据库的时候,如果配置类databaseIdProvider,那么MyBatis可以自动选择执行哪个数据库类型的SQL语句。
    • flushCache:是否刷新缓存。

    上面几个属性是实际开发过程中比较常用的。

    下面通过案例,看下如何插入数据到数据库里面,这里是通过Mapper接口和Mapper映射文件的方式来操作数据库。

    (1)定义Mapper接口

    1. public interface UserMapper {
    2. /**
    3. * 添加数据
    4. * @param user
    5. * @return
    6. */
    7. int insertData(User user);
    8. }

    (2)编写XML映射文件

    1. mapper
    2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4. <mapper namespace="com.mybatis.demo.mapper.UserMapper">
    5. <insert id="insertData" parameterType="com.mybatis.demo.domain.User"
    6. useGeneratedKeys="true" keyProperty="id" keyColumn="id">
    7. insert into user (username, password)
    8. values (#{username}, #{password})
    9. insert>
    10. mapper>

    (3)测试代码

    1. package com.mybatis.demo;
    2. import com.mybatis.demo.domain.User;
    3. import com.mybatis.demo.mapper.UserMapper;
    4. import org.apache.ibatis.io.Resources;
    5. import org.apache.ibatis.session.SqlSession;
    6. import org.apache.ibatis.session.SqlSessionFactory;
    7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    8. import java.io.IOException;
    9. import java.io.InputStream;
    10. /**
    11. * @author ZhuYouBin
    12. * @version 1.0.0
    13. * @Date: 2022/8/8 20:32
    14. * @Description
    15. */
    16. public class InsertTest {
    17. public static void main(String[] args) throws IOException {
    18. // 1、加载配置文件
    19. InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    20. // 2、创建 SqlSessionFactoryBuilder 对象
    21. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    22. // 3、创建 SqlSessionFactory 对象
    23. SqlSessionFactory sqlSessionFactory = builder.build(is);
    24. // 4、创建 SqlSession 对象
    25. SqlSession sqlSession = sqlSessionFactory.openSession();
    26. // 5、获取 UserMapper 接口
    27. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    28. // 6、调用插入方法
    29. User user = new User("mybatis", "123456");
    30. int res = userMapper.insertData(user);
    31. System.out.println("返回值是: res=" + res);
    32. // 8、提交事务
    33. sqlSession.commit();
    34. // 9、关闭流
    35. is.close();
    36. }
    37. }

    注意:MyBatis默认是没有开启自动提交事务的,所以我们在插入数据之后,需要手动的提交事务,这样才能够在数据库中看到新插入的数据。

    运行上面程序,查看数据库表中是否存在新插入的数据,以及控制台的返回值。

    MyBatis中标签的返回值是一个整数类型的值,它表示数据库中受影响的行数,上面的【res=1】就是表示成功插入一条数据。

    (4)如何获取主键ID

    要获取插入数据的主键ID值,就可以利用MyBatis提供的【useGeneratedKeys】、【keyProperty】、【keyColumn】三个属性。

    • 首先需要将【useGeneratedKeys】属性设置为true,告诉mybatis返回主键ID值。
    • 然后通过【keyColumn】属性告诉mybatis数据库中哪个字段是主键。
    • 最后通过【keyProperty】属性,告诉mybatis框架要将主键ID值赋值给实体类对象中哪个属性字段。

    在新插入数据之后,mybatis会将生成的主键ID值通过反射机制赋值给实体类中对应的成员变量。

    需要注意的是,必须在提交事务之后获取,不然获取不到主键ID。

    1.2、删除数据

    MyBatis提供了【】标签,用于删除数据。delete标签具有如下属性:

    标签属性:

    • id:唯一标识,这个id值必须和Mapper接口中方法名称相同(一个XML映射文件里面不能存在相同的id值)。
    • parameterType:参数类型(这个用于指定方法的参数数据类型)。
    • databaseId:指定数据库类型,在一个项目中存在多个数据库的时候,如果配置类databaseIdProvider,那么MyBatis可以自动选择执行哪个数据库类型的SQL语句。
    • flushCache:是否刷新缓存。

    delete删除标签属性比较少。

    (1)创建Mapper接口

    1. package com.mybatis.demo.mapper;
    2. /**
    3. * @author ZhuYouBin
    4. * @version 1.0.0
    5. * @Date: 2022/8/7 15:14
    6. * @Description
    7. */
    8. public interface UserMapper {
    9. /**
    10. * 删除数据
    11. * @param id
    12. * @return
    13. */
    14. int deleteData(Integer id);
    15. }

    (2)编写XML映射文件

    1. mapper
    2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4. <mapper namespace="com.mybatis.demo.mapper.UserMapper">
    5. <delete id="deleteData" parameterType="java.lang.Integer">
    6. delete from user where id = #{id}
    7. delete>
    8. mapper>

    (3)测试代码

    1. package com.mybatis.demo;
    2. import com.mybatis.demo.mapper.UserMapper;
    3. import org.apache.ibatis.io.Resources;
    4. import org.apache.ibatis.session.SqlSession;
    5. import org.apache.ibatis.session.SqlSessionFactory;
    6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    7. import java.io.IOException;
    8. import java.io.InputStream;
    9. /**
    10. * @author ZhuYouBin
    11. * @version 1.0.0
    12. * @Date: 2022/8/8 21:04
    13. * @Description
    14. */
    15. public class DeleteTest {
    16. public static void main(String[] args) throws IOException {
    17. // 1、加载配置文件
    18. InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    19. // 2、创建 SqlSessionFactoryBuilder 对象
    20. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    21. // 3、创建 SqlSessionFactory 对象
    22. SqlSessionFactory sqlSessionFactory = builder.build(is);
    23. // 4、创建 SqlSession 对象
    24. SqlSession sqlSession = sqlSessionFactory.openSession();
    25. // 5、获取 UserMapper 接口
    26. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    27. // 6、删除数据
    28. int res = userMapper.deleteData(3008);
    29. System.out.println("返回值: res=" + res);
    30. // 7、提交事务
    31. sqlSession.commit();
    32. // 8、关闭流
    33. is.close();
    34. }
    35. }

    以上就是删除数据的操作,MyBatis中删除的时候,可以有一个int整数类型的返回值,这个整数表示受影响的记录数,也就是删除了多少条数据。

    1.3、更新数据

    MyBatis提供了【】标签用于更新数据,update标签和insert标签是类似的,并且两个标签具有的属性也是相同的。

    (1)编写Mapper接口

    1. package com.mybatis.demo.mapper;
    2. import com.mybatis.demo.domain.User;
    3. /**
    4. * @author ZhuYouBin
    5. * @version 1.0.0
    6. * @Date: 2022/8/7 15:14
    7. * @Description
    8. */
    9. public interface UserMapper {
    10. /**
    11. * 更新数据
    12. * @param user
    13. * @return
    14. */
    15. int updateData(User user);
    16. }

    (2)编写XML映射文件

    1. mapper
    2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4. <mapper namespace="com.mybatis.demo.mapper.UserMapper">
    5. <update id="updateData" parameterType="com.mybatis.demo.domain.User"
    6. useGeneratedKeys="true" keyColumn="id" keyProperty="id">
    7. update user set username = #{username}, password = #{password}
    8. where id = #{id}
    9. update>
    10. mapper>

    (3)测试代码

    1. package com.mybatis.demo;
    2. import com.mybatis.demo.domain.User;
    3. import com.mybatis.demo.mapper.UserMapper;
    4. import org.apache.ibatis.io.Resources;
    5. import org.apache.ibatis.session.SqlSession;
    6. import org.apache.ibatis.session.SqlSessionFactory;
    7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    8. import java.io.IOException;
    9. import java.io.InputStream;
    10. /**
    11. * @author ZhuYouBin
    12. * @version 1.0.0
    13. * @Date: 2022/8/8 21:13
    14. * @Description
    15. */
    16. public class UpdateTest {
    17. public static void main(String[] args) throws IOException {
    18. // 1、加载配置文件
    19. InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    20. // 2、创建 SqlSessionFactoryBuilder 对象
    21. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    22. // 3、创建 SqlSessionFactory 对象
    23. SqlSessionFactory sqlSessionFactory = builder.build(is);
    24. // 4、创建 SqlSession 对象
    25. SqlSession sqlSession = sqlSessionFactory.openSession();
    26. // 5、获取 UserMapper 接口
    27. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    28. // 6、调用更新方法
    29. User user = new User("test2022", "test2022");
    30. user.setId(3009);
    31. int res = userMapper.updateData(user);
    32. System.out.println("返回值是: res=" + res);
    33. // 7、提交事务
    34. sqlSession.commit();
    35. // 8、关闭流
    36. is.close();
    37. }
    38. }

    运行上面代码,可以查看数据库中id=3009的这条数据记录的变化。

    MyBatis中更新方法也是可以有一个int整数类型的返回值,这个整数表示受影响的记录数,也就是指更新了多少条数据。

    1.4、查询数据

    MyBatis提供了【标签属性:

    • id:唯一标识,这个id值必须和Mapper接口中方法名称相同(一个XML映射文件里面不能存在相同的id值)。
    • parameterType:参数类型(这个用于指定方法的参数数据类型)。
    • resultType:返回结果类型(指定执行SQL语句之后的返回结果类型)。
    • resultMap:返回结果映射类型(当数据库表字段和Java实体类字段不相同时候,可以通过这个进行关系映射)。

    MyBatis框架中,最经常使用,也是实际开发过程里面使用最多的一个操作就是查询,查询通过【