程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> mybatis道理概述入門教程

mybatis道理概述入門教程

編輯:關於JAVA

mybatis道理概述入門教程。本站提示廣大學習愛好者:(mybatis道理概述入門教程)文章只能為提供參考,不一定能成為您想要的結果。以下是mybatis道理概述入門教程正文


本文我將要引見一下mybatis的框架道理,和mybatis的入門法式,完成用戶的增刪改查,她有甚麼優缺陷和mybatis和hibernate之間存在著怎樣樣的關系,願望對小同伴們有贊助,缺乏的地方,還請多多指教。

甚麼是mybatis?

MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷徙到了谷歌 code,而且更名為MyBatis 。2013年11月遷徙到Github。

MyBatis 是支撐定制化 SQL、存儲進程和高等映照的優良的耐久層框架。MyBatis 防止了簡直一切的 JDBC 代碼和手工設置參數和抽取成果集。MyBatis 應用簡略的 XML 或注解來設置裝備擺設和映照根本體,將接口和 Java 的 POJO(Plain Old Java Objects,通俗的 Java對象)映照成數據庫中的記載。簡略來講,mybatis就是一個耐久層的框架,mybatis讓法式將重要精神放在sql上,經由過程mybatis供給的映照方法,自在靈巧生成知足須要的sql語句,mybatis可以將向preparedStatement中的輸出參數主動停止輸出映照,將查詢成果集靈巧映照成java對象。

接著,我們經由過程一張圖,來懂得一下mybatis的框架道理:

框架架構講授:

a、加載設置裝備擺設文件:設置裝備擺設起源於兩個處所,一個是設置裝備擺設文件,一個是java代碼的注解,將sql的設置裝備擺設信息加載成為一個個MappedStatement對象(包含了傳入參數映照設置裝備擺設、履行的SQL語句、成果映照設置裝備擺設),存儲在內存中。

b、SQL解析:當api接口層吸收到挪用要求時,會吸收到傳入slq的id和傳入對象(可所以map或許根本數據類型),mybatis會依據sql的id找到對應的MappedStatement,然後依據傳入參數對象對MappedStatement停止解析,解析後可以獲得終究要履行的sql語句和參數。

c、 SQL履行:將終究獲得的SQL和參數拿到數據庫停止履行,獲得操作數據庫的成果。

d、成果映照:將操作數據庫的成果依照映照的設置裝備擺設停止轉換,可以轉換成HashMap、JavaBean或許根本數據類型,並將終究成果前往。

mybatis入門法式解析

接著,小編聯合demo來詳細引見一下,需求以下:

依據用戶id查詢用戶信息;

依據用戶稱號隱約查詢用戶信息;

添加、刪除、更新用戶。

第一步、樹立各類包和類,工程目次以下所示:

第二步、編寫SqlMapConfig.xml中的內容,設置裝備擺設mybatis的運轉情況,數據源,事務等。代碼以下所示:

<span ><?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設置裝備擺設將破除 --> 
<environments default="developent"> 
<!-- 應用jdbc事務治理,事務掌握由mybatis --> 
<transactionManager type="JDBC"/> 
<!-- 數據庫銜接池,由mybatis治理 --> 
<dataSource type="POLLED"> 
<property name="driver" value="${jdbc.driver}"/> 
<property name="url" value="${jdbc.url}"/> 
<property name="username" value="${jdbc.username}"/> 
<property name="password" value="${jdbc.password}"/> 
</dataSource> 
</environments> 
<!-- 加載 映照文件 --> 
<mappers> 
<mapper resource="sqlmap/User.xml"/> 
</mappers> 
</configuration> 
</span>

第三步、編寫User.java中的內容,以下所示:

