作為一名Java資深程式猿,最多的感受可能就是我們接觸了很多的業務,很多的技術,但是最終玩的還是資料。那麼對于操作資料庫中的資料,Java語言也陸續衍生出來許多架構,比如Jdbc、Hibernate、Mybatis、Mybatis-plus、springdatajpa等等。這些架構都對操作資料庫資料提供了很友好的支援。那麼,本篇内容主要來介紹下Mybatis架構是如何處理傳回結果集的。
一、環境準備
1. 引入依賴
在pom.xml中引入Mybatis相關jar依賴
<!--MyBatis架構-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2. 引入日志檔案
log4j日志級别如下:
A:off 最高等級,用于關閉所有日志記錄。
B:fatal 指出每個嚴重的錯誤事件将會導緻應用程式的退出。
C:error 指出雖然發生錯誤事件,但仍然不影響系統的繼續運作。
D:warn 表明會出現潛在的錯誤情形。
E:info 一般和在粗粒度級别上,強調應用程式的運作全程。
F:debug 一般用于細粒度級别上,對調試應用程式非常有幫助。
G:all 最低等級,用于打開所有日志記錄。
但log4j隻建議使用4個級别,優先級從高到低分别是:error>warn>info>debug
log4j.rootLogger =debug,systemOut,logFile
#輸出到控制台
log4j.appender.systemOut = org.apache.log4j.ConsoleAppender
log4j.appender.systemOut.layout = org.apache.log4j.PatternLayout
log4j.appender.systemOut.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.systemOut.Target = System.out
#輸出到檔案
log4j.appender.logFile = org.apache.log4j.FileAppender
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.logFile.File = E:/log/log4j.log
log4j.appender.logFile.Encoding = UTF-8
#将日志輸記錄到MySQL資料庫
#log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender
#log4j.appender.logDB.layout = org.apache.log4j.PatternLayout
#log4j.appender.logDB.Driver = com.mysql.jdbc.Driver
#log4j.appender.logDB.URL = jdbc:mysql://localhost:3306/log4j?characterEncoding=utf-8
#log4j.appender.logDB.User = root
#log4j.appender.logDB.Password = root
#log4j.appender.logDB.Sql = INSERT INTO t_log4j(project_name,create_date,level,category,file_name,thread_name,line,all_category,message)values('mybatis','%d{yyyy-MM-ddHH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')
3. 引入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>
<!--1、加載外部配置檔案-->
<properties resource="jdbc.properties"></properties>
<!--5、開啟駝峰命名-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--4、配置别名-->
<typeAliases>
<package name="com.swk.jdbcTemplate.entity"/>
</typeAliases>
<!--2、配置資料源-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="url" value="${jdbc.url}"/>
</dataSource>
</environment>
</environments>
<!--3、配置映射-->
<mappers>
<!--<mapper resource="mapper/EmpMapper.xml"/>-->
<package name="com.swk.mapper"/>
</mappers>
</configuration>
4. 編寫jdbc.properties檔案
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=123456
jdbc.url=jdbc:mysql://192.168.10.129:3306/mybatis-demo?characterEncoding=utf-8
二、代碼實作
1.編寫mapper接口
public interface StuMapper {
//1、傳回單個簡單類型資料
int getStuCount();
//2、傳回實體類對象
Stu getStuById(int stuId);
//3、傳回map類型
Map<String,Object> returnMap();
//4、傳回list類型
List<Stu> returnList();
//5、resultMap手動映射
Stu selectStuByRM(int id);
}
2.編寫mapper.xml檔案
<?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 namespace="com.swk.mapper.StuMapper">
<!--1 傳回單個簡單類型資料-->
<select id="getStuCount" resultType="int">
select count(0) from t_stu
</select>
<!--2 傳回實體類對象-->
<!-- 給每一個字段設定一個别名,讓别名和Java實體類中屬性名一緻 -->
<select id="getStuById" resultType="stu">
select id stuId,stu_name stuName,stu_sex stuSex,stu_age stuAge from t_stu where id = #{stuId}
</select>
<!--3 傳回map類型-->
<!--查詢年齡最大的學員的姓名、年齡、性别-->
<select id="returnMap" resultType="map">
select stu_name stuName,stu_sex stuSex,stu_age stuAge from t_stu where stu_age = (SELECT max(stu_age) from t_stu);
</select>
<!--4 傳回list類型-->
<select id="returnList" resultType="stu">
select id stuId,stu_name stuName,stu_sex stuSex,stu_age stuAge from t_stu
</select>
<!--5 傳回值使用resultMap-手動映射-->
<select id="selectStuByRM" resultMap="selectStuMap">
select * from t_stu where id = #{stuId}
</select>
<resultMap id="selectStuMap" type="com.swk.jdbcTemplate.entity.Stu">
<id column="id" property="stuId"/>
<result column="stu_name" property="stuName"/>
<result column="stu_sex" property="stuSex"/>
<result column="stu_age" property="stuAge"/>
</resultMap>
</mapper>
三、單元測試
1. 代碼準備:
@Before
public void init(){
// 加載核心配置檔案
String path = "mybatis-config.xml";
InputStream inputStream = Mybatis03ResultTest.class.getClassLoader().getResourceAsStream(path);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
stuMapper = sqlSession.getMapper(StuMapper.class);
}
@After
public void destory(){
sqlSession.commit();;
sqlSession.close();
}
2. 測試-傳回單個簡單類型資料
/**
* 1、傳回單個簡單類型資料
*/
@Test
public void getStuCount(){
System.out.println(stuMapper.getStuCount());
}
3. 測試-傳回實體類對象
/**
* 2、傳回實體類對象
*/
@Test
public void getStu(){
System.out.println(stuMapper.getStuById(1));
}
4. 測試-傳回map類型資料
/**
* 3、傳回map類型
* 适用于SQL查詢傳回的各個字段綜合起來并不和任何一個現有的實體類對應,沒法封裝到實體類對象中。
* 能夠封裝成實體類類型的,可以不使用Map類型
*/
@Test
public void returnMap(){
Map<String, Object> map = stuMapper.returnMap();
Set<Map.Entry<String, Object>> entries = map.entrySet();
for (Map.Entry<String, Object> entry : entries) {
String key = entry.getKey();
Object value = entry.getValue();
System.out.println(key + "," + value);
}
}
5. 測試-傳回list類型資料
/**
* 4、傳回list類型
* 查詢結果傳回多個實體類對象,希望把多個實體類對象放在List集合中傳回。
* 此時不需要任何特殊處理,在resultType屬性中還是設定實體類類型即可
*/
@Test
public void returnList()
List<Stu> stus = stuMapper.returnList();
for (Stu stu : stus) {
System.out.println(stu);
}
}
6. 測試-傳回resultMap結果集處理
/**
* 5、資料庫表字段和實體類屬性對應關系
* ① 全局配置自動識别駝峰式命名規則
* ② 别名,将字段的别名設定成和實體類屬性一緻
* ③ 使用resultMap
*/
@Test
public void selectStuByRM ()
Stu stu = stuMapper.selectStuByRM(1);
System.out.println(stu);
}
傳回值處理-總結
MyBatis中傳回值類型分兩種 1.1 傳回一般資料類型:resultType。1.2 傳回複雜資料類型:resultMap。
兩種類型使用分析 2.1 resultType主要用于接收處理傳回值類型為一般資料類型的資料,比如基本資料類型,自定義類類型,List或者Map集合類型等。2.2 resultMap主要用于接收處理實體對象之間存在關聯關系的資料。比如員工和部門,員工隸屬于某個部門,那麼在實體類屬性聲明中,我們需要将關聯關系定義出來。這時,如果我們想要同時擷取員工資訊和所屬部門資訊,那麼使用resultType這種傳回值類型去接收結果集已經不能滿足實際業務了,那麼我們就需要借助resultMap來處理。