1.mybatis的概念:
ORM: 對象關係映射
對象模型與數據庫的關係模型是不匹配的,通常手動完成表中列與對象的屬性之間的對應關係。
表 《-----》 類
表與表的關係 《--------》類與類(字段)的關係
Hibernate(冬眠)/JPA(java持久化API)
MyBatis/ibatis
2.mybatis的定義以及實現MyBatis的兩種方法
mybatis的定義:SQL映射(方法)技術,封裝了JDBC的操作,簡化了對關係數據庫的操作的框架。
1.基於XML(java 5之前沒有註解)
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">
//namespace指定接口名稱
//id指定了方法名:selectBlog
//調用了上述接口中的指定方法執行SQL語句
//查詢結果集封裝成resultType指定的類型
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
java:
package org.mybatis.example;
public interface BlogMapper {
Blog selectBlog(int id);
}
2.基於註解映射
package org.mybatis.example;
public interface BlogMapper {
//java5.0支持註解,不需要寫BlogMapper.xml文件
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
3.官方介紹:
https://mybatis.org/mybatis-3/zh/index.html
SQL Mapping Framework for Java:基於java的SQL映射框架。
4.核心API
SqlSessionFactory:SQL 會話工廠(數據庫連接池)
SqlSession:SQL會話(一個數據庫連接)
Mapper:SQL 映射(執行SQL語句)
5.基於SQL映射
@One
@Many
@ResultMap:對@Result的命名,是可複用
@Results:映射表和類
@Result:具體的列和屬性
@MapKey:返回Map時指定key對應的屬性
@Options:其他選項,如獲得自動生成的key
6.動態SQL
定義:SQL語句執行時,會根據傳入的參數的個數及參數的內容而發生變化。
動態 SQL 基於條件查詢。
xml方式:
//select * from post where id in(1,2,3,);
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
//條件(可選的)查詢
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
//可選條件
<if test="title != null">
AND title like #{title}
</if>
</select>
Java & 註解 實現動態 SQL
return new SQL() {{
SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");
FROM("PERSON P");
if (id != null) {
WHERE("P.ID like #{id}");
}
if (firstName != null) {
WHERE("P.FIRST_NAME like #{firstName}");
}
if (lastName != null) {
WHERE("P.LAST_NAME like #{lastName}");
}
ORDER_BY("P.LAST_NAME");
}}.toString();
實現動態MySQL的方法
@SelectProvider
@DeleteProvider
@UpdateProvider
@InsertProvider