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()