<span >package cn.itcast.mybatis.po; 
import java.util.Date; 
/** 
* 
* <p>Title: User</p> 
* <p>Description:用戶po </p> 
* @author 丁國華 
* @date 2016年7月31日 15:39:04 
* @version 1.0 
*/ 
public class User { 
//屬性名和數據庫表的字段對應 
private int id; 
private String username;// 用戶姓名 
private String sex;// 性別 
private Date birthday;// 誕辰 
private String address;// 地址 
public int getId() { 
return id; 
} 
public void setId(int id) { 
this.id = id; 
} 
public String getUsername() { 
return username; 
} 
public void setUsername(String username) { 
this.username = username; 
} 
public String getSex() { 
return sex; 
} 
public void setSex(String sex) { 
this.sex = sex; 
} 
public Date getBirthday() { 
return birthday; 
} 
public void setBirthday(Date birthday) { 
this.birthday = birthday; 
} 
public String getAddress() { 
return address; 
} 
public void setAddress(String address) { 
this.address = address; 
} 
@Override 
public String toString() { 
return "User [id=" + id + ", username=" + username + ", sex=" + sex 
+ ", birthday=" + birthday + ", address=" + address + "]"; 
} 
} 
</span>

第四步、完成增刪改查的功效,起首編寫User.xml中的內容,以下所示:

<span ><?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定名空間,感化就是對sql停止分類化治理,懂得sql隔離 
留意:應用mapper署理辦法開辟,namespace有特別主要的感化--> 
<mapper namespace="test"> 
<!-- 在 映照文件中設置裝備擺設許多sql語句 --> 
<!-- 需求:經由過程id查詢用戶表的記載 --> 
<!-- 經由過程 select履行數據庫查詢 
id:標識 映照文件中的 sql 
將sql語句封裝到mappedStatement對象中,所以將id稱為statement的id 
parameterType:指定輸出 參數的類型,這裡指定int型 
#{}表現一個占位符號 
#{id}:個中的id表現吸收輸出 的參數,參數稱號就是id,假如輸出 參數是簡略類型,#{}中的參數名可以隨意率性,可以value或其它稱號 
resultType:指定sql輸入成果 的所映照的java對象類型,select指定resultType表現將單筆記錄映照成的java對象。 
--> 
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User"> 
SELECT * FROM USER WHERE id=#{value} 
</select> 
<!-- 依據用戶稱號隱約查詢用戶信息,能夠前往多條 
resultType:指定就是單挑記載所映照的java對象類型 
${}:表現拼接sql串,將吸收到參數的內容不加任何潤飾拼接到sql中。 
應用${}拼接sql,惹起sql注入 
${value}:吸收輸出參數的內容,假如傳入類型是簡略類型,${}中只能應用value --> 
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User"> 
SELECT * FROM USER WHERE username LIKE '%${value}%' 
</select> 
<!-- 添加用戶 
parameterType:指定輸出參數類型是pojo(包含用戶信息) 
#{}中指定pojo的屬性名,吸收到pojo對象的屬性值,mybatis經由過程OGNL獲得對象的屬性值 --> 
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> 
<!-- 將拔出數據的主鍵前往,前往到user對象中 
SELECT LAST_INSERT_ID():獲得方才insert出來記載的主鍵值,只實用於自增主鍵 
keyProperty:將查詢獲得主鍵值設置到parameterType指定的對象的誰人屬性 
order:SELECT LAST_INSERT_ID()履行次序,絕對於insert語句來講她的履行次序 
resultType:指定SELECT LAST_INSERT_ID()的成果類型 
--> 
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> 
SELECT LAST_INSER_ID() 
</selectKey> 
insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}) 
<!-- 應用mysql的uuid()函數生成主鍵 
履行進程,起首經由過程uuid獲得主鍵,將主鍵設置到user對象的id屬性中 
其次,在insert履行的時刻,從user對象中,掏出id屬性值 --> 
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> 
SELECT uuid() 
</selectKey> 
insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}); 
</insert> 
<!-- 刪除用戶 
依據id刪除用戶,須要輸出id值 --> 
<delete id="deleteUser" parameterType="java.lang.Integer"> 
delete from user where id=#{id} 
</delete> 
<!-- 依據id更新用戶 
剖析: 
須要傳入用戶的id 
須要傳入用戶的更新信息 
parameterType指定user對象,包含 id和更新信息,留意:id必需存在 
#{id}:從輸出 user對象中獲得id屬性值 
--> 
<update id="updateUser" parameterType="cn.itcast.mybatis.po.User"> 
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} 
where id=#{id} 
</update> 
</mapper></span>

