resultType和resultMap:
1.resultType:
一、返回一般數據類型
比如要根據 id 屬性獲得數據庫中的某個字段值。
mapper (dao)接口:
// 根據 id 獲得數據庫中的 username 字段的值
String getStuNameById(Integer id);
Mapper.xml 映射文件:
<!-- 指定 resultType 返回值類型時 String 類型的,string 在這里是一個別名,代表的是 java.lang.String
對於引用數據類型,都是將大寫字母轉小寫,比如 HashMap 對應的別名是 'hashmap'
基本數據類型考慮到重復的問題,會在其前面加上 '_',比如 byte 對應的別名是 '_byte'-->
<select id="getStuNameById" resultType="string">
select username from t_student where id = #{id}
</select>
二、返回 JavaBean 類型
比如根據某個字段獲得數據庫中的信息,把查詢的結果信息封裝成某個 JavaBean 類型的數據。
mapper (dao)接口:
// 根據 id 查詢信息,並把信息封裝成 Student 對象
Student getStuById(Integer id);
Mapper.xml 映射文件:
<!-- 通過 resultType 指定查詢的結果是 Student類型的數據 只需要指定 resultType 的類型,MyBatis 會自動將查詢的結果映射成 JavaBean 中的屬性-->
<select id="getStuById" resultType="student">
select * from t_student where id = #{id}
</select>
三、返回List類型
有時候我們要查詢的數據不止一條,比如:模糊查詢,全表查詢等,這時候返回的數據可能不止是一條數據,對於多數據的處理可以存放在List集合中。
mapper(dao) 接口:
// 假如是全表查詢數據,將查詢的數據封裝成Student類型的集合
List<Student> getAllStus();
Mapper.xml 映射文件:
<!--注意這里的 resultType 返回值類型是集合內存儲數據的類型,不是 'list'-->
<select id="getAllStus" resultType="student">
select * from t_student
</select>
四、返回Map類型
MyBatis支持將查詢的數據封裝成Map。
1. 如果查詢的結果是一條,我們可以把查詢的數據以{表字段名, 對應的值}方式存入到Map中。
mapper (dao)接口:
// 根據 id 查詢信息,並把結果信息封裝成 Map
Map<String, Object> getStuAsMapById(Integer id);
Mapper.xml 映射文件:
<!-- 注意這里的 resultType 返回值類型是 'map'-->
<select id="getStuAsMapById" resultType="map">
select * from t_student where id = #{id}
</select>
2. 如果查詢的結果是多條數據,我們也可以把查詢的數據以{表中某一字段名, JavaBean}方式來封裝成Map。
mapper (dao)接口:
// 查詢所有學生的信息,把數據庫中的 'id' 字段作為 key,對應的 value 封裝成 Student 對象
// @MapKey 中的值表示用數據庫中的哪個字段名作 key
@MapKey("id")
Map<Integer, Student> getAllStusAsMap();
Mapper.xml 映射文件:
<!--注意 resultType 返回值類型,不再是 'map',而是 Map 的 value 對應的 JavaBean 類型-->
<select id="getAllStusAsMap" resultType="student">
select * from t_student
</select>
2.resultmap:(重點)
1 <!--column不做限制,可以為任意表的字段,而property須為type 定義的pojo屬性--> 2 <resultMap id="唯一的標識" type="映射的pojo對象"> 3 <id column="表的主鍵字段,或者可以為查詢語句中的別名字段" jdbcType="字段類型" property="映射pojo對象的主鍵屬性" /> 4 <result column="表的一個字段(可以為任意表的一個字段)" jdbcType="字段類型" property="映射到pojo對象的一個屬性(須為type定義的pojo對象中的一個屬性)"/> 5 6 7 <association property="pojo的一個對象屬性" javaType="pojo關聯的pojo對象"> 8 <id column="關聯pojo對象對應表的主鍵字段" jdbcType="字段類型" property="關聯pojo對象的主席屬性"/> 9 <result column="任意表的字段" jdbcType="字段類型" property="關聯pojo對象的屬性"/> 10 </association> 11 12 13 <!-- 集合中的property須為oftype定義的pojo對象的屬性--> 14 <collection property="pojo的集合屬性" ofType="集合中的pojo對象"> 15 <id column="集合中pojo對象對應的表的主鍵字段" jdbcType="字段類型" property="集合中pojo對象的主鍵屬性" /> 16 <result column="可以為任意表的字段" jdbcType="字段類型" property="集合中的pojo對象的屬性" /> 17 </collection> 18 </resultMap>
UserDao.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 3 <mapper namespace="com.etc.dao.UserDao"> 4 <resultMap id="myuser" type="user"> 5 <id property="id" column="id"></id> 6 <result property="name" column="name"></result> 7 <result property="sal" column="sal"></result> 8 <result property="birth" column="birthday"></result> 9 <collection property="addresses" ofType="address"> 10 <id property="id" column="aid"></id> 11 <result property="name" column="aname"></result> 12 </collection> 13 </resultMap> 14 15 <insert id="save" useGeneratedKeys="true" keyProperty="id"> 16 insert into t_user(name,sal,birthday) values(#{name},#{sal},#{birth}) 17 </insert> 18 19 <update id="update"> 20 update t_user set name=#{name},sal=#{sal},birth=#{birth} where id=#{id} 21 </update> 22 23 <delete id="delete"> 24 delete from t_user where id =#{id} 25 </delete> 26 27 <!--<select id="queryById" resultType="com.etc.entity.User">--> 28 <!--select u.id,u.name,u.sal,u.birthday,a.id aid,a.name aname from t_user u,t_address a where a.user_id=u.id and u.id=#{id}--> 29 <select id="queryById" resultMap="myuser"> 30 SELECT 31 u.id, 32 u. NAME, 33 u.sal, 34 u.birthday, 35 a.id aid, 36 a. NAME aname 37 FROM 38 t_user u, 39 t_address a, 40 t_user_address ua 41 WHERE 42 u.id = ua.user_id 43 AND ua.address_id = a.id 44 AND u.id = #{id} 45 </select> 46 47 <select id="queryAll" resultMap="myuser"> 48 SELECT 49 u.id, 50 u. NAME, 51 u.sal, 52 u.birthday, 53 a.id aid, 54 a. NAME aname 55 FROM 56 t_user u, 57 t_address a, 58 t_user_address ua 59 WHERE 60 u.id = ua.user_id 61 AND ua.address_id = a.id 62 </select> 63 </mapper>
UserDao接口:
1 package com.etc.dao; 2 3 import com.etc.entity.User; 4 5 import java.util.List; 6 7 public interface UserDao { 8 //@Param 是在 userDAO.xml中使用 9 // 參數是一個可以不寫,多於一個的時候,一定要寫 10 //void save(@Param("name") String ne, @Param("sal") double sal, @Param("birth") Date birth); 11 void save(User user); 12 13 void update(User user); 14 15 void delete(int id); 16 17 User queryById(int id); 18 19 List<User> queryAll(); 20 }
useGeneratedKeys="true" keyProperty="id":
官方的說法是該參數的作用是:“允許JDBC支持自動生成主鍵,需要驅動兼容”,如何理解這句話的意思?
在使用mybatis時,常常會出現這種需求:
當主鍵id是自增的情況下,添加一條記錄的同時,其主鍵id是不能使用的,當我們取出主鍵id的值發現id為null,但是有時我們需要該主鍵,這時我們該如何處理呢?
這時我們只需要在其對應xxxmapper.xml中加入該屬性即可。則允許 JDBC 支持自動生成主鍵,並可將自動生成的主鍵返回。
<insert id="save" useGeneratedKeys="true" keyProperty="id"> insert into t_user(name,sal,birthday) values(#{name},#{sal},#{birth}) </insert>
UserDaoTest:
1 package com.etc.dao; 2 3 import com.etc.entity.User; 4 import org.apache.ibatis.io.Resources; 5 import org.apache.ibatis.session.SqlSession; 6 import org.apache.ibatis.session.SqlSessionFactory; 7 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 8 import org.junit.Test; 9 10 import java.io.IOException; 11 import java.io.InputStream; 12 import java.util.List; 13 14 public class UserDaoTest { 15 16 @Test 17 public void testSave() throws IOException { 18 //加載配置文件, // 會話工廠 19 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); 20 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 21 // 會話 == 相當於數據庫連接 22 SqlSession session = sqlSessionFactory.openSession(); 23 //調用語句 24 //session.insert("com.etc.dao.UserDAO.save"); 25 //session.insert("com.etc.dao.UserDAO.select"); 26 UserDao userDAO = session.getMapper(UserDao.class); 27 // User user = new User(); 28 // user.setName("asdasdaa"); 29 // user.setSal(1000.01); 30 // user.setBirth(new Date()); 31 // user.setId(15); 32 // userDAO.save("asdasdaa",1000.01,new Date()); 33 // System.out.println(user.getId()); 34 // userDAO.update(user); 35 // userDAO.delete(15); 36 // User user2 = userDAO.queryById(5); 37 // System.out.println(user2); 38 List<User> list=userDAO.queryAll(); 39 for (User u:list){ 40 System.out.println(u); 41 } 42 //提交, mybatis自動開啟了事務 43 session.commit(); 44 //關閉連接 45 session.close(); 46 } 47 }
附件:mybatis-config.xml

1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration PUBLIC 3 "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 7 <typeAliases> 8 <typeAlias type="com.etc.entity.User" alias="user"></typeAlias> 9 <package name="com.etc.entity"></package> 10 </typeAliases> 11 12 <!-- 配置環境變量 --> 13 <!-- 開發 測試 預生產 生產 --> 14 <environments default="development"> 15 <environment id="development"> 16 <transactionManager type="JDBC"/> 17 <dataSource type="POOLED"> 18 <property name="driver" value="com.mysql.jdbc.Driver"/> 19 <property name="url" 20 value="jdbc:mysql://127.0.0.1:3310/mybatis"/> 21 <property name="username" value="root"/> 22 <property name="password" value="123456"/> 23 </dataSource> 24 </environment> 25 </environments> 26 27 28 <!-- 配置mappers --> 29 <mappers> 30 <mapper resource="UserDao.xml"></mapper> 31 <mapper resource="AddressDAO.xml"></mapper> 32 </mappers> 33 34 </configuration>