1.導包.包括Mybatis的lib包,已經Mybatis的核心包,數據庫驅動,就可以Mybatis測試,
2.配置文件
1.sqlConfig.xml是Mybatis的核心配置文件.
其中主要定義了對bean包下的類的掃描,起一個別名,別名即為類名,首字母大小寫都可以識別.配置了Mappers,用來掃描Mapper.xml的配置文件位置.,
和數據庫連接的配置在和Spring整合后可不配置,由Spring來連接數據庫,管理事務.
settings屬性為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>
<!--和Spring整合可不配置,由Spring來連接數據庫 --> <!-- 讀取數據庫連接配置文件 --> <properties resource="jdbc.properties"></properties>
<settings> <!--所有映射器緩存配置的開關 --> <setting name="cacheEnabled" value="true"/> <!-- 延遲加載的全局開關 --> <setting name="lazyLoadingEnabled" value="false"/> <!-- <setting name="aggressiveLazyLoading" value=""/> --> </settings>
<!-- 配置bean實體類的別名 -->
<typeAliases>
<package name="cn.guanyq.bean"/>
</typeAliases>
<environments default="development"> <environment id="development"> <!-- 使用jdbc事務管理 --> <transactionManager type="JDBC" /> <!-- 數據庫連接池 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClass}" /> <property name="url" value="${jdbc.jdbcUrl}" /> <property name="username" value="${jdbc.user}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments>
<mappers>
<!--<mapper resource="cn/guanyq/sqlmap/User.xml"/> -->
<!-- <mapper resource="cn/guanyq/mapper/UserMapper.xml"/> -->
<package name="cn/guanyq/mapper"/>
</mappers>
</configuration>
2.使用Mapper接口開發.需要注意的四個要點.
a.Mapper接口必須和*Mapper.xml配置文件在同一包內,也就是同一個路徑下.
b.接口內的方法名稱必須和xml的配置文件id一致,執行方法時才會找到.
c. 接口的方法參數類型必須要和xml中的參數類型一致.parameterType.一致
d.接口的返回值類型必須和xml中的返回值類型一致. resultMap或resultType.
3.接口開發xml文件的配置.
一般接口的命名規則為類名加Mapper,方便區分.xml的命名為類名加上Mapper,比如UserMapper.java 和UserMapper.xml方便區分.接口不需要繼承任何接口.
*Mapper.xml的配置.
其中命名空間應該指向實體類
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.guanyq.mapper.UserMapper">
頂級元素
- cache緩存.cache-ref其他命名空間緩存的引用,已經不太使用
- resultMap 最強大的元素,用來描述如何從數據庫結果集中加載對象,
- sql 代碼塊.可被其他語句引用的代碼塊,實現重用性
- insert
- delete
- update
- select
基本增刪改查. #{ } 和 ${} 不會轉義字符串.
<select id="getUserById" parameterType="Integer" resultType="User" statementType="PREPARED" flushCache="true" useCache="true" resultOrdered="true" timeout="1000"> select * from users where uid = #{uid} </select>
這是一個簡單的查詢語句 ,其中id要求和對應的接口的方法名稱一致,parameterType是方法參數的別名,或者完整類名,可以是包裝類.數組或者集合.resultType定義和返回的類型.如果是集合應該使用集合內裝的類型.resultMap外部reslutMap的引用.這是對結果集的映射.resultMap和resultType不能同時使用.flushCache將其設置為true將會在任何時候只要語句被執行,本地的緩存將被清除.useCache,將其設置為True,將會導致select的結果被二級緩存.timeOut這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的時間.fetchSize這個值是設置驅動程序每次批量返回的結果的行數.statementType ,STATMENT,PREPARED和CALLABED三種,分別讓Mybatis使用Statement,PreparedStatement和CallableStatement.
insert,update,delete基本屬性相似.
如果主鍵是數據庫自動生成,insert還支持將剛生成的主鍵返回.
<selectKey keyProperty="id" order="AFTER" resultType="Long"> select last_insert_id() </selectKey>
在insert語句之后插入上述代碼.即可返回剛生成主鍵.
sql片段
<sql id="userColumns"> uid,uname </sql>
<select id="getUserById" parameterType="Integer" resultType="User" statementType="PREPARED" flushCache="true" useCache="true" resultOrdered="true" timeout="1000"> select <include refid="userColumns"></include> from users where uid = #{uid} </select>
可以這樣來重復利用代碼塊
resultMap
resultMap一般用來映射多表查詢的結果,如下代碼,其中為User和Order兩張表.
<resultMap type="User" id="getAllUserAndOrderList">
<id property="uid" column="uid"/>
<result property="uname" column="uname"/>
<collection property="orders" ofType="cn.guanyq.bean.Order">
<id property="oid" column="oid"/>
<result column="number" property="number"/>
<result column="price" property="price"/>
<association property="user" column="uid" javaType="User" resultMap="getUserResult"></association>
</collection>
</resultMap>
<resultMap type="User" id="getUserResult">
<id property="uid" column="uid"/>
<result column="uname" property="uname" />
</resultMap>
<select id="getAllUserAndOrderList" resultMap="getAllUserAndOrderList"> select * from users u left join orders o on u.uid=o.oid </select>
1.shouxianresultMap中的type表示的是返回值的結果類型.id是標識,如上面綠色,來調用這個resultMap
2.resultMap內的元素屬性.
a.id和result
映射的基本內容,其中的基本屬性property是映射到結果的字段或者屬性,也可映射一些復雜的東西比如user.id.column:從數據庫中得到的列名.
b.構造方法 constructor ,構造方法映射不太常用.
c.關聯查詢
<association property="user" javaType="cn.guanyq.bean.User">
<id property="uid" column="uid"/>
<result property="uname" column="uname"/>
</association>
<resultMap type="User" id="getAllUserAndOrderList" >
<id property="uid" column="uid"/>
<result property="uname" column="uname"/>
<collection property="orders" ofType="cn.guanyq.bean.Order" >
<id property="oid" column="oid"/>
<result column="number" property="number"/>
<result column="price" property="price"/>
<association property="user" column="uid" javaType="User" resultMap="getUserResult"></association>
</collection>
</resultMap>
<resultMap type="User" id="getUserResult">
<id property="uid" column="uid"/>
<result column="uname" property="uname" />
</resultMap>
適合多對一的映射,其中的javaType是對應的類型.其余一樣,第二種可以提高代碼的復用性.
d.集合.多對一.上面的collection元素.