第五步、編寫詳細的辦法,以下所示:

<span >package cn.itcast.mybatis.first; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Date; 
import java.util.List; 
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 cn.itcast.mybatis.po.User; 
public class MybatisFirst { 
// 依據id查詢用戶信息,獲得一筆記錄成果 
@Test 
public void findUserByIdTest() throws IOException { 
// mybatis設置裝備擺設文件 
String resource = "SqlMapConfig.xml"; 
// 獲得設置裝備擺設文件流 
InputStream inputStream = Resources.getResourceAsStream(resource); 
// 創立會話工場,傳入mybatis的設置裝備擺設文件信息 
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() 
.build(inputStream); 
// 經由過程工場獲得SqlSession 
SqlSession sqlSession = sqlSessionFactory.openSession(); 
// 經由過程SqlSession操作數據庫 
// 第一個參數:映照文件中statement的id,等於=namespace+"."+statement的id 
// 第二個參數:指定和映照文件中所婚配的parameterType類型的參數 
// sqlSession.selectOne成果 是與映照文件中所婚配的resultType類型的對象 
// selectOne查詢出一筆記錄 
User user = sqlSession.selectOne("test.findUserById", 1); 
System.out.println(user); 
// 釋放資本 
sqlSession.close(); 
} 
//依據用戶稱號隱約查詢用戶列表 
@Test 
public void findUserByNameTest() throws IOException{ 
//mybatis設置裝備擺設文件 
String resource ="SqlMapConfig.xml"; 
//獲得設置裝備擺設文件 
InputStream inputStream = Resources.getResourceAsStream(resource); 
//創立會話工場,傳入mybatis的設置裝備擺設文件信息 
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
//經由過程工場獲得SqlSession 
SqlSession sqlSession = sqlSessionFactory.openSession(); 
//List中的user和映照文件中德resultType所指定的類型分歧 
List<User> list = sqlSession.selectList("test.findUserByName","小明"); 
System.out.println(list); 
sqlSession.close(); 
} 
public void insertUserTest() throws IOException{ 
//mybatis設置裝備擺設文件 
String resource ="SqlMapConfig"; 
//獲得設置裝備擺設文件流 
InputStream inputStream = Resources.getResourceAsStream(resource); 
//創立會話工場,傳入mybatis的設置裝備擺設文件信息 
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
//經由過程工場獲得sqlsession 
SqlSession sqlSession = sqlSessionFactory.openSession(); 
//拔出用戶對象 
User user = new User(); 
user.setUsername("丁國華"); 
user.setBirthday(new Date()); 
user.setSex("1"); 
user.setAddress("安徽合肥"); 
//list中的user和映照文件中的resultType所指定的類型一向 
sqlSession.insert("test.insertUser",user); 
//提交事物 
sqlSession.commit(); 
//封閉會話 
sqlSession.close(); 
} 
//依據id刪除用戶信息 
@Test 
public void deleteUserTest() throws IOException{ 
//mybatis設置裝備擺設文件 
String resource = "SqlMapConfig.xml"; 
//獲得設置裝備擺設文件流 
InputStream inputStream = Resources.getResourceAsStream(resource); 
//創立工場,傳入mybatis的設置裝備擺設文件信息 
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
//經由過程工場獲得SqlSession 
SqlSession sqlSession = sqlSessionFactory.openSession(); 
//傳入id刪除用戶 
sqlSession.delete("test.deleteUser",39); 
//提交事物 
sqlSession.commit(); 
//封閉會話 
sqlSession.close(); 
} 
// 更新用戶信息 
@Test 
public void updateUserTest() throws IOException { 
// mybatis設置裝備擺設文件 
String resource = "SqlMapConfig.xml"; 
// 獲得設置裝備擺設文件流 
InputStream inputStream = Resources.getResourceAsStream(resource); 
// 創立會話工場,傳入mybatis的設置裝備擺設文件信息 
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() 
.build(inputStream); 
// 經由過程工場獲得SqlSession 
SqlSession sqlSession = sqlSessionFactory.openSession(); 
// 更新用戶信息 
User user = new User(); 
//必需設置id 
user.setId(41); 
user.setUsername("丁國華"); 
user.setBirthday(new Date()); 
user.setSex("2"); 
user.setAddress("安徽合肥"); 
sqlSession.update("test.updateUser", user); 
// 提交事務 
sqlSession.commit(); 
// 封閉會話 
sqlSession.close(); 
} 
} 
</span>

