Mybatis框架(三)

上一篇寫到Mybatis動態代理實現Dao和一些Mybatis的一些配置,下來我們將接着上一篇講到的Mybatis的參數傳遞和文件配置。


包裝pojo

爲什會需要包裝pojo呢,包裝pojo主要是用於一些複雜查詢,它可以將你需要用到的pojo包裝進去,可以在查詢時從pojo裏調屬性。下來就用一個包裝pojo的實例分析:
1.配置Mybatis核心配置文件

<?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">
<configuration>
    <!--<properties resource="jdbc.properties">-->
        <!--加載配置文件,${}表達式,先加載在此文件的配置,後加載外部的配置文件-->
        <!--<property name="xx" value="xxx"/>-->
    <!--</properties>-->
    <!--配置別名,別名不區分大小寫-->
    <typeAliases>
        <!--給pojo.user起別名,不區分大小寫-->
        <!--<typeAlias type="pojo.User" alias="USER"/>-->
        <!--別名就是類名,不區分大小寫,推薦-->
        <package name="pojo"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事務管理 -->
            <transactionManager type="JDBC"/>
            <!-- 數據庫連接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&amp;useSSL=false&amp;allowPublicKeyRetrieval=true"/>
                <property name="username" value="root"/>
                <property name="password" value="wrial.qq.com"/>
            </dataSource>
        </environment>
    </environments>
    <!--加載映射文件-->
    <mappers>
        <mapper resource="user.xml"/>
        <!--<mapper resource="UserMapper.xml"/>-->
        <!--映射文件類掃描
        1.接口文件和映射文件必須在同一目錄下
        2.接口文件和映射文件的命名必須一致
        -->
        <!--<mapper class="DaoProxy.UserMapper" />-->
        <package name="DaoProxy"/>
    </mappers>
</configuration>

2.建立擴展類,擴展實現額外的一些功能(如果沒有需求也不用寫擴展類)

package pojo;

public class UserAdd extends User {
    //可以添加User之外的東西,作爲擴展類來使用
    private String nearPeopel;

    public String getNearPeopel() {
        return nearPeopel;
    }

    public void setNearPeopel(String nearPeopel) {
        this.nearPeopel = nearPeopel;
    }
}

3.使用包裝類,包裝pojo
(1)沒使用擴展類

package pojo;

public class UserQuaryVo {

    private User user;

    private Order order;
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }
}

(2)使用擴展類:可以對pojo做一個整合,可以接受複雜的數據進行查詢操作

package pojo;

public class UserQuaryVo {

   private UserAdd userAdd;

    private Order order;

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }

    public UserAdd getUserAdd() {
        return userAdd;
    }

    public void setUserAdd(UserAdd userAdd) {
        this.userAdd = userAdd;
    }
}

4.在Mapper中編寫sql

  <select id="getUserByQuaryVo" parameterType="userquaryvo" resultType="user">
        select *
        from user
        where id = #{user.id}
    </select>

5.編寫測試類

  @Test
    public void testGetUserById() throws IOException {
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory("SqlMapCofig.xml");

        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserQuaryVo quaryVo = new UserQuaryVo();
        UserAdd userAdd = new UserAdd();
        userAdd.setId(1);
        quaryVo.setUserAdd(userAdd);
        User user = sqlSession.selectOne("DaoProxy.UserMapper.getUserByQuaryVo", quaryVo.getUserAdd().getId());
        System.out.println(user.toString());
        sqlSession.close();
    }

在這裏插入圖片描述
上邊就是包裝pojo的全過程,在需求複雜的情況下會遇到。

ResultMap入門之使用ResultMap解決數據庫和pojo數據類型不符合問題

下邊用實例來處理這一問題,基於在覈心文件配置包掃描
先不配置類型一致,會出現如下錯誤(我設置pojo的userId和數據庫中user_id),userId不能匹配,所以無法賦值
在這裏插入圖片描述

下來在xml配置resultMap
OrderMapper.xml

<mapper namespace="DaoProxy.OrderMapper">
    <resultMap id="GetOrderList" type="order">
        <!--id用於映射主鍵-->
        <!--<id property="id" column="id"/>-->
        <!--result 映射普通字段-->
        <result property="userId" column="user_id"/>
    </resultMap>
    <select id="GetOrders" resultMap="GetOrderList">
        SELECT *
        FROM `order`;
    </select>
</mapper>

測試類

@Test
    public void testGetOrders() throws IOException {
        SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory("SqlMapCofig.xml").openSession();
        List<Order> orders = sqlSession.selectList("DaoProxy.OrderMapper.GetOrders");
        for (Order order1 : orders
        ) {
            System.out.println(order1.toString());

        }
    }

解決後結果如下:
在這裏插入圖片描述
注:在單表查詢可以只寫需要改的屬性,因爲在<resultMap id="GetOrderList" type="order">定義了類型,多表就不能這樣了


動態sql語句

爲什麼說mybatis用起來好用,其中有很大一部分原因是它可以簡單的使用動態sql語句,下來我們就來學習一下動態sql。

if標籤(用法和基礎裏if大同小異)

映射文件(實現多條件查詢):注意要在where後加1=1,因爲如果沒有篩選到就查詢全部。

<select id="getUserByIfPojo" parameterType="user" resultType="User">
        select *
        from user
        where 1=1
        <if test="username!=null and username!=''">
            and username like '%${username}%'
        </if>
        <if test="sex!=null and sex!=''">
            and sex=#{sex}
        </if>
    </select>

測試類

 @Test
    public void testGet() throws IOException {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession("SqlMapCofig.xml");
        User user = new User();
        user.setUsername("張");
        user.setSex("w");
       List<User> users = sqlSession.selectList("DaoProxy.UserMapper.getUserByIfPojo",user);
        for (User u :users) {
            System.out.println(u.toString());
        }
       sqlSession.close();
    }

在這裏插入圖片描述
如果不設置性別測試如下
在這裏插入圖片描述

sql - where

where標籤自動補where關鍵字(和手動寫會起衝突)
映射文件

 <select id="getUserByIfPojo" parameterType="user" resultType="User">
        select *
        from user
        <where>
            <if test="username!=null and username!=''">
                and username like '%${username}%'
            </if>
            <if test="sex!=null and sex!=''">
                and sex=#{sex}
            </if>
        </where>
    </select>

在這裏插入圖片描述

sql - sql

sql片段拼接用include關鍵字

    <sql id="user_sql">
        'username','sex'
    </sql>
    <select id="getUserByIfPojo" parameterType="user" resultType="User">
        select
        <include refid="user_sql"/>
        from user
foreach

循環標籤,一般用於集合查詢
映射文件

  <!--通過包裝-->
    <select id="getUserFromList" parameterType="UserQuaryVo" resultType="user">
        select * from user
        <where>
           <foreach collection="ids" open="id IN(" item="id" separator="," close=")">
               #{id}
           </foreach>
        </where>
    </select>

測試類

  @Test
    public void testList() throws IOException {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession("SqlMapCofig.xml");
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        UserQuaryVo vo = new UserQuaryVo();
        vo.setIds(Arrays.asList(1,29,31));
        List<User> list = userMapper.getUserFromList(vo);
        for (User user:list
             ) {
            System.out.println(user.toString());
        }

    }

在這裏插入圖片描述
這一次就到這結束了,下一次寫關聯查詢還有和Spring進行整合!











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章