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

[url=][/url]
packagecom.oracle.pojo;publicclassQueryVo {   privateUser user;   publicUser getUser() {        returnuser;    }   publicvoidsetUser(User user) {        this.user =user;    }    @Override   publicString toString() {        return"QueryVo [user=" + user + "]";    }    }[url=][/url] oracle

2、輸出類型優化:app

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

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

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

3、動態Sql:

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

[url=][/url]
<!--根據姓名和性別查詢用戶  使用where標籤代替之前的 1=1 再加上if這樣就能夠即便沒有一個條件同樣能夠執行sql語句或者有其中一個!-->    <select id="getUserBySexAndUserName" parameterType="user" resultType="user">            <!-- include標籤加載sql片斷,後面是其片斷的id -->        <include refid="get"></include>        <!-- where標籤:一是添加關鍵字where,二是處理第一個and關鍵字 -->    <where>    <iftest="username!=null and username!=''">             and username like"%"#{username}"%"     </if>    <iftest="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>   [url=][/url]

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

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

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

4、關聯查詢:

一、一對一查詢:

[url=][/url]
<!--查詢全部的訂單信息以及其關聯的用戶信息  -->        <!--由於兩個表是一對一!爲使用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>[url=][/url]

二、一對多查詢:

[url=][/url]
<!-- 查詢全部的用戶信息以及對應的訂單信息 -->    <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>[url=][/url]

[url=][/url]
publicclassUser {   privateInteger id;   privateString username;   privateString birthday;   privateString sex;   privateString address;   privateList<Orders> list;//一對多,得list[url=][/url]

5、逆向工程:

一、導入:

二、修改:

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

  注意:

  • 修改要生成的數據庫表
  • pojo文件所在包路徑
  • Mapper所在的包路徑[url=][/url]
    <?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>

    [url=][/url]

三、生成逆向代碼:

運行GeneratorSqlmap.java!

生成pojo、mapper!