Mybatis次日

1      MyBatis次日筆記

2      輸入映射和輸出映射

2.1    parameterType(輸入類型)

2.1.1  傳遞簡單類型

參考第一天內容java

2.1.2  傳遞pojo對象

參考第一天內容spring

Mybatis使用ognl表達式解析對象字段的值,#{}或者${}括號中的值爲pojo屬性名稱。sql

2.1.3  傳遞pojo包裝對象

  1. 1.       新建包裝pojo對象QueryVo
/**

 * 包裝pojo

 * @author Steven

 */

public class QueryVo {

   

    //用戶對象

    private User user;

 

    public User getUser() {

       return user;

    }

 

    public void setUser(User user) {

       this.user = user;

    }

 

}

 

 

  1. 2.       映射文件與sql
<!-- 1、resultType:若是要返回數據集合,只需設定爲每個元素的數據類型

        二、 包裝的pojo取值經過 "."來獲取

    -->

    <select id="getUserByQueryVo" parameterType="queryvo" resultType="com.itheima.mybatis.pojo.User">

       <!-- SELECT * FROM USER WHERE username LIKE #{name} -->

       SELECT * FROM USER WHERE username LIKE '%${user.username}%'

  </select>

 

 3.       新增接口方法數據庫

4.       增長測試方法,完成測試session

 

2.2    resultType(輸出類型)

2.2.1  輸出簡單類型

<!-- 查詢用戶總記錄數,演示返回簡單類型 -->

    <select id="getUserCount" resultType="int">

       SELECT COUNT(1) FROM USER

  </select>

 

 

其它步驟跟前面相似,添加接口方法與測試方法,完成測試。mybatis

 

2.2.2  輸出pojo對象

參考第一天內容app

 

2.2.3  輸出pojo列表

參考第一天內容。ide

 

 

 

 

 

2.3    輸出resultMap

演示基於完成訂單列表的查詢,由user_id字段與pojo屬性不一致時引出的resultMap測試

 

<!-- resultMap入門

        type:映射成的pojo類型

        id:resultMap惟一標識

    -->

    <resultMap type="order" id="orderMap">

       <!-- id標籤用於綁定主鍵 -->

       <!-- <id property="id" column="id"/> -->

      

       <!-- 使用result綁定普通字段 -->

       <result property="userId" column="user_id"/>

       <result property="number" column="number"/>

       <result property="createtime" column="createtime"/>

       <result property="note" column="note"/>

    </resultMap>

    <!-- 使用resultMap -->

    <select id="getOrderListResultMap" resultMap="orderMap">

       SELECT * FROM `order`

  </select>

 

 

其它步驟跟前面相似,添加接口方法與測試方法,完成測試。ui

 

3      動態sql

3.1    If

演示基於完成用戶列表查詢功能,由多查詢條件拼裝引出if標籤。

 

<!-- 演示動態sql-if標籤的使用情景 -->

    <select id="getUserByWhere" parameterType="user" resultType="com.itheima.mybatis.pojo.User">

       <!-- SELECT * FROM USER WHERE username LIKE '%${username}%' and id = #{id} -->

       SELECT * FROM USER where 1 = 1

       <!-- if標籤的使用 -->

       <if test="id != null">

           and id = #{id}

       </if>

       <if test="username != null and username != ''">

           and username LIKE '%${username}%'

       </if>

  </select>

 

 

其它步驟跟前面相似,添加接口方法與測試方法,完成測試。

 

3.2    Where

複製getUserByWhere修改一下,更名爲getUserByWhere2

 

<!-- 演示動態sql-where標籤的使用情景 -->

    <select id="getUserByWhere2" parameterType="user"

       resultType="com.itheima.mybatis.pojo.User">

       <!-- include:引入sql片斷,refid引入片斷id -->

       SELECT

       *

       FROM USER

       <!-- where會自動加上where同處理多餘的and -->

       <where>

           <!-- if標籤的使用 -->

           <if test="id != null">

              and id = #{id}

           </if>

           <if test="username != null and username != ''">

              and username LIKE '%${username}%'

           </if>

       </where>

</select>

 

 

其它步驟跟前面相似,添加接口方法與測試方法,完成測試。

 

3.3      Foreach

複製getUserByWhere2修改一下,更名爲getUserByIds

 

<!-- 演示動態sql-foreach標籤的使用情景 -->

    <select id="getUserByIds" parameterType="queryvo"

       resultType="com.itheima.mybatis.pojo.User">

      

       SELECT

       *

       FROM USER

       <!-- where會自動加上where同處理多餘的and -->

       <where>

           <!-- id IN(1,10,25,30,34) -->

           <!-- foreach循環標籤

               collection:要遍歷的集合,來源入參

               open:循環開始前的sql

               separator:分隔符

               close:循環結束拼接的sql

           -->

           <foreach item="uid" collection="ids" open="id IN(" separator=","

              close=")">

              #{uid}

           </foreach>    </where>

  </select>

 

 

