MyBatis 关于查询语句上设置的详细内容

民工心事  金牌会员 | 2024-6-14 15:35:19 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 894|帖子 894|积分 2682

1. MyBatis 关于查询语句上设置的详细内容

@
目次

2. 准备工作

数据表结构的设计,数据表名为:t_car

t_car 表中的数据信息:

在pom.xml 文件当中设置相关的依靠的 jar 包如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     <groupId>com.rainbowsea</groupId>
  7.     <artifactId>mybatis-005-crud-blog</artifactId>
  8.     <version>1.0-SNAPSHOT</version>
  9.     <properties>
  10.         <maven.compiler.source>17</maven.compiler.source>
  11.         <maven.compiler.target>17</maven.compiler.target>
  12.     </properties>
  13.     <dependencies>
  14.         
  15.         <dependency>
  16.             <groupId>org.mybatis</groupId>
  17.             <artifactId>mybatis</artifactId>
  18.             <version>3.5.10</version>
  19.         </dependency>
  20.         
  21.         <dependency>
  22.             <groupId>mysql</groupId>
  23.             <artifactId>mysql-connector-java</artifactId>
  24.             <version>8.0.30</version>
  25.         </dependency>
  26.         <dependency>
  27.             <groupId>junit</groupId>
  28.             <artifactId>junit</artifactId>
  29.             <version>4.13.2</version>
  30.             <scope>test</scope>
  31.         </dependency>
  32.         
  33.         <dependency>
  34.             <groupId>ch.qos.logback</groupId>
  35.             <artifactId>logback-classic</artifactId>
  36.             <version>1.2.11</version>
  37.         </dependency>
  38.     </dependencies>
  39. </project>
复制代码
设置 logback 的设置文件,用于打印显示,我们的日志信息,方便我们检察我们的运行过程,效果。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration debug="false">
  3.    
  4.     <appender name="STDOUT" >
  5.         <encoder >
  6.             
  7.             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  8.         </encoder>
  9.     </appender>
  10.    
  11.     <logger name="com.apache.ibatis" level="TRACE"/>
  12.     <logger name="java.sql.Connection" level="DEBUG"/>
  13.     <logger name="java.sql.Statement" level="DEBUG"/>
  14.     <logger name="java.sql.PreparedStatement" level="DEBUG"/>
  15.    
  16.     <root level="DEBUG">
  17.         <appender-ref ref="STDOUT"/>
  18.         <appender-ref ref="FILE"/>
  19.     </root>
  20. </configuration>
复制代码
设置 MyBatis 的焦点设置文件,
  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.         
  7.         <package name="com.rainbowsea.mybatis.pojo"/>
  8.     </typeAliases>
  9.     <environments default="mybatis">
  10.         <environment id="mybatis">
  11.             
  12.             <transactionManager type="JDBC"/>
  13.             <dataSource type="POOLED">
  14.     <settings>
  15.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  16.     </settings><property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  17.     <settings>
  18.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  19.     </settings><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
  20.     <settings>
  21.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  22.     </settings><property name="username" value="root"/>
  23.     <settings>
  24.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  25.     </settings><property name="password" value="MySQL123"/>
  26.             </dataSource>
  27.         </environment>
  28.     </environments>
  29.     <mappers>
  30.         
  31.         <package name="com.rainbowsea.mybatis.mapper"></package>
  32.     </mappers>
  33. </configuration>