mybatis的優缺陷

長處:

a、易於上手和控制。

b、sql寫在xml裡,便於同一治理和優化。

c、 消除sql與法式代碼的耦合。

d、供給映照標簽,支撐對象與數據庫的orm字段關系映照

e、供給對象關系映照標簽,支撐對象關系組建保護

f、供給xml標簽,支撐編寫靜態sql。

缺陷:

a、 sql任務量很年夜,特別是字段多、聯系關系表多時,更是如斯。

b、sql依附於數據庫,招致數據庫移植性差。

c、 因為xml裡標簽id必需獨一,招致DAO中辦法不支撐辦法重載。

d、DAO層過於簡略,對象組裝的任務量較年夜。

e、 緩存應用欠妥,輕易發生髒數據。

mybatis和hibernate的比較

雷同點:Hibernate和mybatis都可所以經由過程SessionFactoryBuilder由xml設置裝備擺設文件生成SessionFactory,然後由SessionFactroy生成Session,最初由Session來開啟履行事物和SQL語句,個中SessionFactoryBuider、SessionFactory、Session的性命周期都是差不多的。

分歧點:

mybatis:玲珑、便利、高效、簡略、直接、半主動;

hibernate:壯大、便利、高效、龐雜、繞彎子、全主動;

mybatis:

a、入門簡略,即學即用,供給了數據庫查詢的主動對象綁定功效,並且延續了許多的SQL應用經歷,關於沒有那末高的對象模子請求的項目來講,可謂perfect。

b、 可以停止更加過細的SQL優化,可以削減查詢字段。

c、 缺陷就是框架照樣比擬粗陋,功效另有缺掉,固然簡化了數據綁定代碼,然則全部底層數據庫查詢現實照樣要本身寫的,任務量也比擬年夜,並且不太輕易順應疾速數據庫修正。

d、 二級緩存機制欠安。

hibernate:

a、功效壯大,數據庫有關性好,O/R映照才能強,假如你對Hibernate相當精曉,並且對Hibernate停止了恰當的封裝,那末你的項目全部耐久層代碼會相當簡略,須要寫的代碼很,開辟速度很快,異常爽。

b、有更好的二級緩存機制,可使用第三方緩存。

c、缺陷就是進修門坎不低,要精曉門坎更高,並且怎樣設計O/R映照,在機能和對象模子之間若何衡量獲得均衡,和如何用好Hibernate方面須要你的經歷和才能都很強才行。

舉個抽象的比方:

mybatis:機械對象,應用便利,拿來就用,但任務照樣要本身來作,不外對象是活的,怎樣使由我決議。

hibernate:智能機械人,但研發它(進修、闇練度)的本錢很高,任務都可以解脫他了,但僅限於它能做的事。

小編寄語:該博文,小編重要簡略的引見了mybatis的根本常識,包含一個簡略的增刪改查的demo,mybatis的優缺陷,和hibernate和mybatis的比較,她們之間的雷同點和分歧,mybatis簡略來講,就是一個耐久層的框架,mybatis讓法式將重要精神放在sql上,經由過程mybatis供給的映照方法,自在靈巧生成知足須要的sql語句,mybatis可以將向preparedStatement中的輸出參數主動停止輸出映照,將查詢成果集靈巧映照成java對象。

以上所述是小編給年夜家引見的mybatis道理概述入門教程,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved