-
什麼是 MyBatis?
MyBatis 是一款優秀的持久層架構,它支援自定義 SQL、存儲過程以及進階映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設定參數和擷取結果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為資料庫中的記錄。
mybatis-------------(一篇足矣)mybatis
文章目錄
- mybatis
-
- mybatis的曆史
- 注解版:查詢所有SearchAll
-
- 資料庫和表:User
- 結果集映射Result
- 注解版注解總結
- 分頁查詢
- 通用Mapper
-
- 概述
- API
- mybatis的XML方式
-
- 入門案例:查詢指定使用者
- Mapper基本結構
- Mapper 參數類型:parameterType
- Mapper 結果類型:resultType
- Mapper 映射關系:ResultMap
- 自定義别名
- 動态SQL
-
- 什麼是動态SQL
- if 标簽
- where 标簽
- foreach 标簽
- choose 标簽:多條件
- sql 标簽
- 自動比對規範駝峰規則
mybatis
mybatis的曆史
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis,實質上Mybatis對iBatis進行一些改進。
注解版:查詢所有SearchAll
mybatis所需的jar包和配置檔案(連結:https://pan.baidu.com/s/1e_vWUodbaCXGl_qdFDNTOQ 提取碼:zr3p);
資料庫和表:User
# 建立資料庫
CREATE DATABASE ssm_db1;
# 使用資料庫
USE ssm_db1;
# 1.1 建立使用者表
CREATE TABLE `user` (
`uid` VARCHAR(32) NOT NULL,
`username` VARCHAR(20) DEFAULT NULL, #使用者名
`password` VARCHAR(32) DEFAULT NULL, #密碼
`name` VARCHAR(20) DEFAULT NULL, #昵稱
`email` VARCHAR(30) DEFAULT NULL, #電子郵箱
`telephone` VARCHAR(20) DEFAULT NULL, #電話
`birthday` DATE DEFAULT NULL, #生日
`sex` VARCHAR(10) DEFAULT NULL, #性别
`state` INT(11) DEFAULT 0, #狀态:0=未激活,1=已激活
`code` VARCHAR(64) DEFAULT NULL, #激活碼
PRIMARY KEY (`uid`)
) ;
# 1.2 初始化使用者預設資料
INSERT INTO `user` VALUES ('u001','jack','1234','傑克','[email protected]','13612345678','2015-11-04','男',0,NULL);
INSERT INTO `user` VALUES ('u002','rose','1234','肉絲','[email protected]','13612345679','2015-11-05','女',0,NULL);
一. JavaBean
public class User {
private String uid;
private String userName;
private String password;
private String name;
private String email;
private Date birthday;
private String sex;
private Integer state;
private String code;
...get/set/toString
}
二. 編寫Dao:UserMapper
public interface UserMapper {
/**
* 查詢所有
* @return
*/
@Select("select * from user")
public List<User> selectAll();
}
三.修改:SqlMapConfig.xml
<mappers>
<!-- 表示加載此包下的所有dao接口-->
<package name="com.czxy.dao"/>
</mappers>
四.編寫測試類
public static void main(String[] args) throws IOException {
UserMapper userMapper = MyBatisUtils.getMapper(UserMapper.class);
List<User> list = userMapper.selectAll();
list.forEach(System.out::println);
MyBatisUtils.close();
}
結果集映射Result
實際開發中,如果資料庫字段和Java對象字段不能對應,就需要我們編寫對應關系。
注解 | 描述 |
---|---|
@Results | 對象和表的映射關系。 |
@Result | 一個對象屬性和一個表的字段的映射關系。 |
@ResultMap | 映射關系,使用@Results聲明的映射關系。 |
文法:
/**
@Results(value = 一組Result )
*/
@Results(value = {
@Result(property = "屬性名", column = "字段名", id = true),
@Result(property = "屬性名2", column = "字段名2"),
@Result(property = "屬性名3", column = "字段名3")
})
注解版注解總結
注解名稱 | 描述 |
---|---|
@Insert | 添加sql |
@Update | 更新sql |
@Delete | 删除sql |
@Select | 查詢sql |
@Param | 形參命名 |
@Results | 對象和表的映射關系。 |
@Result | 一個對象屬性和一個表的字段的映射關系。 |
分頁查詢
文法:
1) 設定分頁資料
PageHelper.startPage(int pageNum, int pageSize)
參數1:pageNum 第幾頁
參數2:pageSize 頁面顯示個數
2) 封裝分頁結果 PageInfo
new PageInfo(查詢結果) //建立分頁對象
pageInfo.getTotal(), //自動查詢總條數
pageInfo.getPages(), //總分頁數
//TODO: 實際操作
public static void main(String[] args) {
StudentMapper studentMapper = MyBatisUtils.getMapper(StudentMapper.class);
//設定分頁參數
PageHelper.startPage(1,2);
//分頁資料
List<Student> list = studentMapper.searchAllStudent();
//分頁封裝
PageInfo<Student> pageInfo = new PageInfo<>(list);
System.out.println("總條數:"+pageInfo.getTotal());
System.out.println("每頁個數:"+pageInfo.getPageSize());
System.out.println("目前頁:"+pageInfo.getPageNum());
System.out.println("分頁數:"+pageInfo.getPages());
System.out.println("是否上一頁:"+pageInfo.isHasPreviousPage());
System.out.println("是否下一頁:"+pageInfo.isHasNextPage());
MyBatisUtils.commitAndclose();
}
通用Mapper
概述
- 通用Mapper對MyBatis進行簡化的第三方工具包。
- 通用Mapper提供了一個名為
的接口,用于自動完成單表的增删改查操作。Mapper<T>
- 如果通用Mapper中的方法不足以滿足你的需求,直接添加自定義方法即可。
public interface UserMapper extends Mapper<User> {
}
API
- 查詢方法
方法名 描述 T selectOne(T t) 根據實體中的屬性進行查詢,隻能有一個傳回值,有多個結果是抛出異常,查詢條件使用等号 List select(T t) 根據實體中的屬性值進行查詢,查詢條件使用等号 List selectAll() 查詢全部結果 int selectCount(T t) 根據實體中的屬性查詢總數,查詢條件,使用等号 T selectByPrimaryKey(Object key) 根據主鍵字段進行查詢 boolean existsWhithPrimaryKey(Object key) 根據主鍵字段查詢記錄是否存在 List selectByExample(Object example) 根據Example條件進行查詢 T selectOneByExample(Object example) 根據Example條件進行查詢,隻能有一個傳回值 int selectCountByExample(Object example) 根據Example條件進行查詢記錄數 - 插入方法
方法名 描述 int insert(T t) 儲存一個實體,null的屬性也會儲存,不會使用資料庫預設值 int intsertSelective(T t) 儲存一個實體,null的屬性不會儲存,使用資料庫預設值 - 更新方法
方法名 描述 int updateByPrimaryKey(T t) 根據主鍵更新實體全部字段,null值會被更新 int updateByPrimaryKeySelective(T t) 根據主鍵更新實體中不為null值的字段 - 删除方法
方法名 描述 int delete(T t) 根據實體屬性作為條件進行删除,查詢條件使用等号 int deletePrimaryKey(Object key) 根據主鍵字段進行删除 int deleteByExample(Object example) 根據Example條件删除資料
mybatis的XML方式
入門案例:查詢指定使用者
一. 修改核心配置檔案
<mappers>
<!-- 表示加載此包下的所有dao接口-->
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
二. UserMapper接口
public interface UserMapper {
/**
* 查詢使用者
* @return
*/
public List<User> searchUser(String userName);
}
三. UserMapper.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="com.czxy.dao.UserMapper">
<select id="searchUser" parameterType="string" resultType="user">
select * from `user` where user_name=#{userName}
</select>
</mapper>
四. 測試類
/**
* 查詢使用者資訊
*/
@Test
public void searchUser(){
UserMapper userMapper = MyBatisUtils.getMapper(UserMapper.class);
List<User> list = userMapper.searchUser("張三");
list.forEach(System.out::println);
MyBatisUtils.commitAndclose();
}
Mapper基本結構
<?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="Mapper類">
<!-- 查詢 -->
<select id="方法名">SQL語句</select>
<!-- 添加 -->
<insert id="方法名">SQL語句</insert>
<!-- 更新 -->
<update id="方法名">SQL語句</update>
<!-- 删除 -->
<delete id="方法名">SQL語句</delete>
</mapper>
Mapper 參數類型:parameterType
- 在映射檔案mapper中,我們使用parameterType設定請求參數的類型
<?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="mapper類">
<select id="方法名" parameterType="參數類型">SQL語句</select>
</mapper>
- 簡單類型:
<!-- 通過id查詢 --> <select id="findUserById" parameterType="int" resultType="com.czxy.domain.User"> select * from user where uid = #{id} </select>
- POJO類型:
<!-- 添加使用者 --> <insert id="insertUser" parameterType="com.czxy.domain.User"> insert into user(uid, username, password, name, email, birthday, sex, state) values(#{uid},#{username},#{password},#{name},#{email},#{birthday},#{sex},#{state}) </insert>
Mapper 結果類型:resultType
- 在映射檔案mapper中,我們使用resultType設定查詢結果類型
<?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="mapper類">
<select id="方法名" resultType="結果類型">SQL語句</select>
</mapper>
- 簡單類型
<!-- 總記錄數 --> <select id="findUserCount" resultType="int"> select count(*) from user </select>
- POJO類型
<!-- 通過id查詢 --> <select id="findUserById" parameterType="int" resultType="com.czxy.domain.User"> select * from user where uid = #{id} </select>
Mapper 映射關系:ResultMap
- resultType可以指定pojo将查詢結果封裝到該pojo中,但需要pojo的屬性名和sql查詢的列名保持一緻。
- 如果sql查詢字段名和pojo的屬性名不一緻,可以通過resultMap将字段名和屬性名作一個對應關系。
- 文法:
<!--聲明映射--> <resultMap type="JavaBean類型" id="resultMap名稱"> <id column="表列名" property="JavaBean屬性名"/> <!--用于配置主鍵的映射--> <result column="表列名" property="JavaBean屬性名"/> <!--用于配置普通結果集映射--> </resultMap> <!--使用映射--> <select resultMap="resultMap名稱"> </select>
自定義别名
- 聲明别名,在 SqlMapConfig.xml 配置檔案中聲明
- 方式1:一次定義一個類
<typeAliases> <typeAlias type="類型" alias="别名"/> </typeAliases>
- 方式2:一次定義一個包下的所有類
<typeAliases> <package name="包名"/> </typeAliases>
- 方式1:一次定義一個類
動态SQL
什麼是動态SQL
動态SQL就是Mybatis允許在映射檔案中通過标簽控制SQL語句最後的拼湊結果。
if 标簽
- 文法:在mapper映射檔案中,<if>标簽就相當于Java中if語句,如果條件成立,标簽體内的SQL語句有效。
<select> <if test="條件"> //有效的SQL語句片段 </if> <select>
- 多條件查詢,拼湊恒等條件 where 1=1
<select id="condition" parameterType="userVo" resultType="user" > select * from user where 1=1 <if test="name != null and name != ''"> and name like '%${name}%' </if> </select>
where 标簽
- 多條件查詢時,我們使用了一個小技巧“where 1=1”,mybatis提供了一個
進行取代。<where>
- 修改映射檔案
<select id="condition" parameterType="userVo" resultType="user" > select * from user <where> <if test="name != null and name != ''"> and name like '%${name}%' </if> </where> </select>
foreach 标簽
- 文法:
<!-- <foreach> 就是周遊一組資料,根據指定的内容拼湊成SQL語句片段 collection ,需要周遊的資料,如果實際參數就是數組本身,此處需要使用array item ,每一次循環時存放資料的變量,在标簽體中可以通過 ${item值}獲得周遊資料 open ,SQL語句片段的開發位置 separator,分隔符号 close ,SQL語句片段的結束位置 --> <!-- 例如:uid in (1,2,4,6) 片段的拼湊 開始 (變量 分隔符)*4 結束 --> <foreach collection="數組" open="uid in (" item="變量" separator="," close=")"> </foreach>
- 多條件查詢
<select id="condition" parameterType="userVo" resultType="user" > select * from user <where> <!-- uid in (1,2,4,6) --> <foreach collection="ids" open="uid in (" item="id" separator="," close=")"> '${id}' </foreach> </where> </select>
choose 标簽:多條件
-
文法
類似java中的switch,滿足when中的條件退出判斷,如果都不滿足就進入otherwise
<select id="">
<choose>
<when test=""></when>
<when test=""></when>
<otherwise></otherwise>
</choose>
</select>
sql 标簽
- MyBatis為我們提供了代碼片段,使用
定義公共SQL語句,使用<sql>
将需要的SQL片段拼湊到指定的位置。<include>
<!-- 所有字段名稱SQL片段 -->
<sql id="user_all_column">uid, username, password, name, email, birthday, sex, state</sql>
<select id="selectAll" parameterType="string" resultMap="userResultMap">
select <include refid="user_all_column" /> from user
</select>
自動比對規範駝峰規則
資料庫中我們習慣使用全大寫,多個單詞用下劃線隔開,而po對象中,習慣使用java駝峰規則。那一個一個手工寫resultMap字段,浪費開發時間,直接配置一下就可以了。
如:
資料庫字段: user_name
Javabean屬性: private String userName
mapper配置不需要寫字段與屬性的配置,會自動映射
- 在SqlMapConfig.xml中進行配置
<settings>
<!--駝峰映射-->
<!--java對象樹形駝峰 例如userName,對應資料的下劃線 例如:user_name-->
<setting name="mapUnderscoreToCamelCase" value="false"/>
</settings>
- resultMap配置autoMapping=“true”
<resultMap type="String" id="user" autoMapping="true">
</resultMap>