MyBatis作用
- MyBatis 是支援定制化 SQL、存儲過程以及進階映射的優秀的持久層架構。
- MyBatis 避免了幾乎所有的 JDBC 代碼和手動設定參數以及擷取結果集。
-
MyBatis可以使用簡單的XML用于配置和原始映射,将接口和Java的POJO類映射成資料庫中的記錄
使開發者隻需要關注 SQL 本身,而不需要花費精力去處理例如注冊驅動、建立connection、建立statement、手動設定參數、結果集檢索等jdbc繁雜的過程代碼。
曆史
-
原是apache的一個開源項目iBatis
2010年6月這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。
iBATIS一詞來源于“internet”和“abatis”的組合,是一個基于Java的持久層架構。
為什麼要使用MyBatis?
JDBC
SQL夾在Java代碼塊裡,耦合度高導緻寫死内傷
維護不易且實際開發需求中sql是有變化,頻繁修改的情況多見
要自已建立connection、建立statement、手動設定參數、結果集檢索等
Hibernate
長難複雜SQL,對于Hibernate而言處理也不容易
内部自動生産的SQL,不容易做特殊優化。
基于全映射的全自動架構,javaBean存在大量字段時無法隻映射部分字段。導緻資料庫性能下降。
Mybatis
對開發人員而言,核心sql還是需要自己優化
MyBatis是一個半自動化的持久化層架構。
MyBatis 是支援定制化 SQL、存儲過程以及進階映射的優秀的持久層架構。
MyBatis入門程式
1. 下載下傳Mybatis核心包
http://www.mybatis.org/mybatis-3/getting-started.html
https://github.com/mybatis/mybatis-3/releases
2.建立工程,引入MyBatis核心包及依賴包
3.建立customer表,建立與表對象的domain
4.建立MyBatis核心配置檔案SqlMappingConfig.xml
5.建立與表對象的關系映射Mapping檔案編寫sql語句<?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整合後 environments配置将廢除 使用spring中的連接配接池 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc事務管理 --> <transactionManager type="JDBC" /> <!-- 資料庫連接配接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /> <property name="username" value="root" /> <property name="password" value="1234" /> </dataSource> </environment> </environments> </configuration>
6.在核心配置檔案當中引入Mapping<?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="myTest"> <!--根據cust_id查詢客戶--> <select id="queryCustomerById" parameterType="Int" resultType="com.itlike.domain.Customer"> SELECT * FROM `customer` WHERE cust_id = #{cust_id} </select> </mapper>
7.建立工廠,執行sql語句<!--加載映射檔案--> <mappers> <mapper resource="com/myxq/domain/Customer.xml"></mapper> </mappers>
MyBatis核心Api
SqlSessionFactoryBuilder:用于建立SqlSessionFacoty
SqlSessionFacoty:一旦建立完成就不需要SqlSessionFactoryBuilder了
因為SqlSession是通過SqlSessionFactory建立的
是以可以将SqlSessionFactoryBuilder當成一個工具類使用,最佳使用範圍是方法範圍即方法體内局部變量。
SqlSessionFactory:建立sqlSession的工廠,是一個接口
接口中定義了openSession的不同重載方法
SqlSessionFactory的最佳使用範圍是整個應用運作期間,一旦建立後可以重複使用,通常以單例模式管理SqlSessionFactory。
SqlSession:連接配接到資料庫的一個會話
sqlSession中定義了資料庫操作方法。
每個線程都應該有它自己的SqlSession執行個體
SqlSession的執行個體不能共享使用,它也是線程不安全的。是以最佳的範圍是請求或方法範圍
絕對不能将SqlSession執行個體的引用放在一個類的靜态字段或執行個體字段中。
MyBatis架構

MyBatis-查詢
- 封裝工具類
public class MyBatisUtils {
public static final SqlSessionFactory sessionFactory;
//靜态代碼塊 隻加載一次
static {
//1 加載配置檔案的
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//2 讀取配置檔案 在src目錄下
InputStream resourceAsStream = null;
try {
resourceAsStream = Resources.getResourceAsStream("SqlMappingConfig.xml");
} catch (IOException e) {
e.printStackTrace();
}
//3 擷取session工廠 session就是與資料庫的一個會話
sessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
}
public static SqlSession openSession(){
return sessionFactory.openSession();
}
}
查詢所有
配置sql語句在控制台列印
在SqlMappingConfig.xml
模糊查詢
查詢失敗示例:
為什麼:對于參數#{cust_name}來說,該查詢語句執行時,會轉化為sql語句
SELECT * FROM customer WHERE cust_name LIKE '%?'%'
,也就是#{cust_name}=‘cust_name’ 多了一對單引号 是以産生文法錯誤
解決方法:
先介紹#{}與${}的差別
#{}
表示一個占位符号,通過#{}可以實作preparedStatement向占位符中設定值
自動進行java類型和jdbc類型轉換
#{}可以有效防止sql注入
#{}可以接收簡單類型值或pojo屬性值
如果parameterType傳輸單個簡單類型值,#{}括号中可以是value或其它名稱
${}
表示拼接sql串
通過${}可以将parameterType 傳入的内容拼接在sql中且不進行jdbc類型轉換
${}可以接收簡單類型值或pojo屬性值
如果parameterType傳輸單個簡單類型值,${}括号中隻能是value ${value}
注意采用${}方式無法防止sql注入,是以還是使用#{},隻不過是#{一個名稱} 而傳參數為"%李%" 就是把%李%當做一個占位符
MyBatis-插入一條資料
一定要手動添加事務,若無送出事務則添加不了到資料庫
擷取最後插入的id
背景:引導使用者注冊時需讓使用者填寫的資訊越少越好,注冊完之後再調至完善個人資訊的視窗,是以需要擷取最後插入的那1條記錄,在配置插入語句的前面加上以下内容,最後在送出事務語句後就可以擷取id了
更新操作
先找出要更新的對象,将要修改的字段設定好,傳入update方法,删除操作也類似
Customer customer = sqlSession.selectOne("queryCustomerById", 12);
customer.setCust_name("孫悟空");
sqlSession.update("updateCustomer", customer);
删除操作
Customer customer = sqlSession.selectOne("queryCustomerById", 13);
sqlSession.delete("deleteCustomer", customer);