1. MyBatis中的介面代理機制及其使用 @目錄1. MyBatis中的介面代理機制及其使用2. 實操2.1 準備工作2.2 insert 增加操作2.3 delete 刪除操作2.4 update 修改操作2.5 select 查詢一條記錄操作2.6 select 查詢多條記錄操作3. 總結: ...
1. MyBatis中的介面代理機制及其使用
@
目錄MyBatis 中的介面代理類機制,MyBatis 框架中使用了動態代理的設計模式,讓我們可以不用寫,對應XxxMapper.java 介面的實現類,而是通過動態代理的方式,讓MyBatis 自動為我們生成對應實現了該 XxxMapper.java介面的實現類,這個動態代理實現的類,我們可以直接使用。
核心代碼:
// 獲取到 SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 獲取到SqlSessionFactory 對象
// SQlsessionFactory對象,一個SqlSessionFactory對應一個 environment, 一個environment通常是一個資料庫
SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
// 獲取到 SalSession 會話,一次會話一個
SqlSession sqlSession = sessionFactory.openSession();
Car car = new Car(null, "999", "奧迪", 3.0, "2000-10-10", "新能源");
// 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
// 需要註意的是參數的 Xxxmapper.class 和 返回值是保持一致的。
XxxMapper mapper = sqlSession.getMapper(XxxMapper.class);
mapper.xxx(); // 執行的是該XxxMapper介面中的方法
// 獲取到 SalSession 會話,一次會話一個
SqlSession sqlSession = sessionFactory.openSession();
Car car = new Car(null, "999", "奧迪", 3.0, "2000-10-10", "新能源");
// 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
// 需要註意的是參數的 Xxxmapper.class 和 返回值是保持一致的。
XxxMapper mapper = sqlSession.getMapper(XxxMapper.class);
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 包如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.rainbowsea</groupId>
<artifactId>mybatis-005-crud-blog</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<!-- mybatis 的依賴-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- 引入 logback的依賴,這個日誌框架實現了slf4j 規範-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
</dependencies>
</project>
配置 logback 的配置文件,用於列印顯示,我們的日誌信息,方便我們查看我們的運行過程,效果。
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!-- 控制台輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字元寬度%msg:日誌消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--mybatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- 日誌輸出級別,logback日誌級別包括五個:TRACE < DEBUG < INFO < WARN < ERROR -->
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
配置 MyBatis 的核心配置文件,
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 起別名-->
<typeAliases>
<!-- 使用 <package> 還可以將這個包下的所有的類的全部自動起別名,別名就是簡名,不區分大小寫 -->
<package name="com.rainbowsea.mybatis.pojo"/>
</typeAliases>
<environments default="mybatis">
<environment id="mybatis">
<!-- MANAGED 沒有用第三框架管理的話,都是會被提交的,沒有事務上的管理了 -->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="MySQL123"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 這裡也是可以使用 package 包名掃描,但是同樣的:對應介面路徑要一致,介面名一致-->
<mapper resource="CarMapper.xml"></mapper>
</mappers>
</configuration>
對照 t_car 創建的ORM 映射的 Car 類
註意:在MyBatis 當中對應的ORM ,一般在框架里對應的 Bean實體類,一定要實現該 set 和 get 方法以及無參數構造方法,無法框架無法使用反射機制,進行操作 。
建議用包裝類,這樣可以防止 Null的問題,因為(簡單類型 int num = null ,是不可以賦值為 null)的編譯無法通過
package com.rainbowsea.mybatis.pojo;
public class Car {
// 資料庫表當中的欄位應該和pojo類的屬性一一對應
// 建議使用包裝類,這樣可以防止null的問題
private Long id;
private String carNum;
private String brand;
private Double guidePrice;
private String produceTime;
private String carType;
public Car() {
}
public Car(Long id, String carNum, String brand, Double guidePrice, String produceTime, String carType) {
this.id = id;
this.carNum = carNum;
this.brand = brand;
this.guidePrice = guidePrice;
this.produceTime = produceTime;
this.carType = carType;
}
@Override
public String toString() {
return "Car{" +
"id=" + id +
", carNum='" + carNum + '\'' +
", brand='" + brand + '\'' +
", guidePrice=" + guidePrice +
", produceTime='" + produceTime + '\'' +
", catType='" + carType + '\'' +
'}';
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCarNum() {
return carNum;
}
public void setCarNum(String carNum) {
this.carNum = carNum;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Double getGuidePrice() {
return guidePrice;
}
public void setGuidePrice(Double guidePrice) {
this.guidePrice = guidePrice;
}
public String getProduceTime() {
return produceTime;
}
public void setProduceTime(String produceTime) {
this.produceTime = produceTime;
}
public String getcarType() {
return carType;
}
public void setcarType(String catType) {
this.carType = catType;
}
}
對應操作實現CRUD(增刪改查)的介面(這裡是:CarMapper介面),在MyBtis 當中 ,關於 CRUD(增刪改查)操作的介面/實現類,都是 mapper
結尾的作為持久層,而在 MVC的三層架構中,則是以 dao
為尾碼作為CRUD(增刪改查)操作的介面/實現類。
package com.rainbowsea.mybatis.mapper;
import com.rainbowsea.mybatis.pojo.Car;
import java.util.List;
public interface CarMapper {
/**
* 新增 Car
* @param car
* @return
*/
int insert(Car car);
/**
* 根據id 刪除 Car
* @param id
* @return
*/
int deleteById(Long id);
/**
* 修改汽車信息
* @param car
* @return
*/
int update(Car car);
/**
* 根據id查詢汽車信息
* @param id
* @return
*/
Car selectById(Long id);
/**
* 獲取所有的汽車信息
* @return
*/
List<Car> selectAll();
}
2.2 insert 增加操作
對應 CarMapper 介面中的 insert( ) 抽象方法。
public interface CarMapper {
/**
* 新增 Car
* @param car
* @return
*/
int insert(Car car);
}
對應 CarMapper.xml SQL語句映射文件,上編寫 insert 插入的 SQL語句。
<?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">
<!--namespace 一定要是:對應的介面的全限定類名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">
<!-- id 要是 namespace 對應介面上的方法名: -->
<insert id="insert" parameterType="com.rainbowsea.mybatis.pojo.Car">
insert into t_car values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>
</mapper>
Java當中編程運行程式:
註意:因為是對資料庫進行了修改,所以需要 commit() 提交給資料庫,以及 close() 關閉資源
package com.rainbowsea.mybatis.test;
import com.rainbowsea.mybatis.mapper.CarMapper;
import com.rainbowsea.mybatis.pojo.Car;
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.Test;
import java.io.IOException;
public class CarMapperTest {
@Test
public void testInsert() throws IOException {
// 獲取到 SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 獲取到SqlSessionFactory 對象
// SQlsessionFactory對象,一個SqlSessionFactory對應一個 environment, 一個environment通常是一個資料庫
SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
// 獲取到 SalSession 會話,一次會話一個
SqlSession sqlSession = sessionFactory.openSession();
Car car = new Car(null, "999", "奧迪", 3.0, "2000-10-10", "新能源");
// 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
int count = mapper.insert(car);
System.out.println(count);
sqlSession.commit();
sqlSession.close();
}
}
2.3 delete 刪除操作
根據 id 刪除一條記錄,刪除id為 124的一條記錄。
對應 CarMapper 介面中的 deleteById( Long id) 抽象方法。
public interface CarMapper {
/**
* 新增 Car
* @param car
* @return
*/
int insert(Car car);
/**
* 根據id 刪除 Car
* @param id
* @return
*/
int deleteById(Long id);
}
對應 CarMapper.xml SQL語句映射文件,上編寫 delete 刪除的 SQL語句。
使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace
必須和 dao(mapper)
介面的全限定名稱一致,id
必須和 dao(mapper)
介面中方法名一致。
<?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">
<!--namespace 一定要是:對應的介面的全限定類名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">
<!-- 如果只有一個參數需要傳的話,#{} 括弧中的值,可以隨便寫,但最後見名知意-->
<delete id="deleteById" >
delete from t_car where id=#{id}
</delete>
</mapper>
Java當中編程運行程式:
註意:因為是對資料庫進行了修改,所以需要 commit() 提交給資料庫,以及 close() 關閉資源
刪除id為 124的一條記錄。
import org.junit.Test;
import java.io.IOException;
public class CarMapperTest {
@Test
public void testDeleteById() throws IOException {
// 獲取到 SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 獲取到SqlSessionFactory 對象
// SQlsessionFactory對象,一個SqlSessionFactory對應一個 environment, 一個environment通常是一個資料庫
SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
// 獲取到 SalSession 會話,一次會話一個
SqlSession sqlSession = sessionFactory.openSession();
// 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
// 刪除id為 124的一條記錄。
int count = mapper.deleteById(124L);
sqlSession.commit(); // 提交給資料庫
sqlSession.close(); // 關閉資源
System.out.println(count);
}
}
2.4 update 修改操作
根據 id 修改記錄信息。
將 id 為 128的 brand 改為小米su7, guide_price 改為 21.00 , 時間改為 2024-03-28
對應 CarMapper 介面中的 update( ) 抽象方法。
package com.rainbowsea.mybatis.mapper;
import com.rainbowsea.mybatis.pojo.Car;
import java.util.List;
public interface CarMapper {
/**
* 修改汽車信息
* @param car
* @return
*/
int update(Car car);
}
對應 CarMapper.xml SQL語句映射文件,上編寫 update 修改的 SQL語句。
使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace
必須和 dao(mapper)
介面的全限定名稱一致,id
必須和 dao(mapper)
介面中方法名一致。
<?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">
<!--namespace 一定要是:對應的介面的全限定類名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">
<!-- id 要是 namespace 對應介面上的方法名: -->
<update id="update">
update t_car
set car_num=#{carNum},
brand=#{brand},
guide_price=#{guidePrice},
produce_time=#{produceTime},
car_type=#{carType}
where id = #{id}
</update>
</mapper>
Java當中編程運行程式:
註意:因為是對資料庫進行了修改,所以需要 commit() 提交給資料庫,以及 close() 關閉資源
將 id 為 128的 brand 改為小米su7, guide_price 改為 21.00 , 時間改為 2024-03-28
import com.rainbowsea.mybatis.mapper.CarMapper;
import com.rainbowsea.mybatis.pojo.Car;
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.Test;
import java.io.IOException;
public class CarMapperTest {
@Test
public void testUpdate() throws IOException {
// 獲取到 SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 獲取到SqlSessionFactory 對象
// SQlsessionFactory對象,一個SqlSessionFactory對應一個 environment, 一個environment通常是一個資料庫
SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
// 獲取到 SalSession 會話,一次會話一個
SqlSession sqlSession = sessionFactory.openSession();
Car car = new Car(128L, "999", "小米su7", 21.0, "2022-03-28", "新能源");
// 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
int count = mapper.update(car);
sqlSession.commit(); // 提交給資料庫
sqlSession.close();
}
}
2.5 select 查詢一條記錄操作
根據 id 查詢一條記錄。
查詢 id 為 130 的一條記錄。
對應 CarMapper 介面中的 selectById ( Long id) 抽象方法。
package com.rainbowsea.mybatis.mapper;
import com.rainbowsea.mybatis.pojo.Car;
import java.util.List;
public interface CarMapper {
/**
* 根據id查詢汽車信息
* @param id
* @return
*/
Car selectById(Long id);
}
對應 CarMapper.xml SQL語句映射文件,上編寫 select 查詢 的 SQL語句。
使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace
必須和 dao(mapper)
介面的全限定名稱一致,id
必須和 dao(mapper)
介面中方法名一致。
需要註意的是:查詢是會返回結果集的,所以我們需要在 <select> 查詢標簽當中,通過 resultType 屬性指定返回的類型(如果沒有用別名機制的話,要用全限定類名(帶包名的)) 。
同時由於我們的數據表的欄位的命名方式是下劃線 ,部分數據表的欄位名與我們設置的 ORM 映射的POJO類的屬性名不一致,需要將他們二者的名字保持一致,所以我們需要使用 AS 定義別名,不然無法將對應數據表中的值,賦值到 對應的 POJO的類當中(這裡是 Car 類當中)
<?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">
<!--namespace 一定要是:對應的介面的全限定類名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">
<!-- id 要是 namespace 對應介面上的方法名: -->
<select id="selectById" resultType="com.rainbowsea.mybatis.pojo.Car">
select id,
car_num as carNum,
brand,
guide_price as guidePrice,
produce_time as produceTime,
car_type as carType
from t_car
where id = #{id}
</select>
</mapper>
Java當中編程運行程式:
註意:因為我們僅僅是查詢數據表中的信息,不涉及到對數據表的修改,刪除操作,所以無需提交資料庫commit,只要 close() 關閉資源就可以了
查詢 id 為 130 的一條記錄。
import com.rainbowsea.mybatis.mapper.CarMapper;
import com.rainbowsea.mybatis.pojo.Car;
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.Test;
import java.io.IOException;
public class CarMapperTest {
@Test
public void testSelectById() throws IOException {
// 獲取到 SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 獲取到SqlSessionFactory 對象
// SQlsessionFactory對象,一個SqlSessionFactory對應一個 environment, 一個environment通常是一個資料庫
SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
// 獲取到 SalSession 會話,一次會話一個
SqlSession sqlSession = sessionFactory.openSession();
// 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
Car car = mapper.selectById(130L);
System.out.println(car);
sqlSession.close();
}
}
2.6 select 查詢多條記錄操作
查詢t_car 數據表中的所有信息。
對應 CarMapper 介面中的 selectAll( Long id) 抽象方法。返回的是一個List 集合
package com.rainbowsea.mybatis.mapper;
import com.rainbowsea.mybatis.pojo.Car;
import java.util.List;
public interface CarMapper {
/**
* 獲取所有的汽車信息
* @return
*/
List<Car> selectAll();
}
對應 CarMapper.xml SQL語句映射文件,上編寫 select 查詢 的 SQL語句。
使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace
必須和 dao(mapper)
介面的全限定名稱一致,id
必須和 dao(mapper)
介面中方法名一致。
需要註意的是:查詢是會返回結果集的,所以我們需要在 <select> 查詢標簽當中,通過 resultType 屬性指定返回的類型(如果沒有用別名機制的話,要用全限定類名(帶包名的)) 。
同時由於我們的數據表的欄位的命名方式是下劃線 ,部分數據表的欄位名與我們設置的 ORM 映射的POJO類的屬性名不一致,需要將他們二者的名字保持一致,所以我們需要使用 AS 定義別名,不然無法將對應數據表中的值,賦值到 對應的 POJO的類當中(這裡是 Car 類當中)
<?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">
<!--namespace 一定要是:對應的介面的全限定類名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">
<!-- id 要是 namespace 對應介面上的方法名: -->
<select id="selectAll" resultType="com.rainbowsea.mybatis.pojo.Car">
select id,
car_num as carNum,
brand,
guide_price as guidePrice,
produce_time as produceTime,
car_type as carType
from t_car
</select>
</mapper>
Java當中編程運行程式:
註意:因為我們僅僅是查詢數據表中的信息,不涉及到對數據表的修改,刪除操作,所以無需提交資料庫commit,只要 close() 關閉資源就可以了
查詢 t_car 數據表中的所有記錄。
import com.rainbowsea.mybatis.mapper.CarMapper;
import com.rainbowsea.mybatis.pojo.Car;
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.Test;
import java.io.IOException;
import java.util.List;
public class CarMapperTest {
@Test
public void testSelectAll() throws IOException {
// 獲取到 SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 獲取到SqlSessionFactory 對象
// SQlsessionFactory對象,一個SqlSessionFactory對應一個 environment, 一個environment通常是一個資料庫
SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
// 獲取到 SalSession 會話,一次會話一個
SqlSession sqlSession = sessionFactory.openSession();
// 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
List<Car> cars = mapper.selectAll();
cars.forEach(car -> {
System.out.println(car);
});
sqlSession.close();
}
}
3. 總結:
// 獲取到 SalSession 會話,一次會話一個 SqlSession sqlSession = sessionFactory.openSession(); Car car = new Car(null, "999", "奧迪", 3.0, "2000-10-10", "新能源"); // 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法 // 需要註意的是參數的 Xxxmapper.class 和 返回值是保持一致的。 XxxMapper mapper = sqlSession.getMapper(XxxMapper.class); mapper.xxx(); // 執行的是該XxxMapper介面中的方法
使用以上代碼的前提是:XxxMapper.xml 文件中的
namespace
必須和dao(mapper)
介面的全限定名稱一致,id
必須和dao(mapper)
介面中方法名一致。
註意:因為是對資料庫進行了修改,刪除,改動了,所以需要 commit() 提交給資料庫,以及 close() 關閉資源
需要註意的是:查詢是會返回結果集的,所以我們需要在 <select> 查詢標簽當中,通過 resultType 屬性指定返回的類型(如果沒有用別名機制的話,要用全限定類名(帶包名的)) 。
同時由於我們的數據表的欄位的命名方式是下劃線 ,部分數據表的欄位名與我們設置的 ORM 映射的POJO類的屬性名不一致,需要將他們二者的名字保持一致,所以我們需要使用 AS 定義別名,不然無法將對應數據表中的值,賦值到 對應的 POJO的類當中(這裡是 Car 類當中)
註意:因為我們僅僅是查詢數據表中的信息,不涉及到對數據表的修改,刪除操作,所以無需提交資料庫commit,只要 close() 關閉資源就可以了。
如果只有一個參數需要傳的話,#{} 括弧中的值,可以隨便寫(#{}括弧的值不能空著,不然不編譯無法通過),但最好見名知意。
4. 最後:
“在這個最後的篇章中,我要表達我對每一位讀者的感激之情。你們的關註和回覆是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮鬥。感謝你們,我們總會在某個時刻再次相遇。”