复制代码
对照 t_car 创建的ORM 映射的 Car 类
留意:在MyBatis 当中对应的ORM ,一样平常在框架里对应的 Bean实体类,肯定要实现该 set 和 get 方法以及无参数构造方法,无法框架无法使用反射机制,进行操作
建议用包装类,这样可以防止 Null的问题,因为(简单类型 int num = null ,是不可以赋值为 null)的编译无法通过
  1. package com.rainbowsea.mybatis.pojo;
  2. public class Car {
  3.     // 数据库表当中的字段应该和pojo类的属性一一对应
  4.     // 建议使用包装类,这样可以防止null的问题
  5.     private Long id;
  6.     private String carNum;
  7.     private String brand;
  8.     private Double guidePrice;
  9.     private String produceTime;
  10.     private String carType;
  11.     public Car() {
  12.     }
  13.     public Car(Long id, String carNum, String brand, Double guidePrice, String produceTime, String carType) {
  14.         this.id = id;
  15.         this.carNum = carNum;
  16.         this.brand = brand;
  17.         this.guidePrice = guidePrice;
  18.         this.produceTime = produceTime;
  19.         this.carType = carType;
  20.     }
  21.     @Override
  22.     public String toString() {
  23.         return "Car{" +
  24.     <settings>
  25.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  26.     </settings>"id=" + id +
  27.     <settings>
  28.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  29.     </settings>", carNum='" + carNum + '\'' +
  30.     <settings>
  31.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  32.     </settings>", brand='" + brand + '\'' +
  33.     <settings>
  34.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  35.     </settings>", guidePrice=" + guidePrice +
  36.     <settings>
  37.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  38.     </settings>", produceTime='" + produceTime + '\'' +
  39.     <settings>
  40.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  41.     </settings>", catType='" + carType + '\'' +
  42.     <settings>
  43.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  44.     </settings>'}';
  45.     }
  46.     public Long getId() {
  47.         return id;
  48.     }
  49.     public void setId(Long id) {
  50.         this.id = id;
  51.     }
  52.     public String getCarNum() {
  53.         return carNum;
  54.     }
  55.     public void setCarNum(String carNum) {
  56.         this.carNum = carNum;
  57.     }
  58.     public String getBrand() {
  59.         return brand;
  60.     }
  61.     public void setBrand(String brand) {
  62.         this.brand = brand;
  63.     }
  64.     public Double getGuidePrice() {
  65.         return guidePrice;
  66.     }
  67.     public void setGuidePrice(Double guidePrice) {
  68.         this.guidePrice = guidePrice;
  69.     }
  70.     public String getProduceTime() {
  71.         return produceTime;
  72.     }
  73.     public void setProduceTime(String produceTime) {
  74.         this.produceTime = produceTime;
  75.     }
  76.     public String getcarType() {
  77.         return carType;
  78.     }
  79.     public void setcarType(String catType) {
  80.         this.carType = catType;
  81.     }
  82. }
复制代码
3. SQL查询结果,返回为POJO实体类型

当查询的结果,有对应的POJO 实体类,并且查询结果只有一条时:
实操:
对应的接口
  1. package com.rianbowsea.mybatis.mapper;
  2. import com.rianbowsea.mybatis.pojo.Car;
  3. public interface CarMapper {
  4.     /**
  5.      * 根据 id 查询 Car 的值
  6.      * @param id
  7.      * @return
  8.      */
  9.     Car selectById(Long id);
  10. }
复制代码
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">
  6.     <select id="selectById" resultType="Car">
  7.         SELECT id,
  8.                car_num      as carNum,
  9.                brand,
  10.                guide_price  as guidePrice,
  11.                produce_time as produceTime,
  12.                car_type     as carType
  13.         FROM `t_car`
  14.         where id = #{id}
  15.     </select>
  16. </mapper>
复制代码
运行测试:
查询id为 118 的记录结果:
  1. package com.rainbowsea.mybatis.test;
  2. import com.rainbowsea.mybatis.mapper.CarMapper;
  3. import com.rainbowsea.mybatis.pojo.Car;
  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 org.junit.Test;
  9. import java.io.IOException;
  10. public class CarMapperTest {
  11.     @Test
  12.     public void testSelectById() throws IOException {
  13.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  14.         SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
  15.         SqlSession sqlSession = sqlSessionFactory.openSession();
  16.         CarMapper mapper = sqlSession.getMapper(CarMapper.class);
  17.         Car car = mapper.selectById(118L);
  18.         System.out.println(car);
  19.     }
  20. }
复制代码
4. SQL查询结果,返回为List 聚集类型

当查询的记录条数是多条的时候,必须使用聚集接收。假如使用单个实体类接收会出现非常。
  1. import com.rainbowsea.mybatis.pojo.Car;
  2. import java.util.List;
  3. public interface CarMapper {
  4.     /**
  5.      * 获取所有的Car
  6.      * @return
  7.      */
  8.     List<Car> selectAll();
  9. }
复制代码
留意:对于查询结果返回多条记录时,resultType的值是(聚集/数组存储的元素的类型(除了Map聚集是放Map聚集本身))
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">
  6.    
  7.    
  8.     <select id="selectAll" resultType="Car">
  9.         SELECT id,
  10.                car_num      as carNum,
  11.                brand,
  12.                guide_price  as guidePrice,
  13.                produce_time as produceTime,
  14.                car_type     as carType
  15.         FROM t_car
  16.     </select>
  17. </mapper>
复制代码
运行测试:
查询t_car 数据表中所有的记录内容:
  1. package com.rainbowsea.mybatis.test;
  2. import com.rainbowsea.mybatis.mapper.CarMapper;
  3. import com.rainbowsea.mybatis.pojo.Car;
  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 org.junit.Test;
  9. import java.io.IOException;
  10. import java.util.List;
  11. public class CarMapperTest {
  12.     @Test
  13.     public void testSelectAll() throws IOException {
  14.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  15.         SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
  16.         SqlSession sqlSession = sqlSessionFactory.openSession();
  17.         CarMapper mapper = sqlSession.getMapper(CarMapper.class);
  18.         List<Car> cars = mapper.selectAll();
  19.         cars.forEach(car -> {
  20.             System.out.println(car);
  21.         });
  22.         sqlSession.close();
  23.     }
  24. }
复制代码
假如返回多条记录,接纳单个实体类接收会怎样 ?



查询结果是一条的话可以使用List聚集接收吗?固然可以
就是List 聚集当中,只会存储一个记录的内容POJO
5. SQL查询结果,返回为Map 聚集

当返回的数据,没有符合的实体类POJO对应的时候,可以接纳Map聚集进行担当,字段名做 : key ,字段值做:value ,查询结果可以保证只有一条数据,则返回一个Map聚集。
留意:只有返回的是单个记录的时候,才可以用单个Map聚集存储担当
Mybatis 在 查询结果放到 Map 聚集中存放的方式是:
  1.      * Map<String,     Object>
  2.      *      key          value
  3.      *     "id"                 131
  4.      *     "car_num"      999
  5.      *     "brand"              小米su7
  6.      *     查询数据库中的字段名          对于单个对应字段的值
复制代码
​   


  1. import com.rainbowsea.mybatis.pojo.Car;
  2. import java.util.List;
  3. import java.util.Map;
  4. public interface CarMapper {
  5.     /**
  6.      *  Mybatis 在 查询结果放到 Map 集合中存放的方式是:
  7.      *  Map<String,     Object>
  8.      *      k           v
  9.      *     "id"         131
  10.      *     "car_num"    999
  11.      *     "brand"      小米su7
  12.      *     查询          对于单个对应字段的值
  13.      *     数据库中
  14.      *     的字段名
  15.      *
  16.      *
  17.      * @param id
  18.      * @return
  19.      */
  20.     Map<String,Object> selectByIdRetMap(Long id);
  21. }
复制代码
留意:对于查询结果返回多条记录时,resultType的值是(聚集/数组存储的元素的类型(除了Map聚集是放Map聚集本身))resultMap="map",这是因为mybatis内置了很多别名。【拜见mybatis开辟手册】 https://mybatis.net.cn/
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">
  6.    
  7.    
  8.     <select id="selectAll" resultType="Car">
  9.         SELECT id,
  10.                car_num      as carNum,
  11.                brand,
  12.                guide_price  as guidePrice,
  13.                produce_time as produceTime,
  14.                car_type     as carType
  15.         FROM t_car
  16.     </select>
  17. </mapper>    where id = #{id}   
复制代码
运行测试:
查询 id 为 118 的记录
  1. package com.rainbowsea.mybatis.test;
  2. import com.rainbowsea.mybatis.mapper.CarMapper;
  3. import com.rainbowsea.mybatis.pojo.Car;
  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 org.junit.Test;
  9. import java.io.IOException;
  10. import java.util.List;
  11. import java.util.Map;
  12. public class CarMapperTest {
  13.     @Test
  14.     public void testSelectByIdRetMap() throws IOException {
  15.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  16.         SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
  17.         SqlSession sqlSession = sqlSessionFactory.openSession();
  18.         CarMapper mapper = sqlSession.getMapper(CarMapper.class);
  19.         Map<String, Object> cars = mapper.selectByIdRetMap(118L);
  20.         System.out.println(cars);
  21.         sqlSession.close();
  22.     }
  23. }
复制代码

留意:只有返回的是单个记录的时候,才可以用单个Map聚集存储担当 ,假如是多个记录的话,
可以将Map聚集放到List聚集中。
反过来,假如返回的不是一条记录,是多条记录的话,只接纳单个Map聚集接收,这样同样会出现之前的非常:TooManyResultsException

6. SQL查询结果,返回为List聚集

查询结果条数大于等于 1 条数据时,则可以返回一个存储 Map 聚集的 List 聚集。List 等同于 List


留意: 这个 resultType 不是 List 是 map ,留意:除了单个特殊的 Map 聚集的话(因为Map当中存在多个元素类型,无法断定用其中的那个存储的),其他的都是数组/聚集当中存放的数据的元素类型
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">
  6.    
  7.    
  8.    
  9.     <select id="selectAllRetListMap" resultType="map">
  10.         SELECT id,
  11.                car_num      as carNum,
  12.                brand,
  13.                guide_price  as guidePrice,
  14.                produce_time as produceTime,
  15.                car_type     as carType
  16.         FROM `t_car`
  17.     </select>
  18. </mapper>
复制代码
测试运行程序:
  1. package com.rainbowsea.mybatis.test;
  2. import com.rainbowsea.mybatis.mapper.CarMapper;
  3. import com.rainbowsea.mybatis.pojo.Car;
  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 org.junit.Test;
  9. import java.io.IOException;
  10. import java.util.List;
  11. import java.util.Map;
  12. public class CarMapperTest {
  13.     @Test
  14.     public void testSelectAllRetListMap() throws IOException {
  15.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  16.         SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
  17.         SqlSession sqlSession = sqlSessionFactory.openSession();
  18.         CarMapper mapper = sqlSession.getMapper(CarMapper.class);
  19.         List<Map<String, Object>> cars = mapper.selectAllRetListMap();
  20.         cars.forEach(car->{
  21.             System.out.println(car);
  22.         });
  23.         sqlSession.close();
  24.     }
  25. }
复制代码
7. SQL查询结果,返回为Map

这里我们拿Car的id做 最外面的Map 的key,以后取出对应的Map集适时更方便。最外面内里包罗一个小Map聚集

这里我们须要使用 @MapKey 注解,该注解的作用就是将:将查询结果的 id 字段的值作为整个Map(最外面的那个Map)聚集的key。
这里你想将查询结果中的那个字段的值,赋值给“最外面的Map”聚集的 key ,就填写对应上的查询上的字段名即可

  1. package com.rainbowsea.mybatis.mapper;
  2. import com.rainbowsea.mybatis.pojo.Car;
  3. import org.apache.ibatis.annotations.MapKey;
  4. import java.util.List;
  5. import java.util.Map;
  6. public interface CarMapper {
  7.     /**
  8.      * 查询所有的Car,返回一个Map集合
  9.      * Map集合的key是每条记录的主键值
  10.      * Map集合的value是每条记录
  11.      * @return
  12.      */
  13.     @MapKey("id") // 将查询结果的id字段的值作为整个Map集合的key。
  14.     Map<Long,Map<String,Object>> selectAllRetMap();
  15. }
复制代码
留意:我们这里是一个Map中套装一个Map,
Map聚集比力特殊(存在两个值:key,value) 所以要
继承使用Map存储查询结果
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">
  6.    
  7.     <select id="selectAllRetMap" resultType="Map">
  8.         SELECT id,
  9.                car_num      as carNum,
  10.                brand,
  11.                guide_price  as guidePrice,
  12.                produce_time as produceTime,
  13.                car_type     as carType
  14.         FROM `t_car`
  15.     </select>
  16. </mapper>
复制代码
运行测试:
查询t_car 数据表中的所有内容。

  1. package com.rainbowsea.mybatis.test;
  2. import com.rainbowsea.mybatis.mapper.CarMapper;
  3. import com.rainbowsea.mybatis.pojo.Car;
  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 org.junit.Test;
  9. import java.io.IOException;
  10. import java.util.List;
  11. import java.util.Map;
  12. public class CarMapperTest {
  13.     @Test
  14.     public void testSelectAllRetMap() throws IOException {
  15.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  16.         SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
  17.         SqlSession sqlSession = sqlSessionFactory.openSession();
  18.         CarMapper mapper = sqlSession.getMapper(CarMapper.class);
  19.         Map<Long,Map<String,Object>> cars = mapper.selectAllRetMap();
  20.         System.out.println(cars);
  21.         sqlSession.close();
  22.     }
  23. }
复制代码
8. SQL查询结果,返回总记录条数

  1. import com.rainbowsea.mybatis.pojo.Car;
  2. import org.apache.ibatis.annotations.MapKey;
  3. import java.util.List;
  4. import java.util.Map;
  5. public interface CarMapper {
  6.     /**
  7.      * 获取Car的总记录条数
  8.      * @return
  9.      */
  10.     Long selectTotal();
  11. }
复制代码
须要留意的是: select count(具体某个字段的话,是不会记录null值的个数的),所以我们可以用 select count(1) from t_car ,恒为真的方式,查询(这样就包括了为 null 的值的个数了)
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">
  6.    
  7.     <select id="selectTotal" resultType="Long">
  8.         select count(1)
  9.         from t_car
  10.     </select>
  11. </mapper>
