mybatis註解開發
阿新 • • 發佈:2020-07-17
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 {}