Java框架之MyBatis框架(二)

  Mybatis框架是相對於優化dao層的框架,其有效的減小了頻繁的鏈接數據庫(在配置文件xml中進行配置),將sql語句與java代碼進行分離(寫在XXXXmapper.xml文件中,一個表對應一個xml文件),有效的處理了各類條件(定義了輸入類型pojo)而且將結果又映射到java對象中(定義了輸出類型)。須要注意的是每一個表對應的xml文件的地址須要在配置文件中進行配置(能夠指引整個文件夾),當使用動態代理的接口mapper時,須要注意好其的四個規範!而且其能夠將查詢及輸出結果封裝到一個類,並提供了if、where、foreach標籤進行優化。java

1、輸入類型優化:mysql

開發中經過可使用pojo傳遞查詢條件。sql

查詢條件多是綜合的查詢條件,不只包括用戶查詢條件還包括其它的查詢條件(好比查詢用戶信息的時候,將用戶購買商品信息也做爲查詢條件),這時可使用包裝對象傳遞輸入參數。數據庫

包裝對象:Pojo類中的一個屬性是另一個pojo。數組

 

需求:根據用戶名模糊查詢用戶信息,查詢條件放到QueryVo的user屬性中。mybatis

package com.oracle.pojo;

public class QueryVo {
    private User user;

    public User getUser() {
        return user;
    }

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

    @Override
    public String toString() {
        return "QueryVo [user=" + user + "]";
    }
    
}

2、輸出類型優化:oracle

  resultType能夠指定將查詢結果映射爲pojo,但須要pojo的屬性名和sql查詢的列名一致方可映射成功。app

        若是sql查詢字段名和pojo的屬性名不一致,能夠經過resultMap將字段名和屬性名做一個對應關係 ,resultMap實質上還須要將查詢結果映射到pojo對象中。框架

        resultMap能夠實現將查詢結果映射爲複雜類型的pojo,好比在查詢結果映射對象中包括pojo和list實現一對一查詢和一對多查詢。ide

3、動態Sql:

經過mybatis提供的各類標籤方法實現動態拼接sql:if/where/foreach

<!--根據姓名和性別查詢用戶  使用where標籤代替之前的 1=1 再加上if這樣就能夠即便沒有一個條件同樣能夠執行sql語句或者有其中一個!-->
    <select id="getUserBySexAndUserName" parameterType="user" resultType="user">
            <!-- include標籤加載sql片斷,後面是其片斷的id -->
        <include refid="get"></include>
        <!-- where標籤:一是添加關鍵字where,二是處理第一個and關鍵字 -->
    <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重用的目的。通常用於錶鏈接時查詢多個字段的時候-->
    <sql id="get">
        select * from user 
    </sql>
    <!-- 根據多個條件查詢 -->
    <select id="getUserByQuery" parameterType="Query" resultType="user">
    select * from user where id in
        <!-- foreach標籤,進行遍歷 -->
        <!-- collection:遍歷的集合,這裏是Query的ids屬性 -->
        <!-- item:遍歷的項目,能夠隨便寫,可是和後面的#{}裏面要一致 -->
        <!-- open:在前面添加的sql片斷 -->
        <!-- close:在結尾處添加的sql片斷 -->
        <!-- separator:指定遍歷的元素之間使用的分隔符 -->
    <foreach collection="ids" item="i" open="(" close=")" separator=",">
        #{i}
    </foreach>
    </select>
    

Sql片斷:sql中可將重複的sql提取出來,使用時用include引用便可,最終達到sql重用的目的。

    若是要使用別的Mapper.xml配置的sql片斷,能夠在refid前面加上對應的Mapper.xml的namespace。

foreach標籤:向sql傳遞數組或List,mybatis使用foreach解析。

4、關聯查詢:

一、一對一查詢:

<!--查詢全部的訂單信息以及其關聯的用戶信息  -->
        <!-- 由於兩個表是一對一!爲使用resultMap,因此在orders下添加私有的User類對應的user屬性,由於沒法將數據映射到user裏面
        因此開始下面的手動映射 -->
    <resultMap type="orders" id="orderUserResultMap">
    <id property="id" column="id" />
    <result property="userId" column="user_id" />
    <result property="number" column="number" />
    <result property="createtime" column="createtime" />
    <result property="note" column="note" />

    <!-- association :配置一對一屬性 -->
    <!-- property:order裏面的User屬性名 -->
    <!-- javaType:屬性類型 -->
    <association property="user" javaType="user">
        <!-- id:聲明主鍵,表示user_id是關聯查詢對象的惟一標識-->
        <id property="id" column="user_id" />
        <result property="username" column="username" />
        <result property="address" column="address" />
    </association>

