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生成的詳細信息:
注意:
[url=][/url]
三、生成逆向代碼:
運行GeneratorSqlmap.java!
生成pojo、mapper!