Mybatis框架是相對於優化dao層的框架,其有效的減小了頻繁的鏈接數據庫(在配置文件xml中進行配置),將sql語句與java代碼進行分離(寫在XXXXmapper.xml文件中,一個表對應一個xml文件),有效的處理了各類條件(定義了輸入類型pojo)而且將結果又映射到java對象中(定義了輸出類型)。須要注意的是每一個表對應的xml文件的地址須要在配置文件中進行配置(能夠指引整個文件夾),當使用動態代理的接口mapper時,須要注意好其的四個規範!而且其能夠將查詢及輸出結果封裝到一個類,並提供了if、where、foreach標籤進行優化。
1、輸入類型優化:
開發中經過可使用pojo傳遞查詢條件。
查詢條件多是綜合的查詢條件,不只包括用戶查詢條件還包括其它的查詢條件(好比查詢用戶信息的時候,將用戶購買商品信息也做爲查詢條件),這時可使用包裝對象傳遞輸入參數。
包裝對象:Pojo類中的一個屬性是另一個pojo。
java
需求:根據用戶名模糊查詢用戶信息,查詢條件放到QueryVo的user屬性中。
url=
package com.oracle.pojo;public class QueryVo { private User user; public User getUser() { return user; } publicvoid setUser(User user) { this.user = user; } @Override public String toString() { return "QueryVo [user=" + user + "]"; } }url=
mysql
2、輸出類型優化:
resultType能夠指定將查詢結果映射爲pojo,但須要pojo的屬性名和sql查詢的列名一致方可映射成功。
若是sql查詢字段名和pojo的屬性名不一致,能夠經過resultMap將字段名和屬性名做一個對應關係 ,resultMap實質上還須要將查詢結果映射到pojo對象中。
resultMap能夠實現將查詢結果映射爲複雜類型的pojo,好比在查詢結果映射對象中包括pojo和list實現一對一查詢和一對多查詢。
3、動態Sql:
經過mybatis提供的各類標籤方法實現動態拼接sql:if/where/foreach
[url=]sql
[/url]
<!--根據姓名和性別查詢用戶 使用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> [url=]數據庫
[/url]
數組
Sql片斷:sql中可將重複的sql提取出來,使用時用include引用便可,最終達到sql重用的目的。
若是要使用別的Mapper.xml配置的sql片斷,能夠在refid前面加上對應的Mapper.xml的namespace。
foreach標籤:向sql傳遞數組或List,mybatis使用foreach解析。
4、關聯查詢:
一、一對一查詢:
[url=]mybatis
[/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=]oracle
[/url]
app
二、一對多查詢:
[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=]ide
[/url]
[url=]
[/url]
public class User { private Integer id; private String username; private String birthday; private String sex; privateString address; private List<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!