当前位置:   article > 正文

【超详细】MyBatis详解

mybatis

目录

一、什么是MyBatis?

二、MyBatis快速入门

 三、Mapper代理开发

四、MyBatis核心配置文件

五、配置文件完成增删改查

5.1 环境准备

5.2 功能清单列表

5.2.1 查询

5.2.2 添加

5.2.3 修改

5.2.4 删除

六、MyBatis参数传递

七、注解完成增删改查

八、MyBatis的逆向工程

九、分页插件


一、什么是MyBatis?

  • MyBatis是一款优秀的持久层框架,用于简化JDBC开发。
  • MyBatis本来是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github
  • 官网:http://mybatis.org/mybatis-3/zh/index.html

持久层:负责将数据保存到数据库的安那一层代码。

JavaEE三层架构:表现层、业务层、持久层 

框架:框架就是一个半成品软件,是一套可重用的、通用的。软件基础代码模型。

           在框架的基础上构建软件编写更加高效、规范、通用、可扩展。

 

二、MyBatis快速入门

 mybatis-config.xml的基础配置:

userMapper:

 Java代码:

  1. public class MyBatisDemo {
  2. public static void main(String[] args) throws IOException {
  3. //加载mybatis的核心配置文件,获取SqlSessionFactory
  4. String resource = "mybatis-config.xml";
  5. //返回一个字节输入流
  6. InputStream inputStream = Resources.getResourceAsStream(resource);
  7. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  8. //2.获取SqlSession对象,用它来执行sql
  9. SqlSession sqlSession = sqlSessionFactory.openSession();
  10. //3.执行sql
  11. List<User> users = sqlSession.selectList("test.selectAll");
  12. System.out.println(users);
  13. //4.释放资源
  14. sqlSession.close();
  15. }
  16. }

 三、Mapper代理开发

目的:

1. 解决原生方式中的硬编码。

2.简化后期执行SQL

步骤:使用Mapper代理方式完成入门案例

  1. 定义与sql映射文件(.xml文件)同名的Mapper接口,并且将Mapper接口和sql映射文件放置在同一目录
  2. 设置sql映射文件的namesapce属性为Mapper全限定名
  3. 在Mapper接口中定义方法,方法名就是sql映射文件中sql语句中的id,并保持参数类型和返回值类型一致
  4. 编码

  1. /**
  2. * MyBatis 代理开发
  3. */
  4. public class MyBatisDemo2 {
  5. public static void main(String[] args) throws IOException {
  6. //加载mybatis的核心配置文件,获取SqlSessionFactory
  7. String resource = "mybatis-config.xml";
  8. //返回一个字节输入流
  9. InputStream inputStream = Resources.getResourceAsStream(resource);
  10. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  11. //2.获取SqlSession对象,用它来执行sql
  12. SqlSession sqlSession = sqlSessionFactory.openSession();
  13. //3.执行sql
  14. //List<User> users = sqlSession.selectList("test.selectAll");
  15. //3.1获取UserMapper接口的代理对象
  16. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  17. List<User> users = userMapper.selectAll();
  18. System.out.println(users);
  19. //4.释放资源
  20. sqlSession.close();
  21. }
  22. }

四、MyBatis核心配置文件

五、配置文件完成增删改查

5.1 环境准备

  1. 数据库表tb_brand
  2. 实体类Brand
  3. 测试用例
  4. 安装MyBatisX插件 

 

建议安装1.4X版本,该版本下的resultType实体类对象别名不爆红

5.2 功能清单列表

5.2.1 查询

  1. 查询所有数据
  2. 查看详情
  3. 条件查询 

 1. 查询所有数据

       ①编写接口的方法:Mapper接口

  • 参数:无
  • 结果:List<Brand>

        ②Map接口

List<Brand> selectAll();

           编写SQL语句:编写SQL映射文件

  1. <select id="selectById" resultType="brand">
  2. select * from tb_brand;
  3. </select>

        ③执行方法,测试

  1. @Test
  2. public void testSelectAll() throws IOException {
  3. //1.获取SqlSessionFactory
  4. //加载mybatis的核心配置文件,获取SqlSessionFactory
  5. String resource = "mybatis-config.xml";
  6. //返回一个字节输入流
  7. InputStream inputStream = Resources.getResourceAsStream(resource);
  8. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  9. //2. 获取sqlSession对象
  10. SqlSession sqlSession = sqlSessionFactory.openSession();
  11. //3. 获取Mapper接口的代理对象
  12. BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
  13. //4. 执行方法
  14. List<Brand> brands = brandMapper.selectAll();
  15. System.out.println(brands);
  16. //5. 释放资源
  17. sqlSession.close();
  18. }

解决数据库表的列名(brand_name)与实体类(brandName)的属性名不匹配方案:

数据库表的字段名称和实体类属性名称不一样,则不能自动封装数据
方案一:起别名:对不一样的列名起别名,让别名和实体类的属性名也一样
               缺点:每次查询都要定义一次别名

  1. <select id="selectAll" resultType="brand">
  2.      select id, brand_name as brandName, company_name as companyName,
  3. ordered,description, status
  4.      from tb_brand;
  5. </select>

               改进:
               采用 sql片段

  1. <sql id="brand_column">
  2.     id, brand_name as brandName, company_name as companyName,
  3. ordered, description, status
  4. </sql>
  5. <select id="selectAll" resultType="brand">
  6.     select
  7.     <include refid="brand_column"></include>
  8.     from tb_brand;
  9. </select>

                缺点:不灵活 

        改进:

                使用resultMap

 resultMap:id为唯一标识
                 1.定义<resultMap>标签
                 2.<select>标签中使用resultMap属性来替换resultType属性

  • id:完成主键字段的映射
  • column:数据库表的列名
  •  property:对应的实体类属性名 
  1. <resultMap id="brandResultMap" type="brand">
  2.      <result column="brand_name" property="brandName"/>
  3.      <result column="compnamy_name" property="companyName"/>
  4. </resultMap>
  5.  <select id="selectAll" resultMap="brandResultMap">
  6.      select *
  7.      from tb_brand;
  8.  </select>

方案二:在mybatis-config.xml中设置<configuration>中的<setting>标签的value值为true

  •  是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。
  1. <settings>
  2.    <setting name="mapUnderscoreToCamelCase" value="true"/>
  3. </settings>
  1. <!--
  2. namespace:名称空间
  3. -->
  4. <mapper namespace="com.itheima.mapper.BrandMapper">
  5. <!--
  6. 数据库表的字段名称和实体类属性名称不一样,则不能自动封装数据
  7. *方案一:起别名:对不一样的列名起别名,让别名和实体类的属性名也一样
  8. *缺点:每次查询都要定义一次别名
  9. <select id="selectAll" resultType="brand">
  10. select id, brand_name as brandName, company_name as companyName, ordered, description, status
  11. from tb_brand;
  12. </select>
  13. *改进:
  14. sql片段
  15. <sql id="brand_column">
  16. id, brand_name as brandName, company_name as companyName, ordered, description, status
  17. </sql>
  18. <select id="selectAll" resultType="brand">
  19. select
  20. <include refid="brand_column"></include>
  21. from tb_brand;
  22. </select>
  23. *缺点:不灵活
  24. *resultMap:id为唯一标识
  25. 1.定义<resultMap>标签
  26. 2.<select>标签中使用resultMap属性来替换resultType属性
  27. <resultMap id="brandResultMap" type="brand">
  28. id:完成主键字段的映射
  29. column:数据库表的列名
  30. property:对应的实体类属性名
  31. <result column="brand_name" property="brandName"/>
  32. <result column="compnamy_name" property="companyName"/>
  33. </resultMap>
  34. <select id="selectAll" resultMap="brandResultMap">
  35. select *
  36. from tb_brand;
  37. </select>
  38. *方案二:在mybatis-config.xml中设置<configuration>中的<setting>标签的value值为true
  39. 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。
  40. <settings>
  41. <setting name="mapUnderscoreToCamelCase" value="faulse"/>
  42. </settings>
  43. -->
  44. <resultMap id="brandResultMap" type="brand">
  45. <result column="brand_name" property="brandName"/>
  46. <!--column:数据库表的列名 property:对应的实体类属性名-->
  47. <result column="compnamy_name" property="companyName"/>
  48. </resultMap>
  49. <select id="selectAll" resultMap="brandResultMap">
  50. select *
  51. from tb_brand;
  52. </select>
  53. <!-- <select id="selectAll" resultType="brand">
  54. select *
  55. from tb_brand;
  56. </select>-->
  57. </mapper>

2. 查看详情

    ①编写接口的方法:Mapper接口

  • 参数:id
  • 结果:Brand对象

        ②Map接口

Brand selectById(int id);

           编写SQL语句:编写SQL映射文件

  1. <select id="selectAllById" resultMap="brandResultMap">
  2. select *
  3. from tb_brand where id = #{id};
  4. </select>
*参数占位符
    1. #{}:将其替换为 ? ,为了防止SQL注入
    2. ${}:拼SQL,会存在SQl注入
    3. 使用时机:
        *参数传递时,用#{}
        *表名或者列名不固定的情况下,${}一定会存在SQL注入问题

 * 参数类型:parameterType:用于设置参数类型,可以省略
 * 特殊字符处理:
      1.转义字符(eg:'&lt;'转义为'<')
      2.CDATA区(CD+enter,CD提示,将符号写在括号内)
        <![CDATA[

        ]]>

 ③执行方法,测试

  1. <resultMap id="brandResultMap" type="brand">
  2. <result column="brand_name" property="brandName"/>
  3. <!--column:数据库表的列名 property:对应的实体类属性名-->
  4. <result column="company_name" property="companyName"/>
  5. </resultMap>
  6. <!--
  7. *参数占位符
  8. 1. #{}:将其替换为 ? ,为了防止SQL注入
  9. 2. ${}:拼SQL,会存在SQl注入
  10. 3. 使用时机:
  11. *参数传递时,用#{}
  12. *表名或者列名不固定的情况下,${}一定会存在SQL注入问题
  13. * 参数类型:parameterType:可以省略
  14. *特殊字符处理:
  15. 1.转义字符(eg:'&lt;'转义为'<')
  16. 2.CDATA区(CD+enter,将符号写在括号内)
  17. -->
  18. <select id="selectAllById" resultMap="brandResultMap">
  19. select *
  20. from tb_brand where id = #{id};
  21. </select>

