天天看點

僞小白帶你拿捏每種Mybatis結果集的映射方式及使用!

作者:尚矽谷教育

作為一名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')

僞小白帶你拿捏每種Mybatis結果集的映射方式及使用!

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());

}

僞小白帶你拿捏每種Mybatis結果集的映射方式及使用!

3. 測試-傳回實體類對象

/**

* 2、傳回實體類對象

*/

@Test

public void getStu(){

System.out.println(stuMapper.getStuById(1));

}

僞小白帶你拿捏每種Mybatis結果集的映射方式及使用!

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);

}

}

僞小白帶你拿捏每種Mybatis結果集的映射方式及使用!

5. 測試-傳回list類型資料

/**

* 4、傳回list類型

* 查詢結果傳回多個實體類對象,希望把多個實體類對象放在List集合中傳回。

* 此時不需要任何特殊處理,在resultType屬性中還是設定實體類類型即可

*/

@Test

public void returnList()

List<Stu> stus = stuMapper.returnList();

for (Stu stu : stus) {

System.out.println(stu);

}

}

僞小白帶你拿捏每種Mybatis結果集的映射方式及使用!

6. 測試-傳回resultMap結果集處理

/**

* 5、資料庫表字段和實體類屬性對應關系

* ① 全局配置自動識别駝峰式命名規則

* ② 别名,将字段的别名設定成和實體類屬性一緻

* ③ 使用resultMap

*/

@Test

public void selectStuByRM ()

Stu stu = stuMapper.selectStuByRM(1);

System.out.println(stu);

}

僞小白帶你拿捏每種Mybatis結果集的映射方式及使用!

傳回值處理-總結

MyBatis中傳回值類型分兩種 1.1 傳回一般資料類型:resultType。1.2 傳回複雜資料類型:resultMap。

兩種類型使用分析 2.1 resultType主要用于接收處理傳回值類型為一般資料類型的資料,比如基本資料類型,自定義類類型,List或者Map集合類型等。2.2 resultMap主要用于接收處理實體對象之間存在關聯關系的資料。比如員工和部門,員工隸屬于某個部門,那麼在實體類屬性聲明中,我們需要将關聯關系定義出來。這時,如果我們想要同時擷取員工資訊和所屬部門資訊,那麼使用resultType這種傳回值類型去接收結果集已經不能滿足實際業務了,那麼我們就需要借助resultMap來處理。