其它步驟跟前面相似,添加接口方法與測試方法,完成測試。

3.4    Sql片斷

演示經過select * 很差引出查詢字段名,抽取共用sql片斷。

 

  1. 1.       定義
<!-- sql片斷 定義,id:片斷惟一標識 -->

    <sql id="user_column">

       `id`,

       `username`,

       `birthday`,

       `sex`,

       `address`,

       `uuid2`

  </sql>

 

 

  1. 2.       使用
SELECT

       <!-- sql片斷的使用:include:引入sql片斷,refid引入片斷id -->

       <include refid="user_column" />

       FROM USER

 

 

其它步驟跟前面相似,添加接口方法與測試方法,完成測試。

 

4      關聯查詢

4.1    一對一關聯

4.1.1  方法一,使用resultType

  1. 1.       新建OrderUser的pojo,繼承自Order。
public class OrderUser extends Order {

 

  private String username;

private String address;

…….get,set

}

 

 

  1. 2.       修改order的映射文件,新增查詢方法getOrderUser。
<!-- 一對一關聯查詢,使用resultType -->

    <select id="getOrderUser" resultType="orderuser">

       SELECT

         o.`id`,

         o.`user_id` userId,

         o.`number`,

         o.`createtime`,

         o.`note`,

         u.`username`,

         u.`address`

       FROM `order` o

       LEFT JOIN `user` u

       ON u.id = o.`user_id`

  </select>

 

 

其它步驟跟前面相似,添加接口方法與測試方法,完成測試。

4.1.2  方法二,使用resultMap

  1. 1.       改造order的pojo

 

  1. 2.       修改order的映射文件
<!-- 一對一關聯查詢-resultMap -->

    <resultMap type="order" id="order_user_map">

       <!-- id標籤用於綁定主鍵 -->

       <id property="id" column="id"/>

       <!-- 使用result綁定普通字段 -->

       <result property="userId" column="user_id"/>

       <result property="number" column="number"/>

       <result property="createtime" column="createtime"/>

       <result property="note" column="note"/>

      

       <!-- association:配置一對一關聯

            property:綁定的用戶屬性

            javaType:屬性數據類型,支持別名

       -->

       <association property="user" javaType="com.itheima.mybatis.pojo.User">

           <id property="id" column="user_id"/>

          

           <result property="username" column="username"/>

           <result property="address" column="address"/>

           <result property="sex" column="sex"/>

       </association>

    </resultMap>

    <!-- 一對一關聯查詢-使用resultMap -->

    <select id="getOrderUser2" resultMap="order_user_map">

       SELECT

         o.`id`,

         o.`user_id`,

         o.`number`,

         o.`createtime`,

         o.`note`,

         u.`username`,

         u.`address`,

         u.`sex`

       FROM `order` o

       LEFT JOIN `user` u

       ON u.id = o.`user_id`

  </select>

 

 

其它步驟跟前面相似,添加接口方法與測試方法,完成測試。

 

4.2    一對多關聯

  1. 1.       改造user的pojo

 

  1. 2.       修改user的映射文件
<!-- 一對多關聯查詢 -->

    <resultMap type="user" id="user_order_map">

       <id property="id" column="id" />

       <result property="username" column="username" />

       <result property="birthday" column="birthday" />

       <result property="address" column="address" />

       <result property="sex" column="sex" />

       <result property="uuid2" column="uuid2" />

      

       <!-- collection:配置一對多關係

            property:用戶下的order屬性

            ofType:property的數據類型,支持別名

       -->

       <collection property="orders" ofType="order">

           <!-- id標籤用於綁定主鍵 -->

           <id property="id" column="oid"/>

           <!-- 使用result綁定普通字段 -->

           <result property="userId" column="id"/>

           <result property="number" column="number"/>

           <result property="createtime" column="createtime"/>

       </collection>

 

    </resultMap>

    <!-- 一對多關聯查詢 -->

    <select id="getUserOrder" resultMap="user_order_map">

       SELECT

       u.`id`,

       u.`username`,

       u.`birthday`,

       u.`sex`,

       u.`address`,

       u.`uuid2`,

       o.`id` oid,

       o.`number`,

       o.`createtime`

       FROM `user` u

       LEFT JOIN `order` o

       ON o.`user_id` = u.`id`

  </select>

 

 

其它步驟跟前面相似,添加接口方法與測試方法,完成測試。

5      Mybatis整合spring

5.1    整合思路

一、SqlSessionFactory對象應該放到spring容器中做爲單例存在。

二、傳統dao的開發方式中,應該從spring容器中得到sqlsession對象。

三、Mapper代理形式中,應該從spring容器中直接得到mapper的代理對象。

四、數據庫的鏈接以及數據庫鏈接池事務管理都交給spring容器來完成。

 

5.2    整合步驟

  1. 1.       建立一個java工程。
  2. 2.       導入jar包。(課前資料中mybatis與spring整合全部包)
  3. 3.       mybatis的配置文件sqlmapConfig.xml
  4. 4.       編寫Spring的配置文件

1)       數據庫鏈接及鏈接池

2)       sqlsessionFactory對象,配置到spring容器中

3)       編寫Spring的配置文件

  1. 5.       複製jdbc.properties配置文件到新工程
  2. 6.       複製log4j.properties配置文件到新工程

 

5.3    Dao開發

5.3.1  複製user的pojo到新工程

5.3.2  傳統Dao開發

1.       複製user.xml到新工程,並修改,只留下要測試的三個方法

2.       在SqlMapConfig.xml加載user.xml

3.       複製UserDao接口到新工程,並修改,只留下要測試的三個方法

4.       編寫UserDaoImpl實現類,關鍵是繼承SqlSessionDaoSupport

  1. public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
    
     
    
        @Override
    
        public User getUserById(Integer id) {
    
           SqlSession sqlSession = super.getSqlSession();
    
           //查詢用戶
    
           User user = sqlSession.selectOne("user.getUserById", id);
    
          
    
           //不能關閉SqlSession
    
           //sqlSession.close();
    
           return user;
    
        }
    
     
    
        @Override
    
        public List<User> getUserByUserName(String name) {
    
           SqlSession sqlSession = super.getSqlSession();
    
           List<User> list = sqlSession.selectList("user.getUserByName", name);
    
           //不能關閉SqlSession
    
           return list;
    
        }
    
     
    
        @Override
    
        public void insertUser(User user) {
    
           SqlSession sqlSession = super.getSqlSession();
    
           sqlSession.insert("user.insertUser", user);
    
           //不用手動提交事務,交給spring
    
        }
    
    }

     

    5.       在applicationContext.xml中配置UserDaoImpl實現類
<!-- 傳統dao  -->

    <bean class="com.itheima.mybatis.dao.impl.UserDaoImpl">

       <property name="sqlSessionFactory" ref="sqlSessionFactory" />

  </bean>

 

6.       編寫測試類,新建單完測試類

public class UserDaoTest {

   

    private ApplicationContext applicationContext;

   

    @Before

    public void init(){

       applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

    }

 

    @Test

    public void testGetUserById() {

       UserDao userDao = applicationContext.getBean(UserDao.class);

       User user = userDao.getUserById(10);

       System.out.println(user);

  }

………省略其它方法

}

 

 

 

5.3.3  Mapper代理模式開發Dao

1.       複製UserMapper.xml到新工程,並修改,只留下要測試的三個方法

2.       複製UserMapper接口到新工程,並修改,只留下要測試的三個方法

3.       配置Mapper

1)       單個接口配置MapperFactoryBean

<!-- 動態代理Dao開發,第一種方式 -MapperFactoryBean -->

  <bean id="baseMapper" class="org.mybatis.spring.mapper.MapperFactoryBean" abstract="true" lazy-init="true">

     <property name="sqlSessionFactory" ref="sqlSessionFactory" />

    </bean>

    <!-- 用戶動態代理掃描 -->

    <bean parent="baseMapper">

      <property name="mapperInterface" value="com.itheima.mybatis.mapper.UserMapper" />

   </bean>

 

2)       配置包掃描器

<!-- 動態代理Dao開發,第一種方式,包掃描器(推薦使用) -->

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

         <!-- basePackage:配置映射包裝掃描,多個包時用","或";"分隔 -->

<property name="basePackage" value="com.itheima.mybatis.mapper" />

   </bean>

 

4.       測試

 

public class UserMapperTest {

   

    private ApplicationContext applicationContext;

   

    @Before

    public void init(){

       applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

    }

 

    @Test

    public void testGetUserById() {

       UserMapper userMapper = applicationContext.getBean(UserMapper.class);

       User user = userMapper.getUserById(10);

       System.out.println(user);

    }

 

 

6      Mybatis逆向工程

注意的點:在generatorConfig.xml中配置mapper生成的詳細信息,注意改下幾點:

一、  添加要生成的數據庫表

二、  po文件所在包路徑

三、  mapper文件所在包路徑

相關文章
相關標籤/搜索