3. 条件查询

  • 多条件查询:

    ①编写接口的方法:

  • 参数:所有查询条件
  • 结果:List<Brand>

     ②编写SQL语句

散装参数(Mapper接口):

List<Brand> selectByCondition(@Param("status") int status, @Param("companyName") String companyName, @Param("brandName") String brandName);

  对象参数(Mapper接口):

List<Brand> selectByCondition(Brand brand);

   map集合(Mapper接口): 

List<Brand> selectByCondition(Map map);

  SQL语句:编写SQL映射文件

  1. <select id="selectByCondition" resultMap="brandResultMap">
  2. select *
  3. from tb_brand
  4. where status = #{status}
  5. and company_name like #{companyName}
  6. and brand_name like #{brandName}
  7. </select>

③执行方法,测试

**参数接收:
*  1.散装参数(如果方法中有多个参数,需要使用@Param(“SQL参数占位符名称”)
  1. @Test
  2. public void testSelectByCondition() throws IOException {
  3. //接收参数:
  4. int status = 1;
  5. String companyName = "华为";
  6. String brandName = "华为";
  7. //处理参数
  8. companyName = "%" + companyName + "%";
  9. brandName = "%" + brandName + "%";
  10. //1.获取SqlSessionFactory
  11. //加载mybatis的核心配置文件,获取SqlSessionFactory
  12. String resource = "mybatis-config.xml";
  13. //返回一个字节输入流
  14. InputStream inputStream = Resources.getResourceAsStream(resource);
  15. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  16. //2. 获取sqlSession对象
  17. SqlSession sqlSession = sqlSessionFactory.openSession();
  18. //3. 获取Mapper接口的代理对象
  19. BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
  20. //4. 执行方法
  21. List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName);
  22. System.out.println(brands);
  23. //5. 释放资源
  24. sqlSession.close();
  25. }
*  2.对象参数
  1. @Test
  2. public void testSelectByCondition() throws IOException {
  3. //接收参数:
  4. int status = 1;
  5. String companyName = "华为";
  6. String brandName = "华为";
  7. //处理参数
  8. companyName = "%" + companyName + "%";
  9. brandName = "%" + brandName + "%";
  10. //1.获取SqlSessionFactory
  11. //加载mybatis的核心配置文件,获取SqlSessionFactory
  12. String resource = "mybatis-config.xml";
  13. //返回一个字节输入流
  14. InputStream inputStream = Resources.getResourceAsStream(resource);
  15. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  16. //2. 获取sqlSession对象
  17. SqlSession sqlSession = sqlSessionFactory.openSession();
  18. //3. 获取Mapper接口的代理对象
  19. BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
  20. //4. 执行方法
  21. List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName);
  22. System.out.println(brands);
  23. //5. 释放资源
  24. sqlSession.close();
  25. }
*  3.map集合参数
  1. @Test
  2. public void testSelectByCondition() throws IOException {
  3. //接收参数:
  4. int status = 1;
  5. String companyName = "华为";
  6. String brandName = "华为";
  7. //处理参数
  8. companyName = "%" + companyName + "%";
  9. brandName = "%" + brandName + "%";
  10. //封装对象
  11. Map map = new HashMap();
  12. map.put("status",status);
  13. map.put("companyName",companyName);
  14. map.put("brandName",brandName);
  15. //1.获取SqlSessionFactory
  16. //加载mybatis的核心配置文件,获取SqlSessionFactory
  17. String resource = "mybatis-config.xml";
  18. //返回一个字节输入流
  19. InputStream inputStream = Resources.getResourceAsStream(resource);
  20. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  21. //2. 获取sqlSession对象
  22. SqlSession sqlSession = sqlSessionFactory.openSession();
  23. //3. 获取Mapper接口的代理对象
  24. BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
  25. //4. 执行方法
  26. List<Brand> brands = brandMapper.selectByCondition(map);
  27. System.out.println(brands);
  28. //5. 释放资源
  29. sqlSession.close();
  30. }

  • 动态条件查询:

  多条件-动态条件查询

    ①编写接口的方法:Mapper接口

                参数:所有查询条件

                结果:List<Brand>

     ②Map接口

