MyBatis中的接口代理机制及其利用

打印 上一主题 下一主题

主题 894|帖子 894|积分 2682

1. MyBatis中的接口代理机制及其利用

@
目次

MyBatis 中的接口代理类机制,MyBatis 框架中利用了动态代理的设计模式,让我们可以不消写,对应XxxMapper.java 接口的实现类,而是通过动态代理的方式,让MyBatis 自动为我们生成对应实现了该 XxxMapper.java接口的实现类,这个动态代理实现的类,我们可以直接利用。
焦点代码:
  1.                 // 获取到 SqlSessionFactoryBuilder
  2.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  3.         // 获取到SqlSessionFactory 对象
  4.         // SQlsessionFactory对象,一个SqlSessionFactory对应一个 environment, 一个environment通常是一个数据库
  5.         SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
  6.         // 获取到 SalSession 会话,一次会话一个
  7.         SqlSession sqlSession = sessionFactory.openSession();
  8.         Car car = new Car(null, "999", "奥迪", 3.0, "2000-10-10", "新能源");
  9.         // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
  10.                 // 需要注意的是参数的 Xxxmapper.class 和 返回值是保持一致的。
  11.         XxxMapper mapper = sqlSession.getMapper(XxxMapper.class);
  12.                 mapper.xxx(); // 执行的是该XxxMapper接口中的方法
复制代码
  1.                 // 获取到 SalSession 会话,一次会话一个
  2.         SqlSession sqlSession = sessionFactory.openSession();
  3.         Car car = new Car(null, "999", "奥迪", 3.0, "2000-10-10", "新能源");
  4.         // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
  5.                 // 需要注意的是参数的 Xxxmapper.class 和 返回值是保持一致的。
  6.         XxxMapper mapper = sqlSession.getMapper(XxxMapper.class);
  7.                 mapper.xxx(); // 执行的是该XxxMapper接口中的方法
复制代码
利用以上代码的前提是:XxxMapper.xml 文件中的 namespace 必须和 dao(mapper)接口的全限定名称一致,id 必须和 dao(mapper) 接口中方法名一致。
比如:我们这里的是:
CarMappe.xml

  • XxxMapper.xml 文件中的 namespace 必须和 dao(mapper)接口的全限定名称一致


  • 对应的接口上的方法名,id 必须 和 dao(mapper) 接口中方法名一致。


  • 利用的是 POJO 属性类赋值的话,#{} 的括号中的值,必须是 POJO类当中的属性名,比如这里我们用的是 Car ,则#{}括号中的值,则必须是 Car 的属性名。同时 #{} 括号中肯定要有值(就算只有一个参数,也要有值(任意写都要有值),才行,否则编译无法通过)

2. 实操

下面我们利用 MyBatis 的接口代理机制,对数据库进行CRUD,(增编削查)的操作。
2.1 准备工作

数据表结构的设计,数据表名为: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.     <typeAliases>
  8.         
  9.         <package name="com.rainbowsea.mybatis.pojo"/>
  10.     </typeAliases>
  11.     <environments default="mybatis">
  12.         <environment id="mybatis">
  13.             
  14.             <transactionManager type="JDBC"/>
  15.             <dataSource type="POOLED">
  16.                 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  17.                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
  18.                 <property name="username" value="root"/>
  19.                 <property name="password" value="MySQL123"/>
  20.             </dataSource>
  21.         </environment>
  22.     </environments>
  23.     <mappers>
  24.         
  25.         <mapper resource="CarMapper.xml"></mapper>
  26.     </mappers>
  27. </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.                 "id=" + id +
  25.                 ", carNum='" + carNum + '\'' +
  26.                 ", brand='" + brand + '\'' +
  27.                 ", guidePrice=" + guidePrice +
  28.                 ", produceTime='" + produceTime + '\'' +
  29.                 ", catType='" + carType + '\'' +
  30.                 '}';
  31.     }
  32.     public Long getId() {
  33.         return id;
  34.     }
  35.     public void setId(Long id) {
  36.         this.id = id;
  37.     }
  38.     public String getCarNum() {
  39.         return carNum;
  40.     }
  41.     public void setCarNum(String carNum) {
  42.         this.carNum = carNum;
  43.     }
  44.     public String getBrand() {
  45.         return brand;
  46.     }
  47.     public void setBrand(String brand) {
  48.         this.brand = brand;
  49.     }
  50.     public Double getGuidePrice() {
  51.         return guidePrice;
  52.     }
  53.     public void setGuidePrice(Double guidePrice) {
  54.         this.guidePrice = guidePrice;
  55.     }
  56.     public String getProduceTime() {
  57.         return produceTime;
  58.     }
  59.     public void setProduceTime(String produceTime) {
  60.         this.produceTime = produceTime;
  61.     }
  62.     public String getcarType() {
  63.         return carType;
  64.     }
  65.     public void setcarType(String catType) {
  66.         this.carType = catType;
  67.     }
  68. }
复制代码
对应操作实现CRUD(增编削查)的接口(这里是:CarMapper接口),在MyBtis 当中 ,关于 CRUD(增编削查)操作的接口/实现类,都是 mapper 末端的作为长期层,而在 MVC的三层架构中,则是以 dao 为后缀作为CRUD(增编削查)操作的接口/实现类。
  1. package com.rainbowsea.mybatis.mapper;
  2. import com.rainbowsea.mybatis.pojo.Car;
  3. import java.util.List;
  4. public interface CarMapper {
  5.     /**
  6.      * 新增 Car
  7.      * @param car
  8.      * @return
  9.      */
  10.     int insert(Car car);
  11.     /**
  12.      * 根据id 删除 Car
  13.      * @param id
  14.      * @return
  15.      */
  16.     int deleteById(Long id);
  17.     /**
  18.      * 修改汽车信息
  19.      * @param car
  20.      * @return
  21.      */
  22.     int update(Car car);
  23.     /**
  24.      * 根据id查询汽车信息
  25.      * @param id
  26.      * @return
  27.      */
  28.     Car selectById(Long id);
  29.     /**
  30.      * 获取所有的汽车信息
  31.      * @return
  32.      */
  33.     List<Car> selectAll();
  34. }
复制代码
2.2 insert 增长操作

对应 CarMapper 接口中的 insert( ) 抽象方法。
  1. public interface CarMapper {
  2.     /**
  3.      * 新增 Car
  4.      * @param car
  5.      * @return
  6.      */
  7.     int insert(Car car);
  8. }
复制代码
对应 CarMapper.xml SQL语句映射文件,上编写 insert 插入的 SQL语句。
  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.     <insert id="insert" parameterType="com.rainbowsea.mybatis.pojo.Car">
  8.         insert into t_car values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
  9.     </insert>
  10. </mapper>
复制代码
Java当中编程运行程序:
注意:由于是对数据库进行了修改,所以须要 commit() 提交给数据库,以及 close() 关闭资源
  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 testInsert() throws IOException {
  13.         // 获取到 SqlSessionFactoryBuilder
  14.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  15.         // 获取到SqlSessionFactory 对象
  16.         // SQlsessionFactory对象,一个SqlSessionFactory对应一个 environment, 一个environment通常是一个数据库
  17.         SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
  18.         // 获取到 SalSession 会话,一次会话一个
  19.         SqlSession sqlSession = sessionFactory.openSession();
  20.         Car car = new Car(null, "999", "奥迪", 3.0, "2000-10-10", "新能源");
  21.         // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
  22.         CarMapper mapper = sqlSession.getMapper(CarMapper.class);
  23.         int count = mapper.insert(car);
  24.         System.out.println(count);
  25.         sqlSession.commit();
  26.         sqlSession.close();
  27.     }
  28. }
复制代码

2.3 delete 删除操作

根据 id 删除一条记录,删除id为 124的一条记录。

对应 CarMapper 接口中的 deleteById( Long id) 抽象方法。
  1. public interface CarMapper {
  2.     /**
  3.      * 新增 Car
  4.      * @param car
  5.      * @return
  6.      */
  7.     int insert(Car car);
  8.     /**
  9.      * 根据id 删除 Car
  10.      * @param id
  11.      * @return
  12.      */
  13.     int deleteById(Long id);
  14. }
复制代码
对应 CarMapper.xml SQL语句映射文件,上编写 delete 删除的 SQL语句。
利用以上代码的前提是:XxxMapper.xml 文件中的 namespace 必须和 dao(mapper)接口的全限定名称一致,id 必须和 dao(mapper) 接口中方法名一致。
  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.     <delete id="deleteById" >
  7.         delete from t_car where id=#{id}
  8.     </delete>
  9. </mapper>
复制代码
Java当中编程运行程序:
注意:由于是对数据库进行了修改,所以须要 commit() 提交给数据库,以及 close() 关闭资源
删除id为 124的一条记录。
  1. import org.junit.Test;
  2. import java.io.IOException;
  3. public class CarMapperTest {
  4.     @Test
  5.     public void testDeleteById() throws IOException {
  6.         // 获取到 SqlSessionFactoryBuilder
  7.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  8.         // 获取到SqlSessionFactory 对象
  9.         // SQlsessionFactory对象,一个SqlSessionFactory对应一个 environment, 一个environment通常是一个数据库
  10.         SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
  11.         // 获取到 SalSession 会话,一次会话一个
  12.         SqlSession sqlSession = sessionFactory.openSession();
  13.         // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
  14.         CarMapper mapper = sqlSession.getMapper(CarMapper.class);
  15.         // 删除id为 124的一条记录。
  16.         int count = mapper.deleteById(124L);
  17.         sqlSession.commit(); // 提交给数据库
  18.         sqlSession.close(); // 关闭资源
  19.         System.out.println(count);
  20.     }
  21. }
复制代码

2.4 update 修改操作

根据 id 修改记录信息。
将 id 为 128的 brand 改为小米su7, guide_price 改为 21.00 , 时间改为 2024-03-28

对应 CarMapper 接口中的 update( ) 抽象方法。
  1. package com.rainbowsea.mybatis.mapper;
  2. import com.rainbowsea.mybatis.pojo.Car;
  3. import java.util.List;
  4. public interface CarMapper {
  5.     /**
  6.      * 修改汽车信息
  7.      * @param car
  8.      * @return
  9.      */
  10.     int update(Car car);
  11. }
复制代码
对应 CarMapper.xml SQL语句映射文件,上编写 update 修改的 SQL语句。
利用以上代码的前提是:XxxMapper.xml 文件中的 namespace 必须和 dao(mapper)接口的全限定名称一致,id 必须和 dao(mapper) 接口中方法名一致。
  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.     <update id="update">
  8.         update t_car
  9.         set car_num=#{carNum},
  10.             brand=#{brand},
  11.             guide_price=#{guidePrice},
  12.             produce_time=#{produceTime},
  13.             car_type=#{carType}
  14.         where id = #{id}
  15.     </update>
  16. </mapper>
复制代码
Java当中编程运行程序:
注意:由于是对数据库进行了修改,所以须要 commit() 提交给数据库,以及 close() 关闭资源
将 id 为 128的 brand 改为小米su7, guide_price 改为 21.00 , 时间改为 2024-03-28

  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. public class CarMapperTest {
  10.     @Test
  11.     public void testUpdate() throws IOException {
  12.         // 获取到 SqlSessionFactoryBuilder
  13.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  14.         // 获取到SqlSessionFactory 对象
  15.         // SQlsessionFactory对象,一个SqlSessionFactory对应一个 environment, 一个environment通常是一个数据库
  16.         SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
  17.         // 获取到 SalSession 会话,一次会话一个
  18.         SqlSession sqlSession = sessionFactory.openSession();
  19.         Car car = new Car(128L, "999", "小米su7", 21.0, "2022-03-28", "新能源");
  20.         // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
  21.         CarMapper mapper = sqlSession.getMapper(CarMapper.class);
  22.         int count = mapper.update(car);
  23.         sqlSession.commit(); // 提交给数据库
  24.         sqlSession.close();
  25.     }
  26. }
复制代码
2.5 select 查询一条记录操作

根据 id 查询一条记录。
查询 id 为 130 的一条记录。

对应 CarMapper 接口中的 selectById ( Long id) 抽象方法。
  1. package com.rainbowsea.mybatis.mapper;
  2. import com.rainbowsea.mybatis.pojo.Car;
  3. import java.util.List;
  4. public interface CarMapper {
  5.     /**
  6.      * 根据id查询汽车信息
  7.      * @param id
  8.      * @return
  9.      */
  10.     Car selectById(Long id);
  11. }
复制代码
对应 CarMapper.xml SQL语句映射文件,上编写 select 查询 的 SQL语句。
利用以上代码的前提是:XxxMapper.xml 文件中的 namespace 必须和 dao(mapper)接口的全限定名称一致,id 必须和 dao(mapper) 接口中方法名一致。
须要注意的是:查询是会返回效果集的,所以我们须要在  查询标签当中,通过 resultType 属性指定返回的类型(如果没有效别名机制的话,要用全限定类名(带包名的))
同时由于我们的数据表的字段的定名方式是下划线 ,部分数据表的字段名与我们设置的 ORM 映射的POJO类的属性名不一致,须要将他们二者的名字保持一致,所以我们须要利用 AS 定义别名,否则无法将对应数据表中的值,赋值到 对应的 POJO的类当中(这里是 Car 类当中)
  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="selectById" resultType="com.rainbowsea.mybatis.pojo.Car">
  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.         where id = #{id}
  16.     </select>
  17. </mapper>
复制代码
Java当中编程运行程序:
注意:由于我们仅仅是查询数据表中的信息,不涉及到对数据表的修改,删除操作,所以无需提交数据库commit,只要 close() 关闭资源就可以了
查询 id 为 130 的一条记录。

  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. public class CarMapperTest {
  10.     @Test
  11.     public void testSelectById() throws IOException {
  12.         // 获取到 SqlSessionFactoryBuilder
  13.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  14.         // 获取到SqlSessionFactory 对象
  15.         // SQlsessionFactory对象,一个SqlSessionFactory对应一个 environment, 一个environment通常是一个数据库
  16.         SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
  17.         // 获取到 SalSession 会话,一次会话一个
  18.         SqlSession sqlSession = sessionFactory.openSession();
  19.         // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
  20.         CarMapper mapper = sqlSession.getMapper(CarMapper.class);
  21.         Car car = mapper.selectById(130L);
  22.         System.out.println(car);
  23.         sqlSession.close();
  24.     }
  25. }
