1. 程式人生 > 實用技巧 >mybatis註解開發

mybatis註解開發

mybatis 的常用註解說明

@Insert:實現新增
@Update:實現更新
@Delete:實現刪除
@Select:實現查詢
@Result:實現結果集封裝
@Results:可以與@Result 一起使用,封裝多個結果集
@ResultMap:實現引用@Results 定義的封裝
@One:實現一對一結果集封裝
@Many:實現一對多結果集封裝
@SelectProvider: 實現動態 SQL 對映
@CacheNamespace:實現註解二級快取的使用

使用 Mybatis 註解實現基本 CRUD

單表的 CRUD 操作是最基本的操作,前面我們的學習都是基於 Mybaits 的對映檔案來實現的。

使用註解方式開發持久層介面

/**
* 
* <p>Title: IUserDao</p>
* <p>Description: 使用者的持久層介面</p>
* <p>Company: http://www.itheima.com/ </p>
*/
public interface IUserDao {
/**
* 查詢所有使用者
* @return
*/
@Select("select * from user")
@Results(id="userMap",
value= {
@Result(id=true,column="id",property="userId"),
@Result(column="username",property="userName"),
@Result(column="sex",property="userSex"),
@Result(column="address",property="userAddress"),
@Result(column="birthday",property="userBirthday")
})
List<User> findAll();
* 根據 id 查詢一個使用者
* @param userId
* @return
*/
@Select("select * from user where id = #{uid} ")
@ResultMap("userMap")
User findById(Integer userId);
/**
* 儲存操作
* @param user
* @return
*/
@Insert("insert into 
user(username,sex,birthday,address)values(#{username},#{sex},#{birthday},#{address}
)")
@SelectKey(keyColumn="id",keyProperty="id",resultType=Integer.class,before = 
false, statement = { "select last_insert_id()" })
int saveUser(User user);
/**
* 更新操作
* @param user
* @return
*/
@Update("update user set 
username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id 
=#{id} ")
int updateUser(User user);
/**
* 刪除使用者
* @param userId
* @return
*/
@Delete("delete from user where id = #{uid} ")
int deleteUser(Integer userId);
/**
* 查詢使用聚合函式
* @return
*/
@Select("select count(*) from user ")
int findTotal();
/**
/**
* 模糊查詢
* @param name
* @return
*/
//@Select("select * from user where username like #{username} ")
//或者是Select("select * from user where username like '%${value}%' ") value固定
List<User> findByName(String name);
}
通過註解方式,我們就不需要再去編寫 UserDao.xml 對映檔案了

編寫 SqlMapConfig 配置檔案

<?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>
<!-- 配置 properties 檔案的位置 --> <properties resource="jdbcConfig.properties"></properties>
<!-- 配置別名的註冊 --> <typeAliases> <package name="com.itheima.domain"/>
</typeAliases>
<!-- 配置環境 --> <environments default="mysql">
<!-- 配置 mysql 的環境 --> <environment id="mysql">
<!-- 配置事務的型別是 JDBC --> <transactionManager type="JDBC"></transactionManager>
<!-- 配置資料來源 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 配置對映資訊 --> <mappers>
<!-- 配置 dao 介面的位置,它有兩種方式
第一種:使用 mapper 標籤配置 class 屬性
第二種:使用 package 標籤,直接指定 dao 介面所在的包
--> 
<package name="com.itheima.dao"/>
</mappers>
</configuration>

使用註解實現複雜關係對映開發

@Results 註解
代替的是標籤<resultMap>
該註解中可以使用單個@Result 註解,也可以使用@Result 集合
@Results({@Result(),@Result()})或@Results(@Result())
@Resutl 註解
代替了 <id>標籤和<result>標籤
@Result 中 屬性介紹:
id 是否是主鍵欄位
column 資料庫的列名
property 需要裝配的屬性名
one 需要使用的@One 註解(@Result(one=@One)()))
many 需要使用的@Many 註解(@Result(many=@many)()))
@One 註解(一對一)
代替了<assocation>標籤,是多表查詢的關鍵,在註解中用來指定子查詢返回單一物件。
@One 註解屬性介紹:
select 指定用來多表查詢的 sqlmapper
fetchType 會覆蓋全域性的配置引數 lazyLoadingEnabled 是否延遲載入
使用格式:
@Result(column=" ",property="",one=@One(select=""))

@Many 註解(多對一)
代替了<Collection>標籤,是是多表查詢的關鍵,在註解中用來指定子查詢返回物件集合。
注意:聚集元素用來處理“一對多”的關係。需要指定對映的 Java 實體類的屬性,屬性的 javaType
(一般為 ArrayList)但是註解中可以不定義;
使用格式:
@Result(property="",column="",many=@Many(select=""))

使用註解實現一對一複雜關係對映及延遲載入

新增賬戶的持久層介面並使用註解配置

/**
* 
* <p>Title: IAccountDao</p>
* <p>Description: 賬戶的持久層介面</p>
* <p>Company: http://www.itheima.com/ </p>
*/
public interface IAccountDao {
/**
* 查詢所有賬戶,採用延遲載入的方式查詢賬戶的所屬使用者
* @return
*/
@Select("select * from account")
@Results(id="accountMap",
value= {
@Result(id=true,column="id",property="id"),
@Result(column="uid",property="uid"),
@Result(column="money",property="money"),
@Result(column="uid",
property="user",
one=@One(select="com.itheima.dao.IUserDao.findById",
fetchType=FetchType.LAZY) )
})
List<Account> findAll();

使用註解實現一對多複雜關係對映

需求:
查詢使用者資訊時,也要查詢他的賬戶列表。使用註解方式實現。
分析:
一個使用者具有多個賬戶資訊,所以形成了使用者(User)與賬戶(Account)之間的一對多關係

/**
*
* <p>Title: IUserDao</p>
* <p>Description: 使用者的持久層介面</p>
* <p>Company: http://www.itheima.com/ </p>
*/
public interface IUserDao {
/**
* 查詢所有使用者
* @return
*/
@Select("select * from user")
@Results(id="userMap",
value= {
@Result(id=true,column="id",property="userId"),
@Result(column="username",property="userName"),
@Result(column="sex",property="userSex"),
@Result(column="address",property="userAddress"),
@Result(column="birthday",property="userBirthday"),
@Result(column="id",property="accounts",
many=@Many(
select="com.itheima.dao.IAccountDao.findByUid",
fetchType=FetchType.LAZY
) )
})
List<User> findAll();
}
@Many:
相當於<collection>的配置
select 屬性:代表將要執行的 sql 語句
fetchType 屬性:代表載入方式,一般如果要延遲載入都設定為 LAZY 的值

mybatis 基於註解的二級快取

在 SqlMapConfig 中開啟二級快取支援

<!-- 配置二級快取 --> <settings>
<!-- 開啟二級快取的支援 --> <setting name="cacheEnabled" value="true"/>
</settings>

在持久層介面中使用註解配置二級快取

/**
* 
* <p>Title: IUserDao</p>
* <p>Description: 使用者的持久層介面</p>
* <p>Company: http://www.itheima.com/ </p>
*/
@CacheNamespace(blocking=true)//mybatis 基於註解方式實現配置二級快取
public interface IUserDao {}