MyBatis中的接口代理機制及其使用方式
MyBatis中的接口代理機制及其使用
MyBatis 中的接口代理類機制,MyBatis 框架中使用了動態(tài)代理的設(shè)計模式,讓我們可以不用寫,對應(yīng)XxxMapper.java 接口的實現(xiàn)類,而是通過動態(tài)代理的方式,讓MyBatis 自動為我們生成對應(yīng)實現(xiàn)了該 XxxMapper.java接口的實現(xiàn)類,這個動態(tài)代理實現(xiàn)的類,我們可以直接使用。
核心代碼:
// 獲取到 SqlSessionFactoryBuilder SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); // 獲取到SqlSessionFactory 對象 // SQlsessionFactory對象,一個SqlSessionFactory對應(yīng)一個 environment, 一個environment通常是一個數(shù)據(jù)庫 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", "新能源"); // 面向接口編程,獲取接口的代理對象,也就是接口的實現(xiàn)類,實現(xiàn)類該接口中的方法 // 需要注意的是參數(shù)的 Xxxmapper.class 和 返回值是保持一致的。 XxxMapper mapper = sqlSession.getMapper(XxxMapper.class); mapper.xxx(); // 執(zhí)行的是該XxxMapper接口中的方法
// 獲取到 SalSession 會話,一次會話一個 SqlSession sqlSession = sessionFactory.openSession(); Car car = new Car(null, "999", "奧迪", 3.0, "2000-10-10", "新能源"); // 面向接口編程,獲取接口的代理對象,也就是接口的實現(xiàn)類,實現(xiàn)類該接口中的方法 // 需要注意的是參數(shù)的 Xxxmapper.class 和 返回值是保持一致的。 XxxMapper mapper = sqlSession.getMapper(XxxMapper.class); mapper.xxx(); // 執(zhí)行的是該XxxMapper接口中的方法
使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace
必須和 dao(mapper)
接口的全限定名稱一致,id
必須和 dao(mapper)
接口中方法名一致。
比如:我們這里的是:
CarMappe.xml
XxxMapper.xml 文件中的 namespace
必須和 dao(mapper)
接口的全限定名稱一致
對應(yīng)的接口上的方法名,id 必須
和 dao(mapper)
接口中方法名一致。
使用的是 POJO 屬性類賦值的話,#{} 的括號中的值,必須是 POJO類當(dāng)中的屬性名,比如這里我們用的是 Car ,則#{}括號中的值,則必須是 Car 的屬性名。同時 #{} 括號中一定要有值(就算只有一個參數(shù),也要有值(隨便寫都要有值),才行,不然編譯無法通過)
實操
下面我們使用 MyBatis 的接口代理機制,對數(shù)據(jù)庫進行CRUD,(增刪改查)的操作。
1.準(zhǔn)備工作
數(shù)據(jù)表結(jié)構(gòu)的設(shè)計,數(shù)據(jù)表名為:t_car
t_car 表中的數(shù)據(jù)信息:
在pom.xml
文件當(dāng)中配置相關(guān)的依賴的 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的依賴,這個日志框架實現(xiàn)了slf4j 規(guī)范--> <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> 還可以將這個包下的所有的類的全部自動起別名,別名就是簡名,不區(qū)分大小寫 --> <package name="com.rainbowsea.mybatis.pojo"/> </typeAliases> <environments default="mybatis"> <environment id="mybatis"> <!-- MANAGED 沒有用第三框架管理的話,都是會被提交的,沒有事務(wù)上的管理了 --> <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 包名掃描,但是同樣的:對應(yīng)接口路徑要一致,接口名一致--> <mapper resource="CarMapper.xml"></mapper> </mappers> </configuration>
對照 t_car 創(chuàng)建的ORM 映射的 Car 類
注意:在MyBatis 當(dāng)中對應(yīng)的ORM ,一般在框架里對應(yīng)的 Bean實體類,一定要實現(xiàn)該 set 和 get 方法以及無參數(shù)構(gòu)造方法,無法框架無法使用反射機制,進行操作 。
建議用包裝類,這樣可以防止 Null的問題,因為(簡單類型 int num = null ,是不可以賦值為 null)的編譯無法通過
package com.rainbowsea.mybatis.pojo; public class Car { // 數(shù)據(jù)庫表當(dāng)中的字段應(yīng)該和pojo類的屬性一一對應(yīng) // 建議使用包裝類,這樣可以防止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; } }
對應(yīng)操作實現(xiàn)CRUD(增刪改查)的接口(這里是:CarMapper接口),在MyBtis 當(dāng)中 ,關(guān)于 CRUD(增刪改查)操作的接口/實現(xiàn)類,都是 mapper
結(jié)尾的作為持久層,而在 MVC的三層架構(gòu)中,則是以 dao
為后綴作為CRUD(增刪改查)操作的接口/實現(xiàn)類。
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); /** * 根據(jù)id 刪除 Car * @param id * @return */ int deleteById(Long id); /** * 修改汽車信息 * @param car * @return */ int update(Car car); /** * 根據(jù)id查詢汽車信息 * @param id * @return */ Car selectById(Long id); /** * 獲取所有的汽車信息 * @return */ List<Car> selectAll(); }
2.insert 增加操作
對應(yīng) CarMapper 接口中的 insert( ) 抽象方法。
public interface CarMapper { /** * 新增 Car * @param car * @return */ int insert(Car car); }
對應(yīng) 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 一定要是:對應(yīng)的接口的全限定類名--> <mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper"> <!-- id 要是 namespace 對應(yīng)接口上的方法名: --> <insert id="insert" parameterType="com.rainbowsea.mybatis.pojo.Car"> insert into t_car values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType}) </insert> </mapper>
Java當(dāng)中編程運行程序:
注意:因為是對數(shù)據(jù)庫進行了修改,所以需要 commit() 提交給數(shù)據(jù)庫,以及 close() 關(guān)閉資源
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對應(yīng)一個 environment, 一個environment通常是一個數(shù)據(jù)庫 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", "新能源"); // 面向接口編程,獲取接口的代理對象,也就是接口的實現(xiàn)類,實現(xiàn)類該接口中的方法 CarMapper mapper = sqlSession.getMapper(CarMapper.class); int count = mapper.insert(car); System.out.println(count); sqlSession.commit(); sqlSession.close(); } }
3.delete 刪除操作
根據(jù) id 刪除一條記錄,刪除id為 124的一條記錄。
對應(yīng) CarMapper 接口中的 deleteById( Long id) 抽象方法。
public interface CarMapper { /** * 新增 Car * @param car * @return */ int insert(Car car); /** * 根據(jù)id 刪除 Car * @param id * @return */ int deleteById(Long id); }
對應(yīng) 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 一定要是:對應(yīng)的接口的全限定類名--> <mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper"> <!-- 如果只有一個參數(shù)需要傳的話,#{} 括號中的值,可以隨便寫,但最后見名知意--> <delete id="deleteById" > delete from t_car where id=#{id} </delete> </mapper>
Java當(dāng)中編程運行程序:
注意:因為是對數(shù)據(jù)庫進行了修改,所以需要 commit() 提交給數(shù)據(jù)庫,以及 close() 關(guān)閉資源
刪除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對應(yīng)一個 environment, 一個environment通常是一個數(shù)據(jù)庫 SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis"); // 獲取到 SalSession 會話,一次會話一個 SqlSession sqlSession = sessionFactory.openSession(); // 面向接口編程,獲取接口的代理對象,也就是接口的實現(xiàn)類,實現(xiàn)類該接口中的方法 CarMapper mapper = sqlSession.getMapper(CarMapper.class); // 刪除id為 124的一條記錄。 int count = mapper.deleteById(124L); sqlSession.commit(); // 提交給數(shù)據(jù)庫 sqlSession.close(); // 關(guān)閉資源 System.out.println(count); } }
4.update 修改操作
根據(jù) id 修改記錄信息。
將 id 為 128的 brand 改為小米su7, guide_price 改為 21.00 , 時間改為 2024-03-28
對應(yīng) 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); }
對應(yīng) 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 一定要是:對應(yīng)的接口的全限定類名--> <mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper"> <!-- id 要是 namespace 對應(yīng)接口上的方法名: --> <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當(dāng)中編程運行程序:
注意:因為是對數(shù)據(jù)庫進行了修改,所以需要 commit() 提交給數(shù)據(jù)庫,以及 close() 關(guān)閉資源
將 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對應(yīng)一個 environment, 一個environment通常是一個數(shù)據(jù)庫 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", "新能源"); // 面向接口編程,獲取接口的代理對象,也就是接口的實現(xiàn)類,實現(xiàn)類該接口中的方法 CarMapper mapper = sqlSession.getMapper(CarMapper.class); int count = mapper.update(car); sqlSession.commit(); // 提交給數(shù)據(jù)庫 sqlSession.close(); } }
5.select 查詢一條記錄操作
根據(jù) id 查詢一條記錄。
查詢 id 為 130 的一條記錄。
對應(yīng) CarMapper 接口中的 selectById ( Long id) 抽象方法。
package com.rainbowsea.mybatis.mapper; import com.rainbowsea.mybatis.pojo.Car; import java.util.List; public interface CarMapper { /** * 根據(jù)id查詢汽車信息 * @param id * @return */ Car selectById(Long id); }
對應(yīng) CarMapper.xml SQL語句映射文件,上編寫 select 查詢 的 SQL語句。
使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace
必須和 dao(mapper)
接口的全限定名稱一致,id
必須和 dao(mapper)
接口中方法名一致。
需要注意的是:查詢是會返回結(jié)果集的,所以我們需要在 <select> 查詢標(biāo)簽當(dāng)中,通過 resultType 屬性指定返回的類型(如果沒有用別名機制的話,要用全限定類名(帶包名的)) 。
同時由于我們的數(shù)據(jù)表的字段的命名方式是下劃線 ,部分?jǐn)?shù)據(jù)表的字段名與我們設(shè)置的 ORM 映射的POJO類的屬性名不一致,需要將他們二者的名字保持一致,所以我們需要使用 AS 定義別名,不然無法將對應(yīng)數(shù)據(jù)表中的值,賦值到 對應(yīng)的 POJO的類當(dāng)中(這里是 Car 類當(dāng)中)
<?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 一定要是:對應(yīng)的接口的全限定類名--> <mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper"> <!-- id 要是 namespace 對應(yīng)接口上的方法名: --> <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當(dāng)中編程運行程序:
注意:因為我們僅僅是查詢數(shù)據(jù)表中的信息,不涉及到對數(shù)據(jù)表的修改,刪除操作,所以無需提交數(shù)據(jù)庫commit,只要 close() 關(guān)閉資源就可以了
查詢 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對應(yīng)一個 environment, 一個environment通常是一個數(shù)據(jù)庫 SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis"); // 獲取到 SalSession 會話,一次會話一個 SqlSession sqlSession = sessionFactory.openSession(); // 面向接口編程,獲取接口的代理對象,也就是接口的實現(xiàn)類,實現(xiàn)類該接口中的方法 CarMapper mapper = sqlSession.getMapper(CarMapper.class); Car car = mapper.selectById(130L); System.out.println(car); sqlSession.close(); } }
6.select 查詢多條記錄操作
查詢t_car 數(shù)據(jù)表中的所有信息。
對應(yīng) 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(); }
對應(yīng) CarMapper.xml SQL語句映射文件,上編寫 select 查詢 的 SQL語句。
使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace
必須和 dao(mapper)
接口的全限定名稱一致,id
必須和 dao(mapper)
接口中方法名一致。
需要注意的是:查詢是會返回結(jié)果集的,所以我們需要在 <select> 查詢標(biāo)簽當(dāng)中,通過 resultType 屬性指定返回的類型(如果沒有用別名機制的話,要用全限定類名(帶包名的)) 。
同時由于我們的數(shù)據(jù)表的字段的命名方式是下劃線 ,部分?jǐn)?shù)據(jù)表的字段名與我們設(shè)置的 ORM 映射的POJO類的屬性名不一致,需要將他們二者的名字保持一致,所以我們需要使用 AS 定義別名,不然無法將對應(yīng)數(shù)據(jù)表中的值,賦值到 對應(yīng)的 POJO的類當(dāng)中(這里是 Car 類當(dāng)中)
<?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 一定要是:對應(yīng)的接口的全限定類名--> <mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper"> <!-- id 要是 namespace 對應(yīng)接口上的方法名: --> <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當(dāng)中編程運行程序:
注意:因為我們僅僅是查詢數(shù)據(jù)表中的信息,不涉及到對數(shù)據(jù)表的修改,刪除操作,所以無需提交數(shù)據(jù)庫commit,只要 close() 關(guān)閉資源就可以了
查詢 t_car 數(shù)據(jù)表中的所有記錄。
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對應(yīng)一個 environment, 一個environment通常是一個數(shù)據(jù)庫 SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis"); // 獲取到 SalSession 會話,一次會話一個 SqlSession sqlSession = sessionFactory.openSession(); // 面向接口編程,獲取接口的代理對象,也就是接口的實現(xiàn)類,實現(xiàn)類該接口中的方法 CarMapper mapper = sqlSession.getMapper(CarMapper.class); List<Car> cars = mapper.selectAll(); cars.forEach(car -> { System.out.println(car); }); sqlSession.close(); } }
總結(jié)
// 獲取到 SalSession 會話,一次會話一個 SqlSession sqlSession = sessionFactory.openSession(); Car car = new Car(null, "999", "奧迪", 3.0, "2000-10-10", "新能源"); // 面向接口編程,獲取接口的代理對象,也就是接口的實現(xiàn)類,實現(xiàn)類該接口中的方法 // 需要注意的是參數(shù)的 Xxxmapper.class 和 返回值是保持一致的。 XxxMapper mapper = sqlSession.getMapper(XxxMapper.class); mapper.xxx(); // 執(zhí)行的是該XxxMapper接口中的方法
使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace
必須和 dao(mapper)
接口的全限定名稱一致,id
必須和 dao(mapper)
接口中方法名一致。
注意:因為是對數(shù)據(jù)庫進行了修改,刪除,改動了,所以需要 commit() 提交給數(shù)據(jù)庫,以及 close() 關(guān)閉資源
需要注意的是:查詢是會返回結(jié)果集的,所以我們需要在 <select> 查詢標(biāo)簽當(dāng)中,通過 resultType 屬性指定返回的類型(如果沒有用別名機制的話,要用全限定類名(帶包名的)) 。
同時由于我們的數(shù)據(jù)表的字段的命名方式是下劃線 ,部分?jǐn)?shù)據(jù)表的字段名與我們設(shè)置的 ORM 映射的POJO類的屬性名不一致,需要將他們二者的名字保持一致,所以我們需要使用 AS 定義別名,不然無法將對應(yīng)數(shù)據(jù)表中的值,賦值到 對應(yīng)的 POJO的類當(dāng)中(這里是 Car 類當(dāng)中)
注意:因為我們僅僅是查詢數(shù)據(jù)表中的信息,不涉及到對數(shù)據(jù)表的修改,刪除操作,所以無需提交數(shù)據(jù)庫commit,只要 close() 關(guān)閉資源就可以了。
如果只有一個參數(shù)需要傳的話,#{} 括號中的值,可以隨便寫(#{}括號的值不能空著,不然不編譯無法通過),但最好見名知意。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java的動態(tài)分派和靜態(tài)分派的實現(xiàn)
這篇文章主要介紹了Java的動態(tài)分派和靜態(tài)分派的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03SpringBoot實現(xiàn)類似鉤子函數(shù)的方法
這篇文章主要給大家介紹了關(guān)于SpringBoot實現(xiàn)類似鉤子函數(shù)的方法,文中通過代碼示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-04-04springboot logback調(diào)整mybatis日志級別無效的解決
這篇文章主要介紹了springboot logback調(diào)整mybatis日志級別無效的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10SpringBoot?AOP?Redis實現(xiàn)延時雙刪功能實戰(zhàn)
本文主要介紹了SpringBoot?AOP?Redis實現(xiàn)延時雙刪功能實戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Springboot整合Swagger3全注解配置(springdoc-openapi-ui)
本文主要介紹了Springboot整合Swagger3全注解配置(springdoc-openapi-ui),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03