当前位置:   article > 正文

映射文件之resultMap_自定义结果映射规则_mapunderscoretocamelcase配置

mapunderscoretocamelcase配置

映射文件之resultMap_自定义结果映射规则

映射分为自动映射和自定义映射:
  1. 自动映射:(对于自动映射可以分为两种情况:)

    • 全局Setting设置 :

      ①: autoMappingBehavior设置开启对象自动映射, 其默认值是partial(部分的), 就是单表的时候开启自动映射, 但是多表的时候就会关闭掉自动映射

      • 注意: autoMappingBehavior的值一定要是大写的, 比如我们要指定为值为默认值partial时一定要写为: PARTIAL, 而不能是写为partial

      ②: mapUnderscoreToCamelCase设置开启驼峰命名与数据库中下划线命名之间的转换

  • eg: 简单单表自动映射示例:

    • 全局配置文件

      <settings>
          <!--        autoMappingBehavior : 默认值为partial(要为大写), 表示单表连接的时候是开启自动映射的, 但是多表的时候是不开启自动映射的-->
          <setting name="autoMappingBehavior" value="PARTIAL"/>
      </settings>
      
      • 1
      • 2
      • 3
      • 4
    • 映射配置文件

      <?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标签用来配置对应的映射关系, 我们的sql语句就是在mapper中的对应的某些子标签中写的-->
      <mapper namespace="com.ffyc.dao.DemoMapper">
          <select id="findDemo1" resultType="Demo1" parameterType="integer">
      -- 这个时候显然是一个简单的单表查询, 单表查询之下默认的autoMappingBehavior属性值是partial, 也就是单表插叙的情况之下是开启自动映射的
              select * from demo1 where id = #{id}
          </select>
      </mapper>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • 要被代理的接口

      package com.ffyc.dao;
      
      import com.ffyc.model.Demo1;
      
      public interface DemoMapper {
          public Demo1 findDemo1(Integer id);
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • 接收结果集的实体类

      package com.ffyc.model;
      
      public class Demo1 {
          private Integer id;
          private String name;
          private String gender;
      
          public Integer getId() {
              return id;
          }
      
          public void setId(Integer id) {
              this.id = id;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getGender() {
              return gender;
          }
      
          public void setGender(String gender) {
              this.gender = gender;
          }
      
          @Override
          public String toString() {
              return "Demo1{" +
                      "id=" + id +
                      ", name='" + name + '\'' +
                      ", gender='" + gender + '\'' +
                      '}';
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
    • 数据表

      USE mybatisdb
      
      CREATE TABLE demo1
      (
      id INT PRIMARY KEY AUTO_INCREMENT,
      NAME VARCHAR(20),
      gender VARCHAR(20)
      )
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • 测试类:

      package com.ffyc.test;
      
      import com.ffyc.dao.DemoMapper;
      import com.ffyc.model.Demo1;
      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.jupiter.api.Test;
      
      import java.io.IOException;
      import java.io.InputStream;
      
      public class DemoTest {
          @Test
          public void test1() throws IOException {
              InputStream mappers = Resources.getResourceAsStream("mybatisConfig.xml");
      
              SqlSessionFactory build = new SqlSessionFactoryBuilder().build(mappers);
      
              SqlSession sqlSession = build.openSession();
      
              DemoMapper mapper = sqlSession.getMapper(DemoMapper.class);
      
              Demo1 demo1 = mapper.findDemo1(1);
      
              System.out.println(demo1);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
  • 注意: 如果java中的属性和数据库表中的字段不是完全相同, 但是Java中的属性名符合Java中的规范的驼峰命名规范, 而数据表中的字段也符合数据库中经典的下划线命名方式, 那么我们就可以通过将mapUnderscoreToCamelCase的值设置为true, 然后也就能完成对应的自动映射
    •     <!--        mapUnderscoreToCamelCase : 默认值为false, 这里我们设置的是true, 表示的是开启下换线和驼峰命名转换-->
      <setting name="mapUnderscoreToCamelCase" value="true"/>
      
      • 1
      • 2
      • 这里我们就是设置了驼峰和下划线命方式之间的自动转换
  1. 自定义resultMap : 实现自定义映射(高级结果集映射)

    • 使用resultMap标签和select标签中的resultMap属性来完成resultMap标签:

      ① : type属性用来表示需要自定义规则的java类型

      ② : id属性是唯一表示,对应select标签中的resultMap属性

      • resultMap标签中的子标签result用来定义普通列的映射关系, 使用id子标签来定义主键字段的映射关系

        • 但是注意: 使用result标签也可以指明主键列的映射关系, 只是使用id标签来指明主键字段的映射关系会有优化
  • eg: 简单自定义映射示例:

    • 属性文件: (我们将要连接的数据库的信息存到一个属性文件中)

      user=root
      password=mysql
      url=jdbc:mysql://localhost:3306/mybatisdb?serverTimezone=Asia/Shanghai
      driverClass=com.mysql.cj.jdbc.Driver
      
      • 1
      • 2
      • 3
      • 4
    • 全局配置文件:

      <?xml version="1.0" encoding="UTF-8" ?>
      <!--xml约束-->
      <!DOCTYPE configuration
              PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
              "http://mybatis.org/dtd/mybatis-3-config.dtd">
      <!--Mybatis全局配置中的根标签-->
      <configuration>
      <!--    注意: configuration标签中的子标签是由顺序的, 如果我们要看顺序的时候可以点到mybatis-3-config.dtd文件中去看一下-->
      <!--    使用properties标签来导入属性文件, 后面我们就可以使用${属性名}的方式来获取到配置文件中的配置值-->
          <properties resource="config.properties"></properties>
      
      <!--    settings标签是用来做数据库连接的时候的一些设置的, settings标签中可以通过name和value属性值来对数据库连接的时候进行一定的设置,
      可以设置的值有很多, 我们后面一一讲解-->
          <settings>
              <setting name="logImpl" value="STDOUT_LOGGING"/>
      <!--        autoMappingBehavior : 默认值为partial, 表示单表连接的时候是开启自动映射的, 但是多表的时候是不开启自动映射的-->
              <setting name="autoMappingBehavior" value="PARTIAL"/>
      <!--        mapUnderscoreToCamelCase : 默认值为false, 这里我们设置的是true, 表示的是开启下换线和驼峰命名转换-->
              <setting name="mapUnderscoreToCamelCase" value="true"/>
          </settings>
      
      
      <!--    typeAliases标签就是类型别名, 也就是起别名的, 我们主要用来给某个JavaBean起别名或者给某个JavaBean所在的包起别名
               注意: 如果我们是给某个JavaBean起别名的时候要使用到typeAliases标签中的typeAlias子标签, 并且要给这个子标签设置两个属性值
               1. type属性: 想起别名的某个JavaBean的全类名
               2. alias属性: alias属性表示的就是别名-->
          <typeAliases>
      <!--        使用package来给包起别名,使用package子标签的使用只用使用其中的name属性,当我们给name属性赋值之后这个包名就直接通过最后一级包名直接访问-->
              <package name="com.ffyc.model"/>
          </typeAliases>
      
      <!--    environments标签用来配置数据环境, default属性来选取默认环境-->
          <environments default="development">
              <environment id="development">
      <!--            事件管理器, 说明时间管理使用的是原生JDBC的-->
                  <transactionManager type="JDBC"/>
      <!--            配置数据源, type属性指定了是使用数据库连接池的方式来配置数据源, 如果type属性指定为UNPOOLED就是表示的没有使用数据库连接池-->
                  <dataSource type="POOLED">
      <!--                property标签用来配置数据源, 其中name属性的取值是固定的,
                      其中name为driver表示的是驱动类,记住: 我们的驱动类是mysql厂商实现的, 所以是mysql在jdbc的前面, 所以是com.mysql.cj.jdbc.Driver
                      其中name属性为url表示的是数据库的地址: 我们的url是jdbc在前面: jdbc:mysql://localhost:3306/数据库名?serverTimeZone=Asia/上海
                      其中name属性为username表示的是数据库账号:
                      其中name属性为password表示的是数据库密码-->
                      <property name="driver" value="${driverClass}"/>
                      <property name="url" value="${url}"/>
                      <property name="username" value="${user}"/>
                      <property name="password" value="${password}"/>
                  </dataSource>
              </environment>
          </environments>
      <!--    mappers标签用在核心文件中加载映射文件,
              这里我们要注意: resource相对路径都是从resources文件夹下开始的,
              这里还要注意: 我们此时mappers是一级文件夹, 并不是包, 文件夹之间是/(斜杠)隔开-->
          <mappers>
              <mapper resource="mappers/GradeMappering.xml"/>
          </mappers>
      </configuration>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
    • 映射文件:

      <?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标签用来配置对应的映射关系, 我们的sql语句就是在mapper中的对应的某些子标签中写的-->
      <mapper namespace="com.ffyc.dao.GradeDao">
      
      <!--    注意: 对于如果我们的表是一对多关系的时候, 我们就要使用collection标签来对一个集合属性进行封装-->
          <resultMap id = "GradeMap" type = "Grade">
              <id column = "id" property = "id"></id>
              <result column="name" property="name"></result>
      <!--        注意: 我们如果使用分步查询的时候, 这个时候如果我们要引入的select标签就是在当前xml文件中, 那么我们就直接使用id就可以导入, 不用在指定命名空间
                  也就是如果我们要引入的select就是在当前命名空间中的时候, 这个时候直接使用id定位-->
              <collection property="students" ofType="student" javaType="list" select = "findStudents" column = "id"></collection>
          </resultMap>
      <!--    注意: 这个时候由于我们的年级对学生是一对多的关系, 并且如果我们此时要在一对多的关系上完成分页, 那么这个时候一定要使用分步查询-->
          <select id="findGradeList" resultMap="GradeMap">
              SELECT * FROM grade
          </select>
          <select id="findStudents" resultType="Student">
      -- 注意: 我们如果是执行的查询操作的时候, 我们一定要指定resultType, 但是注意: 
      -- 对于 parameterType属性我们可以不用指定, 我们可以使用TypeHander进行类型推断
              select name,num from student where id = #{gradeid}
          </select>
      </mapper>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
    • 被代理的接口:

      package com.ffyc.dao;
      
      import com.ffyc.model.Grade;
      
      import java.util.List;
      
      public interface GradeDao {
          List<Grade> findGradeList();
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    • 两个Java实体类:

      1. Grade类

        package com.ffyc.model;
        
        import java.util.List;
        
        public class Grade {
            private int id;
            private String name;
            private List<Student> students;
        
            public int getId() {
                return id;
            }
        
            public void setId(int id) {
                this.id = id;
            }
        
            public String getName() {
                return name;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public List<Student> getStudents() {
                return students;
            }
        
            public void setStudents(List<Student> students) {
                this.students = students;
            }
        
            @Override
            public String toString() {
                return "Grade{" +
                        "id=" + id +
                        ", name='" + name + '\'' +
                        '}';
            }
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
        • 28
        • 29
        • 30
        • 31
        • 32
        • 33
        • 34
        • 35
        • 36
        • 37
        • 38
        • 39
        • 40
        • 41
      2. Student类

        package com.ffyc.model;
        
        public class Student {
            private Integer id;
            private String name;
            private String num;
            private Grade grade;
        
            public Integer getId() {
                return id;
            }
        
            public void setId(Integer id) {
                this.id = id;
            }
        
            public String getName() {
                return name;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public String getNum() {
                return num;
            }
        
            public void setNum(String num) {
                this.num = num;
            }
        
            public Grade getGrade() {
                return grade;
            }
        
            public void setGrade(Grade grade) {
                this.grade = grade;
            }
        
            @Override
            public String toString() {
                return "Student{" +
                        "id=" + id +
                        ", name='" + name + '\'' +
                        ", num='" + num + '\'' +
                        ", grade=" + grade +
                        '}';
            }
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
        • 28
        • 29
        • 30
        • 31
        • 32
        • 33
        • 34
        • 35
        • 36
        • 37
        • 38
        • 39
        • 40
        • 41
        • 42
        • 43
        • 44
        • 45
        • 46
        • 47
        • 48
        • 49
        • 50
    • 测试类:

      package com.ffyc.test;
      
      import com.ffyc.dao.AdminMapper;
      import com.ffyc.dao.GradeDao;
      import com.ffyc.model.Admin;
      import com.ffyc.model.Grade;
      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.jupiter.api.Test;
      
      import java.io.IOException;
      import java.io.InputStream;
      import java.util.List;
      
      public class GradeTest {
          @Test
          public void findGradeList() throws IOException {
              InputStream resourceAsStream = Resources.getResourceAsStream("mybatisConfig.xml");
      
              SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
      
              SqlSession sqlSession = build.openSession();
      
              GradeDao gradeDao = sqlSession.getMapper(GradeDao.class);
      
              List<Grade> gradeList = gradeDao.findGradeList();
      
              System.out.println(gradeList);
      
              //如果没有提交事物的时候我们的执行了预编译之后假如出错了, 但是这个时候我们如果主键是自增的, 那么即使预编译之后即使没有提交事物, 这个时候主键还是会自增
              sqlSession.commit();
              sqlSession.close();
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
  • 注意: 上面我们将autoMappingBehavior属性设置为了PARTIAL, 作用是单表查询的时候开启自动映射, 但是如果是分步查询的时候就会关闭自动映射.
    • 但是要注意: 这个时候我们使用分布查询的时候其实是多个单表查询, 并不算是一个多表查询, 所以不会出现将autoMappingBehavior属性设置为FULL之后的多表映射混乱的问题, 只有是单纯的多表连接查询的时候, 这个时候我们一般使用多表查询就要使用resultMap, 那么对于没有使用id和result子标签指定的映射关系, 那么就会走自动映射, 这个时候就会出现映射混乱的问题
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/438470
推荐阅读
相关标签
  

闽ICP备14008679号