mybatis 基礎理解resultType和resultMap


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>
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM