Mybatis入門 Mybatis的作用 解決的問題 基本操作
為什麼要學MyBatis
我們連結運算元據庫需要做的步驟
package Test;
import java.sql.*;
public class test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//註冊驅動
Class.forName("com.mysql.jdbc.Driver");
//獲取連結
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3309/test", "root", "1234");
//獲取statement
PreparedStatement statement = connection.prepareStatement("select id from user");
//執行
ResultSet resultSet = statement.executeQuery();
//遍歷結果集
while(resultSet.next()){
}
//釋放資源
resultSet.close();
statement.close();
connection.close();
}
}
缺點:
原始jdbc開發存在的問題如下:
1.資料庫建立及頻繁釋放造成系統資源浪費
2.sql語句在程式碼中硬編碼,實際運用中sql的變化較大,sql變動需要改變java程式碼
3.查詢操作,需要手動將結果集裡的資料封裝到實體中,插入操作時,需要手動將實體的資料設定到sql語句的佔位符
解決方案:
1.使用資料庫連線池技術
2.使用xml配置的方式配置sql語句
3.使用反射內省的技術自動將實體和表進行屬性與欄位的自動對映
這個解決方案不用我們去實現,因為mybatis都幫我們實現好了,站在前人的肩膀上幹活總是省力
Mybatis是什麼:
一個優秀的基於java的持久層框架,內部封裝了jdbc,使開發者只需要關心sql語句本身,而不需要花費經歷在如何載入驅動,建立連結,建立statement等繁雜的過程
mybatis通過註解和xml配置的方式將要執行各種statement配置起來。並通過java物件和statement中的動態引數進行對映生成最終執行的sql語句
最後mybatis框架執行sql語句並將其封裝為java物件返回採用ORM思想解決了實體與資料庫對映的問題,遮蔽了jdbc api 底層訪問細節,使我們不用與jdbc api 打交道,就可以完成對資料庫的持久化操作。
ORM簡介:
ORM(Object Relational Mapping)物件關係對映,它的作用是在關係型資料庫和物件之間作一個對映,這樣,我們在具體的運算元據庫的時候,就不需要再去和複雜的SQL語句打交道,只要像平時操作物件一樣操作它就可以了 ,即將程式中的物件自動的持久化到關聯式資料庫中
O(物件模型):
實體物件,即我們在程式中根據資料庫表結構建立的一個個實體Entity。
R(關係型資料庫的資料結構):
即我們建立的資料庫表。
M(對映):
從R(資料庫)到O(物件模型)的對映,可通過XML檔案對映。
如圖:當表實體傳送變化時,ORM會幫助我們把實體的變化對映到資料庫表。
作用
ORM框架自動實現Entity實體的屬性與關係型資料庫欄位的對映。CRUD的工作則可以交給ORM來自動生成程式碼方式實現。隱藏了資料訪問細節,“封閉”的通用資料庫互動,他使得我們的通用資料庫互動變得簡單易行,並且完全不用考慮SQL語句。大大提高我們開發效率, 這樣一來也減少我們維護一個複雜 缺乏靈活性資料訪問層的成本。
下面我們用一個簡單的案例來給大家操作一下Myabatis的基本實現
1.所需的jar座標
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
2.建立一個簡單的表
3.在java中寫一個對應的類
package domain;
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
4.編寫對映檔案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="UserAction">
<select id="selectId" resultType="int">
select id from Test
</select>
</mapper>
5.編寫核心檔案SqlMapConfig.xml
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
<property name="url" value="jdbc:mysql://localhost:3309/test"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
6.測試類
package Test;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class test2 {
@Test
public void test1() throws IOException {
//載入核心配置檔案
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//獲取sqlsession工廠物件
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//獲取session物件
SqlSession sqlSession = sqlSessionFactory.openSession();
//執行sql語句
List<Integer> id = sqlSession.selectList("UserAction.selectId");
System.out.println(id);
//釋放資源
sqlSession.close();
}
}
結果
1.插入操作
<insert id="add" parameterType="domain.User">
insert into test values(#{id},#{name})
</insert>
括號裡的名字要與傳入的物件中的變數名一致
2.修改操作
<update id="update" parameterType="domain.User">
update test set username=#{name} where id=#{id}
</update>
括號裡的名字要與傳入引數一致
3.刪除操作
<!--刪除操作-->
<delete id="delete" parameterType="int">
delete * from test where id=#{id}
</delete>
括號裡的名字要與傳入引數一致
Mybatis核心配置檔案的配置項概述
1.environments標籤
事務管理器
其中,事務管理器(transactionManager)型別有兩種:
JDBC:這個配置就是直接使用了JDBC 的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務作用域。
MANAGED:這個配置幾乎沒做什麼。它從來不提交或回滾一個連線,而是讓容器來管理事務的整個生命週期(比如 JEE 應用伺服器的上下文)。 預設情況下它會關閉連線,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設定為 false 來阻止它預設的關閉行為。
資料來源
其中,資料來源(dataSource)型別有三種:
UNPOOLED:這個資料來源的實現只是每次被請求時開啟和關閉連線。
POOLED:這種資料來源的實現利用“池”的概念將 JDBC 連線物件組織起來。
JNDI:這個資料來源的實現是為了能在如 EJB 或應用伺服器這類容器中使用,容器可以集中或在外部配置資料來源,然後放置一個 JNDI 上下文的引用。
2.mapper標籤
該標籤的作用是載入對映的,載入方式有如下幾種:
使用相對於類路徑的資源引用,例如:
使用完全限定資源定位符(URL),例如:
使用對映器介面實現類的完全限定類名,例如:
將包內的對映器介面實現全部註冊為對映器,例如:
3.properties標籤
和spring框架中的配置沒區別
4. typeAliases標籤
一個用於取別名的標籤
本來的配置
<select id="findAll" resultType=“user">
select * from User
</select>
許多別名mybatis已經幫我們配置好了
一些對應的API
常用API:SqlSessionFactory build(InputStream inputStream)
通過載入mybatis的核心檔案的輸入流的形式構建一個SqlSessionFactory物件
String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
其中, Resources 工具類,這個類在 org.apache.ibatis.io 包中。Resources 類幫助你從類路徑下、檔案系統或一個 web URL 中載入資原始檔。
SqlSessionFactory 有多個個方法建立 SqlSession 例項。常用的有如下兩個:
SqlSession 例項在 MyBatis 中是非常強大的一個類。在這裡你會看到所有執行語句、提交或回滾事務和獲取對映器例項的方法。
主要執行語句
<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement, Object parameter)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)
操作事務的方法
void commit()
void rollback()