List<Brand> selectByCondition(@Param("status") int status, @Param("companyName") String companyName, @Param("brandName") String brandName);

           编写SQL语句:编写SQL映射文件

  1. <select id="selectByCondition" resultMap="brandResultMap">
  2. select *
  3. from tb_brand
  4. <where>
  5. <if test="status != null">
  6. status = #{status}
  7. </if>
  8. <if test="companyName != null and companyName!= ''">
  9. and company_name like #{companyName}
  10. </if>
  11. <if test="brandName != null and brandName!= ''">
  12. and brand_name like #{brandName}
  13. </if>
  14. </where>
  15. </select>

      ③执行方法,测试

多条件-动态条件查询
    if:条件判断
        test:逻辑表达式
    问题:只有没有第一个条件时会出现SQL语法错误
        *恒等式:添加"1=1"并将后续语句改为条件一致,构造SQL
  1. select *
  2. from tb_brand
  3. where 1 = 1
  4. <if test="status != null">
  5. and status = #{status}
  6. </if>
  7. <if test="companyName != null and companyName!= ''">
  8. and company_name like #{companyName}
  9. </if>
  10. <if test="brandName != null and brandName!= ''">
  11. and brand_name like #{brandName}
  12. </if>
      *用标签<where> 替换 where 关键字
  1. select *
  2. from tb_brand
  3. <where>
  4. <if test="status != null">
  5. status = #{status}
  6. </if>
  7. <if test="companyName != null and companyName!= ''">
  8. and company_name like #{companyName}
  9. </if>
  10. <if test="brandName != null and brandName!= ''">
  11. and brand_name like #{brandName}
  12. </if>
  13. </where>
  1. @Test
  2. public void testSelectByCondition() throws IOException {
  3. //接收参数:
  4. int status = 1;
  5. String companyName = "华为";
  6. String brandName = "华为";
  7. //处理参数
  8. companyName = "%" + companyName + "%";
  9. brandName = "%" + brandName + "%";
  10. //封装对象
  11. /* Brand brand = new Brand();
  12. brand.setStatus(status);
  13. brand.setCompanyName(companyName);
  14. brand.setBrandName(brandName);*/
  15. Map map = new HashMap();
  16. map.put("status",status);
  17. map.put("companyName",companyName);
  18. map.put("brandName",brandName);
  19. //1.获取SqlSessionFactory
  20. //加载mybatis的核心配置文件,获取SqlSessionFactory
  21. String resource = "mybatis-config.xml";
  22. //返回一个字节输入流
  23. InputStream inputStream = Resources.getResourceAsStream(resource);
  24. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  25. //2. 获取sqlSession对象
  26. SqlSession sqlSession = sqlSessionFactory.openSession();
  27. //3. 获取Mapper接口的代理对象
  28. BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
  29. //4. 执行方法
  30. // List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName);
  31. // List<Brand> brands = brandMapper.selectByCondition(brand);
  32. List<Brand> brands = brandMapper.selectByCondition(map);
  33. System.out.println(brands);
  34. //5. 释放资源
  35. sqlSession.close();
  36. }

单条件-动态条件查询

  • 从多个条件中选择一个
  • choose(when,otherwise):选择,类似于Java中的switch语句

    ①编写接口的方法:Mapper接口

  • 参数:所有查询条件
  • 结果:List<Brand>

     ②Mapper接口

List<Brand> selectByConditionSingle(Brand brand);

           编写SQL语句:编写SQL映射文件

  1. <select id="selectByConditionSingle" resultMap="brandResultMap">
  2. <!-- select *-->
  3. <!-- from tb_brand-->
  4. <!-- where-->
  5. <!-- <choose>&lt;!&ndash;相当于switch&ndash;&gt;-->
  6. <!-- <when test="status != null">-->
  7. <!-- status = #{status}-->
  8. <!-- </when>&lt;!&ndash;相当于case&ndash;&gt;-->
  9. <!-- <when test="companyName != null and companyName!= ''">-->
  10. <!-- company_name like #{companyName}-->
  11. <!-- </when>&lt;!&ndash;相当于case&ndash;&gt;-->
  12. <!-- <when test="brandName != null and brandName!= ''">-->
  13. <!-- brand_name like #{brandName}-->
  14. <!-- </when>&lt;!&ndash;相当于case&ndash;&gt;-->
  15. <!-- <otherwise>&lt;!&ndash;相当于default&ndash;&gt;-->
  16. <!-- 1 = 1-->
  17. <!-- </otherwise>-->
  18. <!-- </choose>-->
  19. <!-- </select>-->
  20. select *
  21. from tb_brand
  22. <where>
  23. <choose><!--相当于switch-->
  24. <when test="status != null">
  25. status = #{status}
  26. </when><!--相当于case-->
  27. <when test="companyName != null and companyName!= ''">
  28. company_name like #{companyName}
  29. </when><!--相当于case-->
  30. <when test="brandName != null and brandName!= ''">
  31. brand_name like #{brandName}
  32. </when><!--相当于case-->
  33. </choose>
  34. </where>
  35. </select>

      ③执行方法,测试

单条件-动态条件查询
    choose(when,otherwise):选择,类似于Java中的switch语句
        test:逻辑表达式
    问题:只有没有条件时会出现SQL语法错误
        *恒等式:添加"1=1"构造SQL使之符合语法。
  1. <select id="selectByConditionSingle" resultMap="brandResultMap">
  2. select *
  3. from tb_brand
  4. where
  5. <choose><!--相当于switch-->
  6. <when test="status != null">
  7. status = #{status}
  8. </when><!--相当于case-->
  9. <when test="companyName != null and companyName!= ''">
  10. company_name like #{companyName}
  11. </when><!--相当于case-->
  12. <when test="brandName != null and brandName!= ''">
  13. brand_name like #{brandName}
  14. </when><!--相当于case-->
  15. <otherwise><!--相当于default-->
  16. 1 = 1
  17. </otherwise>
  18. </choose>
  19. </select>
      *用标签<where> 替换 where 关键字
  1. <select id="selectByConditionSingle" resultMap="brandResultMap">
  2. select *
  3. from tb_brand
  4. <where>
  5. <choose><!--相当于switch-->
  6. <when test="status != null">
  7. status = #{status}
  8. </when><!--相当于case-->
  9. <when test="companyName != null and companyName!= ''">
  10. company_name like #{companyName}
  11. </when><!--相当于case-->
  12. <when test="brandName != null and brandName!= ''">
  13. brand_name like #{brandName}
  14. </when><!--相当于case-->
  15. </choose>
  16. </where>
  17. </select>
  1. @Test
  2. public void testSelectByCondition() throws IOException {
  3. //接收参数:
  4. int status = 1;
  5. String companyName = "华为";
  6. String brandName = "华为";
  7. //处理参数
  8. companyName = "%" + companyName + "%";
  9. brandName = "%" + brandName + "%";
  10. //封装对象
  11. Brand brand = new Brand();
  12. //brand.setStatus(status);
  13. brand.setCompanyName(companyName);
  14. //brand.setBrandName(brandName);
  15. //1.获取SqlSessionFactory
  16. //加载mybatis的核心配置文件,获取SqlSessionFactory
  17. String resource = "mybatis-config.xml";
  18. //返回一个字节输入流
  19. InputStream inputStream = Resources.getResourceAsStream(resource);
  20. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  21. //2. 获取sqlSession对象
  22. SqlSession sqlSession = sqlSessionFactory.openSession();
  23. //3. 获取Mapper接口的代理对象
  24. BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
  25. //4. 执行方法
  26. // List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName);
  27. // List<Brand> brands = brandMapper.selectByCondition(brand);
  28. List<Brand> brands = brandMapper.selectByCondition(map);
  29. System.out.println(brands);
  30. //5. 释放资源
  31. sqlSession.close();
  32. }

5.2.2 添加

    ①编写接口的方法:Mapper接口

void add(Brand brand);
  • 参数:除id之外的所有数据
  • 结果:void

     ②编写SQL语句、编写SQL映射文件

  1. <insert id="add">
  2. insert into tb_brand (brand_name, company_name, ordered, description, status)
  3. values (#{brandName},#{companyName},#{ordered},#{description},#{status});
  4. </insert>

      ③执行方法,测试

  1. @Test
  2. public void testadd() throws IOException {
  3. //接收参数:
  4. int status = 1;
  5. String companyName = "波导手机";
  6. String brandName = "波导";
  7. String description = "手机中的战斗机";
  8. int ordered = 100;
  9. //封装对象
  10. Brand brand = new Brand();
  11. brand.setStatus(status);
  12. brand.setCompanyName(companyName);
  13. brand.setBrandName(brandName);
  14. brand.setDescription(description);
  15. brand.setOrdered(ordered);
  16. //1.获取SqlSessionFactory
  17. //加载mybatis的核心配置文件,获取SqlSessionFactory
  18. String resource = "mybatis-config.xml";
  19. //返回一个字节输入流
  20. InputStream inputStream = Resources.getResourceAsStream(resource);
  21. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  22. //2. 获取sqlSession对象
  23. // SqlSession sqlSession = sqlSessionFactory.openSession();
  24. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  25. //3. 获取Mapper接口的代理对象
  26. BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
  27. //4. 执行方法
  28. brandMapper.add(brand);
  29. //提交事务
  30. // sqlSession.commit();
  31. //5. 释放资源
  32. sqlSession.close();
  33. }

 Mybatis事务

openSession():默认开启事务,进行增删改后需要使用sqlSession.commit();手动提交事务

openSession(true):可以设置为自动提交事务(默认为false:手动提交事务)

****添加---主键返回 ****

在数据添加成功后,需要获取插入数据库数据的主键的值

比如:添加订单和订单项

           1.添加订单

            2.添加订单项,订单项中需要设置所属订单的id

  1. <insert id="add" useGeneratedKeys="true" keyProperty="id">
  2. insert into tb_brand (brand_name, company_name, ordered, description, status)
  3. values (#{brandName},#{companyName},#{ordered},#{description},#{status});
  4. </insert>

5.2.3 修改

  1. 修改所有字段
  2. 修改动态字段

1.修改所有字段

 ①编写接口的方法:Mapper接口

void update(Brand brand);
  • 参数:所有数据
  • 结果:void

  ②编写SQL语句:编写SQL映射文件

  1. <update id="update">
  2. update tb_brand
  3. set brand_name = #{brandName},
  4. company_name = #{companyName},
  5. ordered = #{ordered},
  6. description = #{description},
  7. status = #{status}
  8. where id = #{id};
  9. </update>

      ③执行方法,测试

  1. /**
  2. * 修改
  3. * @throws IOException
  4. */
  5. @Test
  6. public void testUpdate() throws IOException {
  7. //接收参数:
  8. int status = 1;
  9. String companyName = "波导手机";
  10. String brandName = "波导";
  11. String description = "波导手机,手机中的战斗机";
  12. int ordered = 200;
  13. int id = 5;
  14. //封装对象
  15. Brand brand = new Brand();
  16. brand.setStatus(status);
  17. brand.setCompanyName(companyName);
  18. brand.setBrandName(brandName);
  19. brand.setDescription(description);
  20. brand.setOrdered(ordered);
  21. brand.setId(id);
  22. //1.获取SqlSessionFactory
  23. //加载mybatis的核心配置文件,获取SqlSessionFactory
  24. String resource = "mybatis-config.xml";
  25. //返回一个字节输入流
  26. InputStream inputStream = Resources.getResourceAsStream(resource);
  27. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  28. //2. 获取sqlSession对象
  29. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  30. //3. 获取Mapper接口的代理对象
  31. BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
  32. //4. 执行方法
  33. int count = brandMapper.update(brand);
  34. System.out.println(count);
  35. //5. 释放资源
  36. sqlSession.close();
  37. }

2. 修改动态字段

 ①编写接口的方法:Mapper接口

void update(Brand brand);
  • 参数:所有数据
  • 结果:void

  ②编写SQL语句:编写SQL映射文件

  1. <update id="update">
  2. update tb_brand
  3. <set>
  4. <if test="brandName != null and brandName!= ''">
  5. brand_name = #{brandName},
  6. </if>
  7. <if test="companyName != null and brandName!= ''">
  8. company_name = #{companyName},
  9. </if>
  10. <if test="ordered != null">
  11. ordered = #{ordered},
  12. </if>
  13. <if test="description != null and brandName!= ''">
  14. description = #{description},
  15. </if>
  16. <if test="status != null">
  17. status = #{status}
  18. </if>
  19. </set>
  20. where id = #{id};
  21. </update>

      ③执行方法,测试

  1. /**
  2. * 修改动态字段
  3. * @throws IOException
  4. */
  5. @Test
  6. public void testUpdate() throws IOException {
  7. //接收参数:
  8. int status = 0;
  9. String companyName = "波导手机";
  10. String brandName = "波导";
  11. String description = "波导手机,手机中的战斗机";
  12. int ordered = 200;
  13. int id = 7;
  14. //封装对象
  15. Brand brand = new Brand();
  16. brand.setStatus(status);
  17. // brand.setCompanyName(companyName);
  18. // brand.setBrandName(brandName);
  19. // brand.setDescription(description);
  20. // brand.setOrdered(ordered);
  21. brand.setId(id);
  22. //1.获取SqlSessionFactory
  23. //加载mybatis的核心配置文件,获取SqlSessionFactory
  24. String resource = "mybatis-config.xml";
  25. //返回一个字节输入流
  26. InputStream inputStream = Resources.getResourceAsStream(resource);
  27. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  28. //2. 获取sqlSession对象
  29. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  30. //3. 获取Mapper接口的代理对象
  31. BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
  32. //4. 执行方法
  33. int count = brandMapper.update(brand);
  34. System.out.println(count);
  35. //5. 释放资源
  36. sqlSession.close();
  37. }

5.2.4 删除

  1. 删除一个
  2. 批量删除 

1. 删除一个   

 ①编写接口的方法:Mapper接口

void update(Brand brand);
  • 参数:id
  • 结果:void

  ②编写SQL语句:编写SQL映射文件

  1. <select id="deleteById">
  2. delete from tb_brand where id = #{id};
  3. </select>

      ③执行方法,测试

  1. /**
  2. * 根据Id删除一个
  3. * @throws IOException
  4. */
  5. @Test
  6. public void testDeleteById() throws IOException {
  7. //接收参数:
  8. int id = 9;
  9. //1.获取SqlSessionFactory
  10. //加载mybatis的核心配置文件,获取SqlSessionFactory
  11. String resource = "mybatis-config.xml";
  12. //返回一个字节输入流
  13. InputStream inputStream = Resources.getResourceAsStream(resource);
  14. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  15. //2. 获取sqlSession对象
  16. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  17. //3. 获取Mapper接口的代理对象
  18. BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
  19. //4. 执行方法
  20. brandMapper.deleteById(id);
  21. //5. 释放资源
  22. sqlSession.close();
  23. }

 2. 批量删除   

 ①编写接口的方法:Mapper接口

void update(Brand brand);
  • 参数:id数组
  • 结果:void

  ②编写SQL语句:编写SQL映射文件

  1. <!--
  2. Mybatis会将数组参数封装为一个Map集合。
  3. *默认:array = 数组
  4. *可以使用@Param注解改变map集合的默认key名称
  5. -->
  6. <!-- <delete id="deleteByIds">
  7. delete from tb_brand where id
  8. in
  9. /*
  10. **separator:分隔符
  11. **open:循环开始前的字符
  12. **close:循环结束后的字符
  13. */
  14. <foreach collection="ids" item="id" separator="," open="(" close=")">
  15. #{id}
  16. </foreach>;
  17. </delete>-->
  18. <delete id="deleteByIds">
  19. delete from tb_brand where id
  20. in
  21. /*
  22. **separator:分隔符
  23. **open:循环开始前的字符
  24. **close:循环结束后的字符
  25. */
  26. <foreach collection="array" item="id" separator="," open="(" close=")">
  27. #{id}
  28. </foreach>;
  29. </delete>

      ③执行方法,测试

  1. /**
  2. * 根据Id删除一个
  3. * @throws IOException
  4. */
  5. @Test
  6. public void testDeleteById() throws IOException {
  7. //接收参数:
  8. int id = 9;
  9. //1.获取SqlSessionFactory
  10. //加载mybatis的核心配置文件,获取SqlSessionFactory
  11. String resource = "mybatis-config.xml";
  12. //返回一个字节输入流
  13. InputStream inputStream = Resources.getResourceAsStream(resource);
  14. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  15. //2. 获取sqlSession对象
  16. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  17. //3. 获取Mapper接口的代理对象
  18. BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
  19. //4. 执行方法
  20. brandMapper.deleteById(id);
  21. //5. 释放资源
  22. sqlSession.close();
  23. }

注意:

Mybatis会将数组参数封装为一个Map集合。
    *默认:array = 数组
    *可以使用@Param注解改变map集合的默认key名称
  1. delete from tb_brand where id
  2. in
  3. /*
  4. **separator:分隔符
  5. **open:循环开始前的字符
  6. **close:循环结束后的字符
  7. */
  8. <foreach collection="ids" item="id" separator="," open="(" close=")">
  9. #{id}
  10. </foreach>;

六、MyBatis参数传递

七、注解完成增删改查

使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。

选择何种方式来配置映射,以及是否应该要统一映射语句定义的形式,完全取决于你和你的团队。 换句话说,永远不要拘泥于一种方式,你可以很轻松地在基于注解和 XML 的语句映射方式间自由移植和切换。

八、MyBatis的逆向工程

 自动生成Mapper接口和对应的实体类以及映射文件

generatorConfig.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE generatorConfiguration
  3. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  4. <generatorConfiguration>
  5. <!--
  6. targetRuntime: 执行生成的逆向工程的版本
  7. MyBatis3Simple: 生成基本的CRUD(清新简洁版)
  8. MyBatis3: 生成带条件的CRUD(奢华尊享版)
  9. -->
  10. <context id="DB2Tables" targetRuntime="MyBatis3">
  11. <!-- 数据库的连接信息 -->
  12. <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"
  13. userId="root" password="4">
  14. </jdbcConnection>
  15. <!-- javaBean的生成策略-->
  16. <javaModelGenerator targetPackage="com.itguigu.mybatis.pojo" targetProject=".\src\main\java">
  17. <property name="enableSubPackages" value="true" />
  18. <property name="trimStrings" value="true" />
  19. </javaModelGenerator>
  20. <!-- SQL映射文件的生成策略 -->
  21. <sqlMapGenerator targetPackage="com.itguigu.mybatis.mapper" targetProject=".\src\main\resources">
  22. <property name="enableSubPackages" value="true" />
  23. </sqlMapGenerator>
  24. <!-- Mapper接口的生成策略 -->
  25. <javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.mybatis.mapper" targetProject=".\src\main\java">
  26. <property name="enableSubPackages" value="true" />
  27. </javaClientGenerator>
  28. <!-- 逆向分析的表 -->
  29. <!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName -->
  30. <!-- domainObjectName属性指定生成出来的实体类的类名 -->
  31. <table tableName="t_emp" domainObjectName="Emp"/>
  32. <table tableName="t_dept" domainObjectName="Dept"/>
  33. </context>
  34. </generatorConfiguration>

mybatis-config.xml:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <properties resource="jdbc.properties"></properties>
  7. <settings>
  8. <setting name="mapUnderscoreToCamelCase" value="true"/>
  9. </settings>
  10. <typeAliases>
  11. <package name="com.itguigu.mybatis.pojo"/>
  12. </typeAliases>
  13. <environments default="development">
  14. <environment id="development">
  15. <transactionManager type="JDBC"/>
  16. <dataSource type="POOLED">
  17. <property name="driver" value="${jdbc.driver}"/>
  18. <property name="url" value="${jdbc.url}"/>
  19. <property name="username" value="${jdbc.username}"/>
  20. <property name="password" value="${jdbc.password}"/>
  21. </dataSource>
  22. </environment>
  23. </environments>
  24. <!--引入mybatis的映射文件-->
  25. <mappers>
  26. <package name="com.itguigu.mybatis.mapper"/>
  27. </mappers>
  28. </configuration>

pom文件中引入的依赖:

  1. <packaging>jar</packaging>
  2. <!--mybatis核心jar包-->
  3. <dependencies>
  4. <dependency>
  5. <groupId>org.mybatis</groupId>
  6. <artifactId>mybatis</artifactId>
  7. <version>3.5.7</version>
  8. </dependency>
  9. <!-- junit测试 -->
  10. <dependency>
  11. <groupId>junit</groupId>
  12. <artifactId>junit</artifactId>
  13. <version>4.12</version>
  14. <scope>test</scope>
  15. </dependency>
  16. <!-- log4j日志 -->
  17. <dependency>
  18. <groupId>log4j</groupId>
  19. <artifactId>log4j</artifactId>
  20. <version>1.2.17</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>mysql</groupId>
  24. <artifactId>mysql-connector-java</artifactId>
  25. <version>8.0.16</version>
  26. </dependency>
  27. </dependencies>
  28. <!-- 控制Maven在构建过程中相关配置 -->
  29. <build>
  30. <!-- 构建过程中用到的插件 -->
  31. <plugins>
  32. <!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 -->
  33. <plugin>
  34. <groupId>org.mybatis.generator</groupId>
  35. <artifactId>mybatis-generator-maven-plugin</artifactId>
  36. <version>1.3.0</version>
  37. <!-- 插件的依赖 -->
  38. <dependencies>
  39. <!-- 逆向工程的核心依赖 -->
  40. <dependency>
  41. <groupId>org.mybatis.generator</groupId>
  42. <artifactId>mybatis-generator-core</artifactId>
  43. <version>1.3.2</version>
  44. </dependency>
  45. <!-- MySQL驱动 -->
  46. <dependency>
  47. <groupId>mysql</groupId>
  48. <artifactId>mysql-connector-java</artifactId>
  49. <version>8.0.16</version>
  50. </dependency>
  51. </dependencies>
  52. </plugin>
  53. </plugins>
  54. </build>

然后点击Idea中右侧Maven中的mybatis-generator插件即可自动生成。

九、分页插件

limit index,pageSize

index:当前页的起始索引,index=(pageNum-1)*pageSize

pageSize:每页显示条数

pageNum:当前页的页码

count:总记录数

totalPage:总页数

if(count%pageSize !=0){

        totalPage+=1;

}

导入依赖:

  1. <dependency>
  2. <groupId>com.github.pagehelper</groupId>
  3. <artifactId>pagehelper</artifactId>
  4. <version>5.2.0</version>
  5. </dependency>

同时还需要在核心配置文件中配置:

  1. <plugins>
  2. <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
  3. </plugins>

查询功能开启前要开启分页功能: 

Page<Object> page = PageHelper.startPage(1, 4);

分页数据:

PageInfo<Emp> pageInfo = new PageInfo<>(emps, 5);

分页相关数据:

PageInfo{
pageNum=8, pageSize=4, size=2, startRow=29, endRow=30, total=30, pages=8,
list=Page{count=true, pageNum=8, pageSize=4, startRow=28, endRow=32, total=30,
pages=8, reasonable=false, pageSizeZero=false},
prePage=7, nextPage=0, isFirstPage=false, isLastPage=true, hasPreviousPage=true,
hasNextPage=false, navigatePages=5, navigateFirstPage4, navigateLastPage8,
navigatepageNums=[4, 5, 6, 7, 8]
}
pageNum:当前页的页码
pageSize:每页显示的条数
size:当前页显示的真实条数
total:总记录数
pages:总页数
prePage:上一页的页码
nextPage:下一页的页码
isFirstPage/isLastPage:是否为第一页/最后一页
hasPreviousPage/hasNextPage:是否存在上一页/下一页
navigatePages:导航分页的页码数
navigatepageNums:导航分页的页码,[1,2,3,4,5]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/114905
推荐阅读
相关标签
  

闽ICP备14008679号