复制代码
2.6 select 查询多条记录操作

查询t_car 数据表中的全部信息。

对应 CarMapper 接口中的 selectAll( Long id) 抽象方法。返回的是一个List 聚集
  1. package com.rainbowsea.mybatis.mapper;
  2. import com.rainbowsea.mybatis.pojo.Car;
  3. import java.util.List;
  4. public interface CarMapper {
  5.   
  6.     /**
  7.      * 获取所有的汽车信息
  8.      * @return
  9.      */
  10.     List<Car> selectAll();
  11. }
复制代码
对应 CarMapper.xml SQL语句映射文件,上编写 select 查询 的 SQL语句。
利用以上代码的前提是:XxxMapper.xml 文件中的 namespace 必须和 dao(mapper)接口的全限定名称一致,id 必须和 dao(mapper) 接口中方法名一致。
须要注意的是:查询是会返回效果集的,所以我们须要在  查询标签当中,通过 resultType 属性指定返回的类型(如果没有效别名机制的话,要用全限定类名(带包名的))
同时由于我们的数据表的字段的定名方式是下划线 ,部分数据表的字段名与我们设置的 ORM 映射的POJO类的属性名不一致,须要将他们二者的名字保持一致,所以我们须要利用 AS 定义别名,否则无法将对应数据表中的值,赋值到 对应的 POJO的类当中(这里是 Car 类当中)
  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="selectAll" resultType="com.rainbowsea.mybatis.pojo.Car">
  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>
复制代码
Java当中编程运行程序:
注意:由于我们仅仅是查询数据表中的信息,不涉及到对数据表的修改,删除操作,所以无需提交数据库commit,只要 close() 关闭资源就可以了
查询 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. public class CarMapperTest {
  11.     @Test
  12.     public void testSelectAll() throws IOException {
  13.         // 获取到 SqlSessionFactoryBuilder
  14.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  15.         // 获取到SqlSessionFactory 对象
  16.         // SQlsessionFactory对象,一个SqlSessionFactory对应一个 environment, 一个environment通常是一个数据库
  17.         SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
  18.         // 获取到 SalSession 会话,一次会话一个
  19.         SqlSession sqlSession = sessionFactory.openSession();
  20.         // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
  21.         CarMapper mapper = sqlSession.getMapper(CarMapper.class);
  22.         List<Car> cars = mapper.selectAll();
  23.         cars.forEach(car -> {
  24.             System.out.println(car);
  25.         });
  26.         sqlSession.close();
  27.     }
  28. }
复制代码
3. 总结:



  1.                 // 获取到 SalSession 会话,一次会话一个
  2.         SqlSession sqlSession = sessionFactory.openSession();
  3.         Car car = new Car(null, "999", "奥迪", 3.0, "2000-10-10", "新能源");
  4.         // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
  5.                 // 需要注意的是参数的 Xxxmapper.class 和 返回值是保持一致的。
  6.         XxxMapper mapper = sqlSession.getMapper(XxxMapper.class);
  7.                 mapper.xxx(); // 执行的是该XxxMapper接口中的方法
复制代码
利用以上代码的前提是:XxxMapper.xml 文件中的 namespace 必须和 dao(mapper)接口的全限定名称一致,id 必须和 dao(mapper) 接口中方法名一致。

  • 注意:由于是对数据库进行了修改,删除,改动了,所以须要 commit() 提交给数据库,以及 close() 关闭资源
  • 须要注意的是:查询是会返回效果集的,所以我们须要在  查询标签当中,通过 resultType 属性指定返回的类型(如果没有效别名机制的话,要用全限定类名(带包名的))
    同时由于我们的数据表的字段的定名方式是下划线 ,部分数据表的字段名与我们设置的 ORM 映射的POJO类的属性名不一致,须要将他们二者的名字保持一致,所以我们须要利用 AS 定义别名,否则无法将对应数据表中的值,赋值到 对应的 POJO的类当中(这里是 Car 类当中)
  • 注意:由于我们仅仅是查询数据表中的信息,不涉及到对数据表的修改,删除操作,所以无需提交数据库commit,只要 close() 关闭资源就可以了。
  • 如果只有一个参数须要传的话,#{} 括号中的值,可以任意写(#{}括号的值不能空着,否则不编译无法通过),但最好见名知意。
4. 最后:

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


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

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

吴旭华

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