Java?MyBatis傳出參數(shù)resultType和resultMap解讀
MyBatis輸出參數(shù) resultType 和 resultMap
我們需要在 mybatis-config.xml 文件中加如下配置
<!--定義別名--> ? ? <typeAliases> ? ? ? ? <!-- ? ? ? ? ? ? 第一種方式: ? ? ? ? ? ? 指定一個類型一個自定義別名 ? ? ? ? ? ? type:自定義類型的全限定名稱 ? ? ? ? ? ? alias:別名 ? ? ? ? --> ? ? ? ? <typeAlias type="com.mycompany.domain.User" alias="user" /> ? ? ? ? <typeAlias type="com.mycompany.vo.ViewUser" alias="vUser" /> ? ? ? ? ? <!-- ? ? ? ? ? 第二種方式 ? ? ? ? ? <package> name是包名, 這個包中的所有類,類名就是別名(類名不區(qū)分大小寫) ? ? ? ? --> ? ? ? ? <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ù)庫的配置信息,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:根標簽 --> <configuration> ? ? ? <!-- settings:mybatis全局行為 --> ? ? <settings> ? ? ? ? <!-- 設(shè)置mybatis輸出日志 --> ? ? ? ? <setting name="logImpl" value="STDOUT_LOGGING" /> ? ? </settings> ? ? ? <!--定義別名--> ? ? <typeAliases> ? ? ? ? <!-- ? ? ? ? ? ? 第一種方式: ? ? ? ? ? ? 指定一個類型一個自定義別名 ? ? ? ? ? ? type:自定義類型的全限定名稱 ? ? ? ? ? ? alias:別名 ? ? ? ? --> ? ? ? ? <typeAlias type="com.mycompany.domain.User" alias="user" /> ? ? ? ? <typeAlias type="com.mycompany.vo.ViewUser" alias="vUser" /> ? ? ? ? ? <!-- ? ? ? ? ? 第二種方式 ? ? ? ? ? <package> name是包名, 這個包中的所有類,類名就是別名(類名不區(qū)分大小寫) ? ? ? ? --> ? ? ? ? <package name="com.mycompany.domain" /> ? ? ? ? <package name="com.mycompany.vo" /> ? ? ? </typeAliases> ? ? ? <!-- ? ? ? ? 環(huán)境配置:數(shù)據(jù)庫的連接信息 ? ? ? ? ? ? default:必須和某個environment的id值一樣 ? ? ? ? ? ? 告訴mybatis使用哪個數(shù)據(jù)庫的連接信息(訪問哪個數(shù)據(jù)庫) ? ? --> ? ? <environments default="development"> ? ? ? ? ? <!-- ? ? ? ? ? ? environment:一個數(shù)據(jù)庫的配置,環(huán)境 ? ? ? ? ? ? id:一個唯一值(可自定義,表示環(huán)境的名稱) ? ? ? ? ?--> ? ? ? ? <environment id="development"> ? ? ? ? ? ? <!-- ? ? ? ? ? ? ? ? transactionManaer:mybatis的事務類型 ? ? ? ? ? ? ? ? ? ? type:JDBC(表示使用JDBC中的Connection對象的commit,rollback做事務處理) ? ? ? ? ? ? --> ? ? ? ? ? ? <transactionManager type="JDBC"/> ? ? ? ? ? ? <!-- ? ? ? ? ? ? ? ? dataSource:表示數(shù)據(jù)源,連接數(shù)據(jù)庫的 ? ? ? ? ? ? ? ? ? ? type:表述數(shù)據(jù)源的類型,POOLED表示使用連接池 ? ? ? ? ? ? --> ? ? ? ? ? ? <dataSource type="POOLED"> ? ? ? ? ? ? ? ? <!-- ? ? ? ? ? ? ? ? ? ?driver, user, username, password 是固定的,不能自定義。 ? ? ? ? ? ? ? ? --> ? ? ? ? ? ? ? ? <!-- 數(shù)據(jù)庫驅(qū)動類名 --> ? ? ? ? ? ? ? ? <property name="driver" value="com.mysql.jdbc.Driver"/> ? ? ? ? ? ? ? ? <!-- 連接數(shù)據(jù)庫的URL字符串 --> ? ? ? ? ? ? ? ? <property name="url" value="jdbc:mysql://localhost:3306/ssm"/> ? ? ? ? ? ? ? ? <!-- 訪問數(shù)據(jù)庫的用戶名 --> ? ? ? ? ? ? ? ? <property name="username" value="root"/> ? ? ? ? ? ? ? ? <!-- 訪問數(shù)據(jù)庫的密碼 --> ? ? ? ? ? ? ? ? <property name="password" value="123456"/> ? ? ? ? ? ? </dataSource> ? ? ? ? </environment> ? ? ? ? ? <!--表示線上的數(shù)據(jù)庫,是項目真實使用的庫--> ? ? ? ? <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> ? ? ? ? <!-- ? ? ? ? ? ? 一個mapper標簽指定一個文件的位置 ? ? ? ? ? ? ? ? 從類路徑開始的路徑信息(target/classes)類路徑 ? ? ? ? --> ? ? ? ? <mapper resource="com/mycompany/dao/UserDao.xml"/> ? ? </mappers> </configuration>
一、resultType
執(zhí)行 sql 得到 ResultSet 轉(zhuǎn)換的類型,使用類型的完全限定名或別名
1、簡單類型
UserDao接口文件
public User selectUserByUserId(@Param("userId") Integer id); ? List<User> selectMultiParam(@Param("username") String userName, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @Param("userage") Integer age);
UserDao.xml文件
<!-- ? ? resultType: ? ? ? ? ? ? 表示結(jié)果類型,SQL語句執(zhí)行后得到ResultSet結(jié)果集,遍歷這個結(jié)果集得到的Java對象類型 ? ? ? ? ? ? 值寫Java對象的全限定名稱 ? ? 1、resultType="vUser" ? ? ? ? mybatis-config.xml文件中第一種方式 ? ? ? ? 指定一個類型一個自定義別名 ? ? ? ? ? ? type:自定義類型的全限定名稱 ? ? ? ? ? ? alias:別名 ? ? 2、resultType="ViewUser" ? ? ? ? mybatis-config.xml文件中第二種方式: ? ? ? ? ? <package> name是包名, 這個包中的所有類,類名就是別名(類名不區(qū)分大小寫) ? ? 注: ? ? ? ? resultType="User" 如果一個項目中有多個User類文件,會報錯 ? ? ? ? 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> ? ? ? <!--多個參數(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測試類
@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測試類
@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、對象類型
UserDao接口文件
ViewUser selectUserReturnViewUser(@Param("userId") Integer id);
UserDao.xml文件
<!-- ? ? ? ? 1、resultType="vUser" ? ? ? ? mybatis-config.xml文件中第一種方式 ? ? ? ? 指定一個類型一個自定義別名 ? ? ? ? ? ? type:自定義類型的全限定名稱 ? ? ? ? ? ? alias:別名 ? ? ? ? 2、resultType="ViewUser" ? ? ? ? mybatis-config.xml文件中第二種方式: ? ? ? ? ? <package> name是包名, 這個包中的所有類,類名就是別名(類名不區(qū)分大小寫) ? ? --> ? ? <select id="selectUserReturnViewUser" resultType="ViewUser"> ? ? ? ? select user_id,user_name ? ? ? ? from user ? ? ? ? where user_id = #{userId} ? ? </select>
TestMyBatis測試類
@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)如果返回的是集合,那應該設(shè)置為集合包含的類型,而不是集合本身
(2)resultType 和 resultMap,不能同時使用
(3)resultType="User" 如果一個項目中有多個User類文件,會報錯
Could not resolve type alias 'User'. Cause: java.lang.
ClassNotFoundException: Cannot find class: User
此時最好指定全限定名稱
二、resultMap
resultMap 可以自定義 sql 的結(jié)果和 java 對象屬性的映射關(guān)系;更靈活的把列值賦值給指定屬性
常用在列名和 java 對象屬性名不一樣的情況
使用方式:
(1)先定義 resultMap,指定列名和屬性的對應關(guān)系
(2)在<select>中把 resultType 替換為 resultMap
列名和Java對象屬性名不一樣時,有兩種處理方式
(1)使用resultMap映射
(2)resultType的默認原則是 同名的列值賦值給同名的屬性, 使用列別名(java對象的屬性名)
如下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標簽,使用resultMap來引用定義 ? ? ? ? id:自定義名稱,表示定義的這個resultMap ? ? ? ? type:java類型的全限定名稱 ? ? --> ? ? <resultMap id="userMap" type="com.mycompany.domain.User"> ? ? ? ? <!--列名和java屬性的關(guān)系 ? ? ? ? ? ? 注解列,使用id標簽 ? ? ? ? ? ? column :列名(數(shù)據(jù)庫表字段列名) ? ? ? ? ? ? property:java類型的屬性名 ? ? ? ? --> ? ? ? ? <!-- 主鍵列使用 id 標簽--> ? ? ? ? <id column="user_id" property="userId" /> ? ? ? ? <!-- 非主鍵列使用 result 標簽--> ? ? ? ? <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的默認原則是 同名的列值賦值給同名的屬性, 使用列別名(java對象的屬性名) ? ? --> ? ? <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測試類
@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
模糊查詢的實現(xiàn)有兩種方式, 一是 java 代碼中給查詢數(shù)據(jù)加上“%” ; 二是在 mapper 文件 sql 語句的條件位置加上“%”
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測試類
?@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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實戰(zhàn)項目 醫(yī)院預約掛號系統(tǒng)
本文是一個Java語言編寫的實戰(zhàn)項目,是一個醫(yī)院預約掛號系統(tǒng),主要用到了jdbc+jsp+mysql+ajax等技術(shù),技術(shù)含量比較高,感興趣的童鞋跟著小編往下看吧2021-09-09SpringCloud輪詢拉取注冊表與服務發(fā)現(xiàn)流程詳解
這篇文章主要介紹了SpringCloud輪詢拉取注冊表與服務發(fā)現(xiàn),現(xiàn)在很多創(chuàng)業(yè)公司都開始往springcloud靠了,可能是由于文檔和組件比較豐富的原因吧,畢竟是一款目前來說比較完善的微服務架構(gòu)2022-11-11NoHttpResponseException問題排查解決記錄分析
這篇文章主要為大家介紹了NoHttpResponseException問題排查解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08