复制代码
运行测试:
查询 t_car 数据表中的所有记录条数。
  1. import java.io.IOException;
  2. import java.util.List;
  3. import java.util.Map;
  4. public class CarMapperTest {
  5.     @Test
  6.     public void testSelectTotal() throws IOException {
  7.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  8.         SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
  9.         SqlSession sqlSession = sqlSessionFactory.openSession();
  10.         CarMapper mapper = sqlSession.getMapper(CarMapper.class);
  11.         Long count = mapper.selectTotal();
  12.         System.out.println("总记录条数" + count);
  13.         sqlSession.close();
  14.     }
  15. }
复制代码
9. SQL查询,resultMap 结果映射

我们知道,要将 select 查询的结果集存储到对应的POJO实体类当中的必须要将查询的字段名和POJO实体类的属性名两者保持同等 ,但是我们的数据库的命名规范是下划线 ,而在Java当中的命名规范是驼峰命名 方式,两者是不同等的。而想要将这两者在不修改自身的属性名字也能达到一个两者名字保持同等的方案有 ,如下三种方式:

  • 第一种方式:使用 AS 关键字给列起别名
  • 第二种方式:使用 resultMap 进行结果映射
  • 第三种方式:开启MyBatis 的驼峰命名自动映射(设置 settings )
第一方式:我们上述的操作都是,使用的这种方式,下面就不多赘述了。
我们来学习一下,第二,三种方式。
9.1 第二种方式:使用 resultMap 进行结果映射

  1. import com.rainbowsea.mybatis.pojo.Car;
  2. import org.apache.ibatis.annotations.MapKey;
  3. import java.util.List;
  4. import java.util.Map;
  5. public interface CarMapper {
  6.     /**
  7.      * 查询所有的Car信息,使用resultMap标签进行结果映射
  8.      * @return
  9.      */
  10.     List<Car> selectAllByResultMap();
  11. }
复制代码
resultMap  1.专门定义一个结果映射,在这个结果映射当中指定数据库表的字段名和Java类的属性名的对应关系
type属性,用来指定POJO类的类名
id属性,指定resultMap的唯一标识,这个id将来要在select标签中使用,启用了别名机制,  也可以用别名
留意:resultMap属性的值必须和resultMap标签中id属性值同等
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">
  6.    
  7.    
  8.    
  9.     <resultMap id="carResultMap" type="Car">
  10.         
  11.         
  12.         <id property="id" column="id"></id>
  13.         
  14.         
  15.         <result property="carNum" column="car_num"></result>
  16.         
  17.         
  18.         <result property="brand" column="brand" javaType="string" jdbcType="VARCHAR"/>
  19.         <result property="guidePrice" column="guide_price"></result>
  20.         <result property="produceTime" column="produce_time"></result>
  21.         <result property="carType" column="car_type"></result>
  22.     </resultMap>
  23.    
  24.    
  25.     <select id="selectAllByResultMap" resultMap="carResultMap">
  26.         SELECT id,
  27.                car_num,
  28.                brand,
  29.                guide_price,
  30.                produce_time,
  31.                car_type
  32.         FROM `t_car`
  33.     </select>
  34. </mapper>
复制代码
运行测试:
查询 t_car 数据表中的所有内容。
  1. import com.rainbowsea.mybatis.mapper.CarMapper;
  2. import com.rainbowsea.mybatis.pojo.Car;
  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 org.junit.Test;
  8. import java.io.IOException;
  9. import java.util.List;
  10. import java.util.Map;
  11. public class CarMapperTest {
  12.     @Test
  13.     public void testSelectAllByResultMap() throws IOException {
  14.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  15.         SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
  16.         SqlSession sqlSession = sqlSessionFactory.openSession();
  17.         CarMapper mapper = sqlSession.getMapper(CarMapper.class);
  18.         List<Car> cars = mapper.selectAllByResultMap();
  19.         cars.forEach(car -> {
  20.             System.out.println(car);
  21.         });
  22.         sqlSession.close();
  23.     }
  24. }
复制代码
9.2 第三种方式:开启驼峰命名自动映射

使用这种方式的前提是:属性名遵照Java驼峰 命名规范,数据库表列名遵照SQL的下划线 命名规范。

  • Java命名规范:首字母小写,后面每个单词首字母大写,遵照驼峰命名方式
  • SQL命名规范:全部小写,单词之间接纳下划线分割
