Java?MyBatis傳出參數(shù)resultType和resultMap解讀
MyBatis輸出參數(shù) resultType 和 resultMap
我們需要在 mybatis-config.xml 文件中加如下配置
<!--定義別名--> ? ? <typeAliases> ? ? ? ? <!-- ? ? ? ? ? ? 第一種方式: ? ? ? ? ? ? 指定一個(gè)類型一個(gè)自定義別名 ? ? ? ? ? ? type:自定義類型的全限定名稱 ? ? ? ? ? ? alias:別名 ? ? ? ? --> ? ? ? ? <typeAlias type="com.mycompany.domain.User" alias="user" /> ? ? ? ? <typeAlias type="com.mycompany.vo.ViewUser" alias="vUser" /> ? ? ? ? ? <!-- ? ? ? ? ? 第二種方式 ? ? ? ? ? <package> name是包名, 這個(gè)包中的所有類,類名就是別名(類名不區(qū)分大小寫(xiě)) ? ? ? ? --> ? ? ? ? <package name="com.mycompany.domain" /> ? ? ? ? <package name="com.mycompany.vo" /> ? ? ? </typeAliases>
文件完全內(nèi)容如下
<?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"> ? <!-- ? ? mybatis的主配置文件:主要定義了數(shù)據(jù)庫(kù)的配置信息,SQL映射文件的位置 ? ? 1、約束文件 ? ? ? ? <!DOCTYPE configuration ? ? ? ? ? ? PUBLIC "-//mybatis.org//DTD Config 3.0//EN" ? ? ? ? ? ? "http://mybatis.org/dtd/mybatis-3-config.dtd"> ? ? ? ? mybatis-3-config.dtd:約束文件名稱 ? ? 2、configuration:根標(biāo)簽 --> <configuration> ? ? ? <!-- settings:mybatis全局行為 --> ? ? <settings> ? ? ? ? <!-- 設(shè)置mybatis輸出日志 --> ? ? ? ? <setting name="logImpl" value="STDOUT_LOGGING" /> ? ? </settings> ? ? ? <!--定義別名--> ? ? <typeAliases> ? ? ? ? <!-- ? ? ? ? ? ? 第一種方式: ? ? ? ? ? ? 指定一個(gè)類型一個(gè)自定義別名 ? ? ? ? ? ? type:自定義類型的全限定名稱 ? ? ? ? ? ? alias:別名 ? ? ? ? --> ? ? ? ? <typeAlias type="com.mycompany.domain.User" alias="user" /> ? ? ? ? <typeAlias type="com.mycompany.vo.ViewUser" alias="vUser" /> ? ? ? ? ? <!-- ? ? ? ? ? 第二種方式 ? ? ? ? ? <package> name是包名, 這個(gè)包中的所有類,類名就是別名(類名不區(qū)分大小寫(xiě)) ? ? ? ? --> ? ? ? ? <package name="com.mycompany.domain" /> ? ? ? ? <package name="com.mycompany.vo" /> ? ? ? </typeAliases> ? ? ? <!-- ? ? ? ? 環(huán)境配置:數(shù)據(jù)庫(kù)的連接信息 ? ? ? ? ? ? default:必須和某個(gè)environment的id值一樣 ? ? ? ? ? ? 告訴mybatis使用哪個(gè)數(shù)據(jù)庫(kù)的連接信息(訪問(wèn)哪個(gè)數(shù)據(jù)庫(kù)) ? ? --> ? ? <environments default="development"> ? ? ? ? ? <!-- ? ? ? ? ? ? environment:一個(gè)數(shù)據(jù)庫(kù)的配置,環(huán)境 ? ? ? ? ? ? id:一個(gè)唯一值(可自定義,表示環(huán)境的名稱) ? ? ? ? ?--> ? ? ? ? <environment id="development"> ? ? ? ? ? ? <!-- ? ? ? ? ? ? ? ? transactionManaer:mybatis的事務(wù)類型 ? ? ? ? ? ? ? ? ? ? type:JDBC(表示使用JDBC中的Connection對(duì)象的commit,rollback做事務(wù)處理) ? ? ? ? ? ? --> ? ? ? ? ? ? <transactionManager type="JDBC"/> ? ? ? ? ? ? <!-- ? ? ? ? ? ? ? ? dataSource:表示數(shù)據(jù)源,連接數(shù)據(jù)庫(kù)的 ? ? ? ? ? ? ? ? ? ? type:表述數(shù)據(jù)源的類型,POOLED表示使用連接池 ? ? ? ? ? ? --> ? ? ? ? ? ? <dataSource type="POOLED"> ? ? ? ? ? ? ? ? <!-- ? ? ? ? ? ? ? ? ? ?driver, user, username, password 是固定的,不能自定義。 ? ? ? ? ? ? ? ? --> ? ? ? ? ? ? ? ? <!-- 數(shù)據(jù)庫(kù)驅(qū)動(dòng)類名 --> ? ? ? ? ? ? ? ? <property name="driver" value="com.mysql.jdbc.Driver"/> ? ? ? ? ? ? ? ? <!-- 連接數(shù)據(jù)庫(kù)的URL字符串 --> ? ? ? ? ? ? ? ? <property name="url" value="jdbc:mysql://localhost:3306/ssm"/> ? ? ? ? ? ? ? ? <!-- 訪問(wèn)數(shù)據(jù)庫(kù)的用戶名 --> ? ? ? ? ? ? ? ? <property name="username" value="root"/> ? ? ? ? ? ? ? ? <!-- 訪問(wèn)數(shù)據(jù)庫(kù)的密碼 --> ? ? ? ? ? ? ? ? <property name="password" value="123456"/> ? ? ? ? ? ? </dataSource> ? ? ? ? </environment> ? ? ? ? ? <!--表示線上的數(shù)據(jù)庫(kù),是項(xiàng)目真實(shí)使用的庫(kù)--> ? ? ? ? <environment id="online"> ? ? ? ? ? ? <transactionManager type="JDBC"/> ? ? ? ? ? ? <dataSource type="POOLED"> ? ? ? ? ? ? ? ? <property name="driver" value="com.mysql.jdbc.Driver"/> ? ? ? ? ? ? ? ? <property name="url" value="jdbc:mysql://localhost:3306/onlinedb"/> ? ? ? ? ? ? ? ? <property name="username" value="root"/> ? ? ? ? ? ? ? ? <property name="password" value="123456"/> ? ? ? ? ? ? </dataSource> ? ? ? ? </environment> ? ? ? </environments> ? ? ? <!-- sql mapper(SQL映射文件)的位置 --> ? ? <mappers> ? ? ? ? <!-- ? ? ? ? ? ? 一個(gè)mapper標(biāo)簽指定一個(gè)文件的位置 ? ? ? ? ? ? ? ? 從類路徑開(kāi)始的路徑信息(target/classes)類路徑 ? ? ? ? --> ? ? ? ? <mapper resource="com/mycompany/dao/UserDao.xml"/> ? ? </mappers> </configuration>
一、resultType
執(zhí)行 sql 得到 ResultSet 轉(zhuǎn)換的類型,使用類型的完全限定名或別名
1、簡(jiǎn)單類型
UserDao接口文件
public User selectUserByUserId(@Param("userId") Integer id);
?
List<User> selectMultiParam(@Param("username") String userName,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @Param("userage") Integer age);UserDao.xml文件
<!--
? ? resultType:
? ? ? ? ? ? 表示結(jié)果類型,SQL語(yǔ)句執(zhí)行后得到ResultSet結(jié)果集,遍歷這個(gè)結(jié)果集得到的Java對(duì)象類型
? ? ? ? ? ? 值寫(xiě)Java對(duì)象的全限定名稱
? ? 1、resultType="vUser"
? ? ? ? mybatis-config.xml文件中第一種方式
? ? ? ? 指定一個(gè)類型一個(gè)自定義別名
? ? ? ? ? ? type:自定義類型的全限定名稱
? ? ? ? ? ? alias:別名
? ? 2、resultType="ViewUser"
? ? ? ? mybatis-config.xml文件中第二種方式:
? ? ? ? ? <package> name是包名, 這個(gè)包中的所有類,類名就是別名(類名不區(qū)分大小寫(xiě))
? ? 注:
? ? ? ? resultType="User" 如果一個(gè)項(xiàng)目中有多個(gè)User類文件,會(huì)報(bào)錯(cuò)
? ? ? ? Could not resolve type alias 'User'. ?Cause: java.lang.ClassNotFoundException: Cannot find class: User
? ? -->
? ? <select id="selectUserByUserId" resultType="User">
? ? ? ? select user_id,user_name,email,age
? ? ? ? from user
? ? ? ? where user_id = #{userId}
? ? </select>
?
? ? <!--多個(gè)參數(shù),使用@Param命名-->
? ? <select id="selectMultiParam" resultType="com.mycompany.domain.User" >
? ? ? ? select user_id,user_name,email,age
? ? ? ? from user
? ? ? ? where user_name = #{username} or age = #{userage}
? ? </select>TestMyBatis測(cè)試類
@Test
? ? public void testSelectUserByUserId(){
? ? ? ? try {
? ? ? ? ? ? SqlSession sqlSession = MyBatisUtil.getSqlSession();
? ? ? ? ? ? UserDao userDao = sqlSession.getMapper(UserDao.class);
?
? ? ? ? ? ? User user = userDao.selectUserByUserId(1);
? ? ? ? ? ? System.out.println("user="+user);
? ? ? ? ? ? sqlSession.close();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
?
? ? @Test
? ? public void testSelectMultiParam(){
? ? ? ? try {
? ? ? ? ? ? SqlSession sqlSession = MyBatisUtil.getSqlSession();
? ? ? ? ? ? UserDao userDao = sqlSession.getMapper(UserDao.class);
?
? ? ? ? ? ? List<User> userList = userDao.selectMultiParam("zhangsan",20);
? ? ? ? ? ? for(User user: userList){
? ? ? ? ? ? ? ? System.out.println("用戶="+user);
? ? ? ? ? ? }
? ? ? ? ? ? sqlSession.close();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }2、Map類型
UserDao接口文件
//定義方法返回Map
? ? Map<Object,Object> selectMapById(Integer id);
UserDao.xml文件
<select id="selectMapById" resultType="java.util.HashMap">
? ? ? ? select user_id,user_name,email,age
? ? ? ? from user
? ? ? ? where user_id=#{userId}
? ? </select>TestMyBatis測(cè)試類
@Test
? ? public void testSelectMapById(){
? ? ? ? try {
? ? ? ? ? ? SqlSession sqlSession = MyBatisUtil.getSqlSession();
? ? ? ? ? ? UserDao userDao = sqlSession.getMapper(UserDao.class);
?
? ? ? ? ? ? Map<Object,Object> map = userDao.selectMapById(1);
? ? ? ? ? ? System.out.println("map=="+map);
? ? ? ? ? ? sqlSession.close();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }3、對(duì)象類型
UserDao接口文件
ViewUser selectUserReturnViewUser(@Param("userId") Integer id);UserDao.xml文件
<!--
? ? ? ? 1、resultType="vUser"
? ? ? ? mybatis-config.xml文件中第一種方式
? ? ? ? 指定一個(gè)類型一個(gè)自定義別名
? ? ? ? ? ? type:自定義類型的全限定名稱
? ? ? ? ? ? alias:別名
? ? ? ? 2、resultType="ViewUser"
? ? ? ? mybatis-config.xml文件中第二種方式:
? ? ? ? ? <package> name是包名, 這個(gè)包中的所有類,類名就是別名(類名不區(qū)分大小寫(xiě))
? ? -->
? ? <select id="selectUserReturnViewUser" resultType="ViewUser">
? ? ? ? select user_id,user_name
? ? ? ? from user
? ? ? ? where user_id = #{userId}
? ? </select>TestMyBatis測(cè)試類
@Test
? ? public void testSelectUserReturnViewUser(){
? ? ? ? try {
? ? ? ? ? ? SqlSession sqlSession = MyBatisUtil.getSqlSession();
? ? ? ? ? ? UserDao userDao = sqlSession.getMapper(UserDao.class);
?
? ? ? ? ? ? ViewUser user = userDao.selectUserReturnViewUser(1);
? ? ? ? ? ? System.out.println("ViewUser="+user);
? ? ? ? ? ? sqlSession.close();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }注:
(1)如果返回的是集合,那應(yīng)該設(shè)置為集合包含的類型,而不是集合本身
(2)resultType 和 resultMap,不能同時(shí)使用
(3)resultType="User" 如果一個(gè)項(xiàng)目中有多個(gè)User類文件,會(huì)報(bào)錯(cuò)
Could not resolve type alias 'User'. Cause: java.lang.
ClassNotFoundException: Cannot find class: User
此時(shí)最好指定全限定名稱
二、resultMap
resultMap 可以自定義 sql 的結(jié)果和 java 對(duì)象屬性的映射關(guān)系;更靈活的把列值賦值給指定屬性
常用在列名和 java 對(duì)象屬性名不一樣的情況
使用方式:
(1)先定義 resultMap,指定列名和屬性的對(duì)應(yīng)關(guān)系
(2)在<select>中把 resultType 替換為 resultMap
列名和Java對(duì)象屬性名不一樣時(shí),有兩種處理方式
(1)使用resultMap映射
(2)resultType的默認(rèn)原則是 同名的列值賦值給同名的屬性, 使用列別名(java對(duì)象的屬性名)
如下Java類屬性
public class User {
? ? private int userId;
? ? private String userName;
? ? private String email;
? ? private int age;
}
?
?
public class MyUser {
? ? private int myUserId;
? ? private String myUserName;
? ? private String myUserEmail;
? ? private int myUserAge;
}UserDao接口文件
/* ? ? ?使用resultMap定義映射關(guān)系 ? ? */ ? ? List<User> selectAllUsers(); ? ? ? List<MyUser> selectMyUser(); ? ? ? List<MyUser> selectDiffColProperty();
UserDao.xml文件
<!--使用resultMap
? ? ? ? (1)先定義resultMap
? ? ? ? (2)在select標(biāo)簽,使用resultMap來(lái)引用定義
? ? ? ? id:自定義名稱,表示定義的這個(gè)resultMap
? ? ? ? type:java類型的全限定名稱
? ? -->
? ? <resultMap id="userMap" type="com.mycompany.domain.User">
? ? ? ? <!--列名和java屬性的關(guān)系
? ? ? ? ? ? 注解列,使用id標(biāo)簽
? ? ? ? ? ? column :列名(數(shù)據(jù)庫(kù)表字段列名)
? ? ? ? ? ? property:java類型的屬性名
? ? ? ? -->
? ? ? ? <!-- 主鍵列使用 id 標(biāo)簽-->
? ? ? ? <id column="user_id" property="userId" />
? ? ? ? <!-- 非主鍵列使用 result 標(biāo)簽-->
? ? ? ? <result column="user_name" property="userName" />
? ? ? ? <result column="email" property="email" />
? ? ? ? <result column="age" property="age" />
? ? </resultMap>
?
? ? <select id="selectAllUsers" resultMap="userMap">
? ? ? ? select user_id,user_name,email,age
? ? ? ? from user
? ? ? ? where user_id=#{userId}
? ? </select>
?
? ? <resultMap id="myUserMap" type="com.mycompany.domain.MyUser">
? ? ? ? <id column="user_id" property="myUserId" />
? ? ? ? <result column="user_name" property="myUserName" />
? ? ? ? <result column="email" property="myUserEmail" />
? ? ? ? <result column="age" property="myUserAge" />
? ? </resultMap>
?
? ? <!--列名和屬性名不一樣:第一種方式
? ? ? ? 使用resultMap映射
? ? -->
? ? <select id="selectMyUser" resultMap="myUserMap">
? ? ? ? select user_id,user_name,email,age
? ? ? ? from user
? ? </select>
?
? ? <!--列名和屬性名不一樣:第二種方式
? ? ? ?resultType的默認(rèn)原則是 同名的列值賦值給同名的屬性, 使用列別名(java對(duì)象的屬性名)
? ? -->
? ? <select id="selectDiffColProperty" resultType="com.mycompany.domain.MyUser">
? ? ? ? select user_id as myUserId ,user_name as myUserName, email as myUserEmail , age myUserAge
? ? ? ? from user
? ? </select>TestMyBatis測(cè)試類
@Test
? ? public void testSelectAllUsers(){
? ? ? ? try {
? ? ? ? ? ? SqlSession sqlSession = MyBatisUtil.getSqlSession();
? ? ? ? ? ? UserDao userDao = sqlSession.getMapper(UserDao.class);
?
? ? ? ? ? ? List<User> userList = userDao.selectAllUsers();
? ? ? ? ? ? for(User user: userList){
? ? ? ? ? ? ? ? System.out.println("用戶="+user);
? ? ? ? ? ? }
? ? ? ? ? ? sqlSession.close();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
?
? ? @Test
? ? public void testSelectMyUser(){
? ? ? ? try {
? ? ? ? ? ? SqlSession sqlSession = MyBatisUtil.getSqlSession();
? ? ? ? ? ? UserDao userDao = sqlSession.getMapper(UserDao.class);
?
? ? ? ? ? ? List<MyUser> userList = userDao.selectMyUser();
? ? ? ? ? ? for(MyUser user: userList){
? ? ? ? ? ? ? ? System.out.println("MyUser用戶="+user);
? ? ? ? ? ? }
? ? ? ? ? ? sqlSession.close();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
?
? ? @Test
? ? public void testSelectDiffColProperty(){
? ? ? ? try {
? ? ? ? ? ? SqlSession sqlSession = MyBatisUtil.getSqlSession();
? ? ? ? ? ? UserDao userDao = sqlSession.getMapper(UserDao.class);
?
? ? ? ? ? ? List<MyUser> userList = userDao.selectDiffColProperty();
? ? ? ? ? ? for(MyUser user: userList){
? ? ? ? ? ? ? ? System.out.println("MyUser用戶="+user);
? ? ? ? ? ? }
? ? ? ? ? ? sqlSession.close();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }三、模糊 like
模糊查詢的實(shí)現(xiàn)有兩種方式, 一是 java 代碼中給查詢數(shù)據(jù)加上“%” ; 二是在 mapper 文件 sql 語(yǔ)句的條件位置加上“%”
UserDao接口文件
/*第一種模糊查詢, 在java代碼指定 like的內(nèi)容*/ ? ? List<User> selectLikeOne(String name); ? ? ? /*name就是李值, 在mapper中拼接 like ?"%" li "%" */ ? ? List<User> selectLikeTwo(String name);
UserDao.xml文件
<!--第一種 like ,java代碼指定 like的內(nèi)容-->
? ? <select id="selectLikeOne" resultType="com.mycompany.domain.User">
? ? ? ? select user_id, user_name, email, age
? ? ? ? from user
? ? ? ? where user_name like #{user_name}
? ? </select>
?
? ? <!--第二種方式:在mapper文件中拼接 like的內(nèi)容-->
? ? <select id="selectLikeTwo" resultType="com.mycompany.domain.User">
? ? ? ? select user_id, user_name, email, age
? ? ? ? from user
? ? ? ? where user_name like "%" #{user_name} "%"
? ? </select>TestMyBatis測(cè)試類
?@Test
? ? public void testSelectLikeOne(){
? ? ? ? try {
? ? ? ? ? ? SqlSession sqlSession = MyBatisUtil.getSqlSession();
? ? ? ? ? ? UserDao userDao = sqlSession.getMapper(UserDao.class);
?
? ? ? ? ? ? //like的內(nèi)容
? ? ? ? ? ? String name = "%li%";
? ? ? ? ? ? List<User> userList = userDao.selectLikeOne(name);
? ? ? ? ? ? for(User user: userList){
? ? ? ? ? ? ? ? System.out.println("User用戶="+user);
? ? ? ? ? ? }
? ? ? ? ? ? sqlSession.close();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
?
? ? @Test
? ? public void testSelectLikeTwo(){
? ? ? ? try {
? ? ? ? ? ? SqlSession sqlSession = MyBatisUtil.getSqlSession();
? ? ? ? ? ? UserDao userDao = sqlSession.getMapper(UserDao.class);
?
? ? ? ? ? ? //like的內(nèi)容
? ? ? ? ? ? String name = "li";
? ? ? ? ? ? List<User> userList = userDao.selectLikeTwo(name);
? ? ? ? ? ? for(User user: userList){
? ? ? ? ? ? ? ? System.out.println("User用戶="+user);
? ? ? ? ? ? }
? ? ? ? ? ? sqlSession.close();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)戰(zhàn)項(xiàng)目 醫(yī)院預(yù)約掛號(hào)系統(tǒng)
本文是一個(gè)Java語(yǔ)言編寫(xiě)的實(shí)戰(zhàn)項(xiàng)目,是一個(gè)醫(yī)院預(yù)約掛號(hào)系統(tǒng),主要用到了jdbc+jsp+mysql+ajax等技術(shù),技術(shù)含量比較高,感興趣的童鞋跟著小編往下看吧2021-09-09
SpringCloud輪詢拉取注冊(cè)表與服務(wù)發(fā)現(xiàn)流程詳解
這篇文章主要介紹了SpringCloud輪詢拉取注冊(cè)表與服務(wù)發(fā)現(xiàn),現(xiàn)在很多創(chuàng)業(yè)公司都開(kāi)始往springcloud靠了,可能是由于文檔和組件比較豐富的原因吧,畢竟是一款目前來(lái)說(shuō)比較完善的微服務(wù)架構(gòu)2022-11-11
NoHttpResponseException問(wèn)題排查解決記錄分析
這篇文章主要為大家介紹了NoHttpResponseException問(wèn)題排查解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
DolphinScheduler容錯(cuò)源碼分析之Worker
這篇文章主要為大家介紹了DolphinScheduler容錯(cuò)源碼分析之Worker,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Java重寫(xiě)equals及hashcode方法流程解析
這篇文章主要介紹了Java重寫(xiě)equals及hashcode方法流程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
利用idea快速搭建一個(gè)spring-cloud(圖文)
本文主要介紹了idea快速搭建一個(gè)spring-cloud,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

