本篇将和大家一起分享MyBatis 3架構,此架構的主要作用就是更加便攜地操作資料庫,比如将資料庫傳回的内容進行List或實體類的封裝,将執行操作的SQL語句配置到XML檔案中,這樣做有利于代碼的後期維護,使代碼的分層更加明确。MyBatis 架構還具有優化查詢效率的緩存等功能。那麼在本篇中,大家應該會掌握如下内容:
- 使用基于Eclipse的MyBatis插件執行CURD增删改查操作;
- 使用MyBatis操作常用資料庫Oracle、 MySQL、MsSQL;
- MyBatis架構中核心對象的生命周期;
- MyBatis結合ThreadLocal類進行CURD的封裝。

MyBatis簡介
為什麼要使用MyBatis架構呢?舉一個最簡單的例子,在使用傳統的JDBC代碼時,需要寫上必要的DAO層代碼,在DAO層代碼中将資料表中的資料封裝到自定義的實體類中。這給代碼的維護帶來了問題。但MyBatis和Hibernate 解決了這樣的問題,使用它們做查詢時,可以自動地将資料表中的資料記錄封裝到實體或Map中,再将它們放入List中傳回。這麼常見的功能都可以由MyBatis 和Hibernate 自由友善地實作,可見,使用這兩個架構開發應用軟體會非常友善快捷。
MyBatis是一個持久化架構,它有不同的語言版本,比如.NET和Java都有MyBatis對應的類庫;它有大多數ORM架構都具有的功能,比如程式員自定義的SQL語句、調用存儲過程和一些進階的映射。但在這裡需要說明的是,它是一種半自動化的ORM映射架構,是以使用方式和Hibernate有非常大的差別。它以SQL語句為映射基礎,在使用MyBatis 架構時,可以将SQL語句靈活多變的特性融入項目開發中。
另外,如果使用MyBatis這個架構,還可以省略大多數的JDBC代碼,因為它把常用的JDBC操作都進行了封裝,可以加快開發效率。MyBatis可以使用XML或Annotations注解的方式将資料表中的記錄映射成一個Map或Java POJO實體對象,這也是現在流行ORM的技術方向。比如Hibermate和大多數JPA規範實作者都可以使用Annotations注解的方式來設計程式。
MyBatis操作資料庫的步驟
開門見山永遠是快速學習一門技術最好的方式。
MyBatis架構的核心是SqlSessionFactory對象,從SqlSessionFactory類的名稱來看,它是建立SqlSession對象的工廠。但SqISessionFactory對象的建立來自于SqlSessionFactoryBuilder類,也就是使用SqlSessionFactoryBuilder類建立SqlSessionFactory對象。
使用SqlSessionFactoryBuilder類建立SqlSessionFactory 對象的方式可以來自于一個XML配置檔案,也可以來自于一個執行個體化的Configuration對象。
使用XML配置檔案建立SqlSessionFactory對象
package test;
import java. io. IOException;
import java. io. InputStream;
import org .apache. ibatis. io.Resources;
import org. apache. ibatis. session. SqlSessionFactory;
import org. apache. ibatis.session.sqlSessionFactoryBuilder;
public class Test {
public static void main(String[] args) {
try {
String resource = "mybatis-config. xml";
InputStream inputStream = Resources . getResourceAsStream (resource) ;
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ()
. build (inputStream) ;
System. out.println (sqlSessionFactory) ;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace () ;
}
}
}
上述代碼的主要作用就是取得SqlSessionFactory工廠對象。下面測試代碼是否能正常建立SqlSessionFactory類的執行個體。
其中mybatis-config. xml配置檔案連接配接資料庫的内容如下。
<?xml version="1.0" encoding= "UTE-8" ?>
<! DOCTYPE configuration
PUBLIC "-/ /mybatis.org//DTD Config 3.0//EN"
"http://mybatis. org/dtd/mybatis-3-config .dtd">
<configuration>
<envi ronments default= "deve lopment">
<envi ronment id= "development ">
<transactionManager type= "JDBC" />
<dataSource type= "POOLED">
<property name= "driver"
value= "com. microsoft.sqlserver. jdbc. sQLServerDriver" />
<property name= "url"
value= "jdbe:sqlserver ://localhost:1079;databaseName=ghydb" />
<property name= "username" value="sa" />
<property name= "password" value="" />
</dataSource>
</envi ronment>
</envi ronments>
</configuration>
配置檔案mybatis-config.xml 中主要定義的就是如何連接配接資料庫,以及連接配接資料庫所必備的username和password及url 等參數。
加入當時最新版的MyBatis架構的jar包,如下圖所示。
運作程式後并沒有出現異常,輸出的資訊如下圖所示。
到此,SqlSessionFactory 對象成功地從XML配置檔案中建立。
SqlSessionFactoryBuilder和SqlSessionFactory類的結構
SqlSessionFactoryBuilder類的架構:
SqlSessionFactory類的結構:
從上面兩個圖可以看到,兩者的類結構中基本上全是重載的方法,主要是為了取得SqlSessionFactory和SqlSession對象。
使用MyBatis針對3種資料庫(0racle、MSSQL和MySQL)實作CURD
針對Oracle的CURD
建立userinfo資料表
建立userinfo資料表,表結構如下圖所示。
從Eclipse産生逆向的實體類
在Eclipse中建立java項目,名稱為oracleGenerator, 添加MyBatis配置檔案generatorConfig.xml, 配置代碼内容如下。
<?xml version="1.0" encoding= "UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC
"-//mybatis.org//DTD MyBatis
Generator
Configuration 1.0//EN" "http://mybatis. org/dtd/mybatis-generator-config_ 1 0.dtd" >
<generatorConfiguration>
<context id= "oracleGenerator">
<jdbcConnection driverClass= "oracle. jdbc. driver . OracleDriver"
connect ionURL= "jdbc:oracle: thin:@localhost: 1522:accp11g" userId= "ghy"
password="123" />
<j avaMode lGenerator targetPackage= "orm"
targetProject= "oracleGenerator" />
<sqlMapGenerator targetPackage= "orm" targetProject= "oracleGenerator" />
<javaCl ientGenerator targetPackage= "orm"
targetProject= "oracleGenerator" type= "XMLMAPPER" />
<table schema= "ghy" tableName= "userinfo">
<generatedKey column= "id" sqlStatement="select idauto.nextval from dual"
identity="false" />
</table>
</context>
</generatorConfiguration>
根據此配置檔案會生成實體類Userinfo.java。
建立Web項目并配置基本開發環境
回到MyEclipse,建立- -個 Web項目,命名為mybatis _curd_ _oracle, 将Eclipse項目oracleGenerator中的m包中的Userinfojava 複制到MyEclipse項目中的src路徑下,如下圖所示。
實體類Userinfo,java 的類結構如下圖所示。
在Web項目mybatis_ curd_ oracle 中的sre路徑下建立連接配接資料庫的配置檔案mybatis-config.xml,代碼如下。
<?xm1 version="1.0" encoding= "UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-/ /mybatis.org//DTD Config 3.0//EN"
"mybatis-3-config .dtd">
<configuration>
<envi ronments default= "development ">
<environment id= "development ">
<transact ionManager type= "JDBC" />
<dataSource type= "POOLED">
<property name= "driver" value= "oracle. jdbc.driver. OracleDriver" />
<property name= "url" value= "jdbc:oracle: thin:@localhost:1522:accp11g" />
<property name= "username" value= "ghy" />
<property name= "password" value="123" />
</dataSource>
</envi ronment>
</envi ronments>
<mappers>
<mapper resource= "userinfoMapping. xm1" />
</mappers>
</configuration>
其中userinfoMapping.xml映射檔案的内容如下。
<?xml version="1.0" encoding= "UTF-8" ?>
<! DOCTYPE mapper PUBLIC "-/ /mybatis.org//DTD Mapper 3.0//EN" "mybatis- 3-mapper . dtd">
<mapper namespace= "mybatis. testcurd">
<insert id= "insertUserinfo" parameterType= "orm. Userinfo">
<selectKey resultType= "java. lang. Long" keyProperty= "id"
order= "BEFORE">
select idauto. nextval from dual
</selectKey>
insert into
userinfo (id, username, password, age, insertDate)
values (#{id},#{username},#{password}, #(age},#{insertdate})
</insert>
<select id= "getUserinfoById" parameterType="int" resultType= "orm. Userinfo">
select from
userinfo where id=#{id}
</select>
<delete id= "dele teUserinfoById" parameterType= "int ">
delete f rom
userinfo where id=#{id}
</delete>
<select id= "getAl lUserinfo" resultType= "orm. Userinfo">
select * from userinfo
</select>
<update id= "upda teUserinfoById" pa rameterType= "orm. Userinfo">
update userinfo
set
username=# {username }, password= # {password} ,age=# {age}, insertDate=# {insertdate}
where id=#{id}
</update>
</mapper>
需要特别說明的是,如果SQL語句有一些特殊字段,則必須按照如下格式使用SQL語句。
<! [CDATA[ sql語句] ]>
其中配置代碼如下所示。
<selectKey resultType= "java. lang. Long" keyProperty="id"
order= "BEFORE">
select idauto.nextval from dual
</selectKey>
主要的功能是根據序列對象生成- -個主鍵id值,并且此值還可以從代碼中擷取,也就是插入- -條記錄後代碼就可以擷取剛才插入記錄的id值。
屬性parameterType定義參數的類型,屬性resultType 定義傳回值的類型。
繼續建立測試用的Servlet 對象,完整的項目結構如下圖所示。
上圖中可以發現src路徑下兩2個dtd檔案,這樣為了在開發xml配置或xml映射檔案時實作代碼自動提示功能。
根據id值查詢記錄
建立Servlet,核心代碼如下
public class getUserinfoById extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
// TODO Auto-generated catch block
e.printStackTrace () ;
}
}
}
查詢所有記錄
建立Servlet,核心代碼如下。
public class getAllUserinfo extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Sq1Session sqlSession = GetSqlSession. getSqlSession();
List<Userinfo> listUserinfo = sqlSession
. selectList ("mybatis. testcurd. getAllUserinfo");
for (int i = 0; i< listUserinfo.size(); i++) {
Userinfo userinfo = listUserinfo.get(i);
System. out. println (userinfo.getId() +""
+ userinfo.getUsername() + "”+ userinfo.getpassword(
+ ""+userinfo.getAge() +”"
+ userinfo.getInsertdate() . toLoealeString()) ;
sqlSession. commit() ;
sqlSession.close() ;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace() ;
}
}
}
更新記錄
建立Servlet,核心代碼如下。
public class updateUserinfoById extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
SqlSession sqlSession = GetSqlSession. getSqlSession() ;
Userinfo userinfo = sqlSession.selectOne (
"mybatis. testcurd. getUserinfoById", 7) ;
userinfo. setUsername ("最新版高洪岩") ;
sqlSess ion. update ("mybatis. testcurd. updateUserinfoById", userinfo) ;
sqlSession. commit() ;
sqlSession.close() ;
) catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace() ;
}
}
}
删除記錄
建立Servlet,核心代碼如下。
public class deleteUserinfoById extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
SqlSession sqlSession = GetSqlSession. getSqlSession() ;
sqlSess ion.delete ("mybatis. testcurd. deleteUserinfoById", 6);
sqlSession. commit() ;
sqlSession.close() ;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace() ;
}
}
}
針對MSSQL的CURD
操作MSSQL資料庫和操作Oracle資料庫的大體步驟相同,在SQL Server資料庫中建立資料表,如下圖所示。
使用Eclipse逆向實體類
用相同的方法在Eclipse中建立Java 項目,命名為mssqlGenerator,添加MyBatis生成檔案,配置内容如下。
<?xml version="1.0" encoding= "UTF-8" ?>
< ! DOCTYPE
generatorConfiguration
PUBLIC
"-//mybatis.org//DTD
MyBatis
Generator
Configuration 1.0//EN" "http://mybatis . org/dtd/ mybatis-generator-config_ 1_ _0.dtd" >
<generatorConfiguration>
<context id= "mssq1Generator ">.
<jdbcConnection dr iverClass= "com.mi crosoft . sqlserver. jdbc . SQLServerDriver"
connect ionURL= "jdbc:sqlserver://localhost : 1079;databaseName=ghydb"
userId="sa" password="" />
<j avaModelGenerator targetPackage= "orm"
targetProject= "mssqlGenerator" />
<sqlMapGenerator targetPackage= "orm" targetProject= "mssqlGenerator" />
<javaCl ientGenerator targetPackage= "orm”
targetProject= "mssqlGenerator" type= "XMLMAPPER" />
<table schema= "dbo" tableName= "userinfo">
<generatedKey column= "id" sqlStatement= "sqlserver"
identity="true" />
</tab1e>
</ context>
</generatorConfiguration>
關鍵代碼如下
<generatedKey column="id" sqlStatement= "sqlserver"
identity= "true' />
它的作用是定義userinfo資料表中的id字段是自增的,不需要顯式地設定值。
建立Web項目并搭建基本的開發環境
在MyEclipse中建立Web項目,複制Userinfo.java到Web項目中,并且建立一個連接配接資料庫的配置檔案mybatis-config.xml,代碼如下。
<?xml version="1.0" encoding= "UTF-8" ?>
<! DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"mybatis-3-config . dtd">
<configuration>
<envi ronments de fault= "devel opment ">
<envi ronment id= "devel opment ">
<transactionManager type= "JDBC" />
<dataSource type= "POOLED">
<property name= "driver"
value= "com. microsoft. sqlserver. jdbc. sQLServerDriver" />
<property name= "urI"
value= "jdbc:sqlserver://1ocalhost: 1079;databaseName =ghydb" />
<property name= "username" value="sa" />
<property name= "password" value="" />
</ dataSource>
</envi ronment>
</envi ronments>
<mappers>
<mapper resource= "userinfoMapping. xml" />
</mappers>
</ configuration>
還要建立sq1映射檔案userinfoMapping.xml,代碼如下。
<?xml version="I. 0" encoding= "UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis- 3-mapper . dtd">
<mapper namespace= "mybatis. testcurd">
<insert id= "insertUserinfo" parameterType= "orm. Userinfo"
useGeneratedKeys= "true" keyProperty= "id">
insert into
user info (username, password, age, insertDate)
values (# {username}, # {password},#{age}, #{insertdate})
</ insert>
<select id= "getUserinfoById" parameterType= "int" resultType= "orm. Userinfo">
select
from
userinfo where id=#{id}
</select>
<delete id= "deleteUserinfoById" parameterType= "int">
delete from
userinfo where id=#{id}
</delete>
<select id= "getAllUserinfo" resultType= "orm. Userinfo">
select * from userinfo
</select>
<update id= "upda teUserinfoById" parameterType= "orm. Userinfo">
update userinfo
set
username=# {username}, password= # {password} , age=# {age }, insertDate=# {insertdate}
where id=#{id}
</update>
</mapper>
添加記錄并且傳回主鍵值
建立Servlet對象,插入記錄的代碼和Oracle資料庫對應的Servlet代碼一緻, 運作後在控制台輸出3條記錄的主鍵ID值,結果如下圖所示。
針對MySQL的CURD
在MySQL資料庫中建立資料表userinfo,表結構如下圖所示。
一定要勾選Auto Increment複選框,以使字段id值實作自增的效果。
使用Eclipse逆向實體類
在Eclipse中建立Java 項目,添加逆向配置檔案generatorConfig.xml,代碼如下。
<?xml version= "1.0" encoding="UTF-8" ?>
< !DOCTYPE
generatorConfiguration
PUBLIC
"-//mybatis .org//DTD
MyBatis
Generator
Configuration 1.0//EN" "http://mybatis. org/dtd/mybatis-generator-config_ 1_ 0.dtd" >
<generatorConfiguration>
<context id= "mysqlGenerator">
<jdbcConnection driverClass= "com. mysq1. jdbc.Driver"
connect ionURL= "j dbc :mysql ://localhost: 3307/ghydb" userId= "root"
password= "123" />
<javaModelGenerator targetPackage= "orm"
targetProject= "mysqlGenerator" />
<sqlMapGenerator targetPackage= "orm" targetProject= "mysqlGenerator" />
<javaClientGenerator ta rgetPackage= "orm"
targetProject= "mysq1Generator" type= "XMLMAPPER" />
<table schema= "ghydb" tableName= "userinfo">
<generatedKey column= "id" sqlStatement= "mysql" identity="true" />
</table>
</context>
</generatorConfiguration>
建立Web項目并搭建基本的開發環境
在MyEclipse中建立Web項目,命名為mybatis_curd_ mysql, 複制Userinfojava實體類,并且建立一個連接配接資料庫的配置檔案mybatis-config.xml,代碼如下。
<?xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"mybatis-3-config. dtd">
<configuration>
<envi ronments default= "deve lopment">
<envi ronment id= "development">
<transact ionManager type= "JDBC" />
<dataSource type= "POOLED">
<property name= "driver" value= "com . mysql. jdbc. Driver" />
<property name= "url" value= "jdbc:mysql ://1ocalhost :3307/ghydb" />
<property name= "username" value="root" />
<property name= "password" value="123" />
</dataSource>
</envi ronment>
</envi ronments>
<mappers>
<mapper resource= "userinfoMapping.xml" />
</mappers>
</ configuration>
還要建立SQL映射檔案userinfoMapping.xml,代碼如下。
<?xml version="1.0" encoding= "UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis- 3-mapper.dtd">
<mapper namespace= "mybatis. testcurd">
<insert id="insertUserinfo" parameterType= "orm. Userinfo"
useGeneratedKeys= "true" keyProperty= "id">
insert into
user info (username , password, age, insertDate)
values (# {username}, # {password}, #{age}, #{insertdate})
</ insert>
<select id= "getUserinfoById" parameterType= "int" resultType= "orm. Userinfo">
select * from
userinfo where id=#{id}
</select>
<delete id= "deleteUserinfoById" parameterType="int ">
delete from .
userinfo where id=#{id}
</delete>
<select id= "getAllUserinfo" resultType= "orm. Userinfo">
select * from userinfo
</select>
<update id= "upda teUserinfoById" parameterType= "orm. Userinfo">
update userinfo
set
username=# {username }, password=# {password}, age=# {age} , insertDate=#{insertdate}
where id=#{id}
</update>
</mapper>
添加記錄并且傳回主鍵值
建立Servlet對象,插入記錄的代碼和Oracle資料庫對應的Servlet代碼一緻, 運作後在控制台輸出3條記錄的主鍵ID值,結果如下圖所示。
MyBatis 核心對象的生命周期與封裝
在前面對3種資料庫實作基本的CURD後,大家應該了解了MyBatis核心對象的使用,本節将會繼續介紹這些核心對象的生命周期。
對象的生命周期也就是對象從建立到銷毀的過程,但在此過程中,如果實作的代碼品質不佳,那麼很容易造成程式上的錯誤或效率的降低。
(1 ) SqlSessionFactoryBuilder對象可以被JVM虛拟機所執行個體化、使用或者銷毀。一旦使用SqlSessionFactoryBuilder對象建立SqISessionFactory後,SqlSessionFactoryBuilder 類就不需要存在了,也就是,不需要保持此對象的狀态,可以随意地任由JVM銷毀。是以SqlSessioFactoryBuilder對象的最佳使用範圍是方法之内,也就是說,可以在方法内部聲明SqISessionFactoryBuilder對象來建立SqlSessionFactory對象。
(2) Sq[SessionFactory對象由SqlSessionFactoryBuilder對象建立。一旦建立SqlSessionFactory類的執行個體,該執行個體應該在應用程式執行期間都存在,根本不需要每一次操作資料庫時都重新建立它,是以應用它的最佳方式就是寫一個單例模式,或使用Spring 架構來實作單例模式對SqlSessionFactory對象進行有效的管理。
(3 ) SqlSession 對象由SqlSessionFactory 類建立,需要注意的是,每個線程都應該有它自己的Sq[Session執行個體。SqlSession的執行個體不能共享,它也是線程不安全的,是以千萬不要在Servlet中聲明該對象的一個執行個體變量。因為Servlet是單例的,聲明成執行個體變量會造成線程安全問題,也絕不能将SqlSession執行個體的對象放在一個類的靜态字段甚至是執行個體字段中,還不可以将SqlSession執行個體的對象放在任何類型的管理範圍中,比如Servlet對象中的HttpSession 會話。在接收到HTTP請求時,可以打開一個SqlSession對象操作資料庫,然後傳回響應,就可以關閉它。關閉SqlSession 很重要,應該確定使用finally 塊來關閉它。
以上就是筆者為大家整理的mybatis3操作資料庫的步驟内容,碼字不易,給個關注哦~~~
喜歡文章請多多點贊評論轉發,關注筆者,你們的支援就是筆者最大的動力~~~