比如以下的对应关系:
比如以下的对应关系:
POJO 实体类中的属性名数据库表的列名carNumcar_numcarTypecar_typeproduceTimeproduce_time如何启用该功能,在 mybatis-config.xml 文件中进行设置:
留意:setting 标签方式的位置,可以根据错误提示进行修正位置。
  1.     <settings>
  2.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  3.     </settings>
复制代码
  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.         
  7.         <package name="com.rainbowsea.mybatis.pojo"/>
  8.     </typeAliases>
  9.     <environments default="mybatis">
  10.         <environment id="mybatis">
  11.             
  12.             <transactionManager type="JDBC"/>
  13.             <dataSource type="POOLED">
  14.     <settings>
  15.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  16.     </settings><property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  17.     <settings>
  18.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  19.     </settings><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
  20.     <settings>
  21.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  22.     </settings><property name="username" value="root"/>
  23.     <settings>
  24.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  25.     </settings><property name="password" value="MySQL123"/>
  26.             </dataSource>
  27.         </environment>
  28.     </environments>
  29.     <mappers>
  30.         
  31.         <package name="com.rainbowsea.mybatis.mapper"></package>
  32.     </mappers>
  33. </configuration>    <settings>
  34.         <setting name="mapUnderscoreToCamelCase" value="true"/>
  35.     </settings>        
复制代码
开启后运行测试:
  1. import com.rainbowsea.mybatis.pojo.Car;
  2. import org.apache.ibatis.annotations.MapKey;
  3. import java.util.List;
  4. import java.util.Map;
  5. public interface CarMapper {
  6.     /**
  7.      * mybatis 全局设置,驼峰命名映射
  8.      * @return
  9.      */
  10.     List<Car> selectAllByMapUnderscoreToCamelCase();
  11. }
复制代码
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">
  6.     <select id="selectAllByMapUnderscoreToCamelCase" resultType="Car">
  7.         SELECT id,
  8.                car_num,
  9.                brand,
  10.                guide_price,
  11.                produce_time,
  12.                car_type
  13.         FROM `t_car`
  14.     </select>
  15. </mapper>
复制代码
运行测试:
查询 t_car 数据表的所有记录
  1. import com.rainbowsea.mybatis.mapper.CarMapper;
  2. import com.rainbowsea.mybatis.pojo.Car;
  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 org.junit.Test;
  8. import java.io.IOException;
  9. import java.util.List;
  10. import java.util.Map;
  11. public class CarMapperTest {
  12.     @Test
  13.     public void testSelectAllByMapUnderscoreToCamelCase() throws IOException {
  14.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  15.         SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
  16.         SqlSession sqlSession = sqlSessionFactory.openSession();
  17.         CarMapper mapper = sqlSession.getMapper(CarMapper.class);
  18.         List<Car> cars = mapper.selectAllByMapUnderscoreToCamelCase();
  19.         cars.forEach(car -> {
  20.             System.out.println(car);
  21.         });
  22.         sqlSession.close();
  23.     }
  24. }
复制代码
10. 总结:


  • 留意:对于查询结果返回多条记录时,resultType的值是(聚集/数组存储的元素的类型(除了Map聚集是放Map聚集本身))
  • 留意:只有返回的是单个记录的时候,才可以用单个Map聚集存储担当 ,假如是多个记录的话,可以将Map聚集放到List聚集中。反过来,假如返回的不是一条记录,是多条记录的话,只接纳单个Map聚集接收,这样同样会出现之前的非常:TooManyResultsException
  • 这里我们须要使用 @MapKey 注解,该注解的作用就是将:将查询结果的 id 字段的值作为整个Map(最外面的那个Map)聚集的key。
    1. 这里你想将查询结果中的那个字段的值,赋值给“最外面的Map”集合的 key ,就填写对应上的查询上的字段名即可
    复制代码
  • resultMap 结果映射: 留意:resultMap属性的值必须和resultMap标签中id属性值同等。property 后面填写的值是:POJO类的属性名;column 后面填写数据库表查询显示的的字段名(用了别名的话,是别名)
  • 开启驼峰命名自动映射。属性名遵照Java驼峰 命名规范,数据库表列名遵照SQL的下划线 命名规范。,同时留意:留意:setting 标签方式的位置,可以根据错误提示进行修正位置。
  • 假如查询的结果是一个数值,则可以用数值类型进行担当。
11. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上汲取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继承在其他的范畴奋斗。感谢你们,我们总会在某个时刻再次相遇。”


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表