</resultMap>

<!-- 一對一關聯,查詢訂單,訂單內部包含用戶屬性 -->
<select id="getOrdersUser" resultMap="orderUserResultMap">
    SELECT
    o.id,
    o.user_id userId,
    o.number,
    o.createtime,
    o.note,
    u.username,
    u.address
    FROM
    `orders` o
    LEFT JOIN `user` u ON o.user_id = u.id
</select>

二、一對多查詢:

<!-- 查詢全部的用戶信息以及對應的訂單信息 -->
    <resultMap type="user" id="getAllUser">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="birthday" column="birthday"/>
        <result property="sex" column="sex"/>
        <result property="address" column="address"/>
        <!--一對多的關係    property是指集合的屬性名字  javaType是指類型   ofType是泛型的意思-->
        <collection property="list" javaType="list" ofType="orders">
            <!-- 配置主鍵,是關聯Order的惟一標識 -->
            <id property="id" column="oid"/>
            <result property="number" column="number"/>
            <result property="createtime" column="createtime"/>
            <result property="note" column="note"/>
        </collection>
    </resultMap>
    <select id="getUserOrders" resultMap="getAllUser">
    SELECT
        u.id,
        u.username,
        u.birthday,
        u.sex,
        u.address,
        o.id oid,
        o.number,
        o.createtime,
        o.note
    FROM
        `user` u
    LEFT JOIN `orders` o ON u.id = o.user_id
        
    
    </select>
public class User {
    private Integer id;
    private String username;
    private String birthday;
    private String sex;
    private String address;
    private List<Orders> list;//一對多,得list

5、逆向工程:

一、導入:

二、修改:

generatorConfig.xml中配置Mapper生成的詳細信息:

  注意:

  1. 修改要生成的數據庫表
  2. pojo文件所在包路徑
  3. Mapper所在的包路徑
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
      PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
      "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    
    <generatorConfiguration>
        <context id="testTables" targetRuntime="MyBatis3">
            <commentGenerator>
                <!-- 是否去除自動生成的註釋 true:是 : false:否 -->
                <property name="suppressAllComments" value="true" />
            </commentGenerator>
            <!--數據庫鏈接的信息:驅動類、鏈接地址、用戶名、密碼 -->
            <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root" password="root">
            </jdbcConnection>
            <!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg" 
                userId="yycg" password="yycg"> </jdbcConnection> -->
    
            <!-- 默認false,把JDBC DECIMAL 和 NUMERIC 類型解析爲 Integer,爲 true時把JDBC DECIMAL 
                和 NUMERIC 類型解析爲java.math.BigDecimal -->
            <javaTypeResolver>
                <property name="forceBigDecimals" value="false" />
            </javaTypeResolver>
    
            <!-- targetProject:生成PO類的位置 -->
            <javaModelGenerator targetPackage="cn.oracle.ssm.po"
                targetProject=".\src">
                <!-- enableSubPackages:是否讓schema做爲包的後綴 -->
                <property name="enableSubPackages" value="false" />
                <!-- 從數據庫返回的值被清理先後的空格 -->
                <property name="trimStrings" value="true" />
            </javaModelGenerator>
            <!-- targetProject:mapper映射文件生成的位置 -->
            <sqlMapGenerator targetPackage="cn.oracle.ssm.mapper"
                targetProject=".\src">
                <!-- enableSubPackages:是否讓schema做爲包的後綴 -->
                <property name="enableSubPackages" value="false" />
            </sqlMapGenerator>
            <!-- targetPackage:mapper接口生成的位置 -->
            <javaClientGenerator type="XMLMAPPER"
                targetPackage="cn.oracle.ssm.mapper" targetProject=".\src">
                <!-- enableSubPackages:是否讓schema做爲包的後綴 -->
                <property name="enableSubPackages" value="false" />
            </javaClientGenerator>
            <!-- 指定數據庫表 -->
            <table schema="" tableName="user"></table>
            <table schema="" tableName="order"></table>
        </context>
    </generatorConfiguration>

     

三、生成逆向代碼:

運行GeneratorSqlmap.java!

生成pojo、mapper!

 

注意:

1. 逆向工程生成的代碼只能作單表查詢

2. 不能在生成的代碼上進行擴展,由於若是數據庫變動,須要從新使用逆向工程生成代碼,原來編寫的代碼就被覆蓋了。

3. 一張表會生成4個文件

相關文章
相關標籤/搜索