【Mybatis】- 工作流程
ORM:Object Relation Mapping:物件關係對映,通俗理解就是將一個物件相關屬性和資料庫資料進行關聯(對映),傳統我們對資料庫資料的操作可以通過ORM框架轉移到對物件的操作上來,這無疑有利於提高程式的開發效率和專案的可維護性,本質是對傳統的JDBC操作高階封裝
工作流程
mybatis通過sqlSessionFactory建立sqlSession, sqlSession表示應用程式與資料庫的會話,當用戶使用mapper.xml檔案中配置的的方法時,mybatis首先會解析sql動態標籤為對應資料庫sql的形式,並將其封裝進MapperStatement物件,然後通過executor將sql注入資料庫執行,並返回結果
常見ORM框架:hibernate、mybatis
mybatis主要通過兩個配置檔案(sqlMapConfig.xml和Mapper.xml),來配置資料庫和物件的關係
sqlMapConfig.xml
Mybatis全域性配置檔案,主要配置mybatis的環境引數、對映物件執行引數。
mybatis的環境引數:資料來源配置、事務控制
對映物件執行引數:對映物件的別名設定、對映物件配置檔案載入
案例:
<?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> <!-- 載入資料庫屬性檔案:db.properties --> <properties resource="db.properties"/> <!-- typeAliases:別名設定 package:mybatis自動掃描polo類,自動建立別名(型別名) --> <typeAliases> <typeAlias type="com.zhiwei.domain.User" alias="user"/> <package name="com.zhiwei.domain" /> </typeAliases> <!-- 和spring整合environment配置將拋棄 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc事務管理 --> <transactionManager type="JDBC"/> <!-- 資料連線池 :mybatis管理--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- 載入對映檔案 resource:每次只能載入一個檔案 class:只能mapper代理物件執行(mapper介面名和mapper.xml檔名一致,並且在同一個目錄) package:批量載入:name為mapper檔案所在的包名 --> <mappers> <mapper resource="com/zhiwei/domain/UserMapper.xml"/> </mappers> </configuration>
mapper.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"> <!-- namespace命令空間:sql訪問地址劃分 --> <mapper namespace="test"> <!-- 對映檔案配置sql語句 :select執行資料庫查詢 id:sql語句封裝mappedStatement的id #{id}:佔位符,表示接受輸入的引數:id,如果輸入引數型別為簡單型別, #{}中的引數名可以任意, resultType:返回結果型別 --> <select id="findUserById" parameterType="int" resultType="user"> select *from user where id=#{id} </select> <delete id="deleteUserById" parameterType="int"> delete from user where id=#{id} </delete> <!-- 如果輸入的引數為pojo型別,佔位符名稱使用pojo的屬性 --> <update id="updateUser" parameterType="com.zhiwei.domain.User"> update user set name=#{name},passwd=#{passwd} where id=#{id} </update> <insert id="addUser" parameterType="com.zhiwei.domain.User"> insert into user(id,name,passwd) values(#{id},#{name},#{passwd}) </insert> </mapper>
mapper.xml對應的物件:
package com.zhiwei.domain;
public class User {
private int id;
private String name;
private String passwd;
public User(){}
public User(int id, String name, String passwd) {
super();
this.id = id;
this.name = name;
this.passwd = passwd;
}
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;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", passwd=" + passwd + "]";
}
}
sqlSession工具類:
package com.zhiwei.tool;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* Mybatis工具類
* @author Yang Zhiwei
*/
public final class MybatisTool {
private static InputStream is=null;
private static SqlSession sqlSession=null;
/**
* 獲取Mybstis SqlSession會話
* @return
*/
public static SqlSession getSession(){
try {
is=Resources.getResourceAsStream("SqlMapConfig.xml");
} catch (IOException e) {
e.printStackTrace();
}
/**本質通過呼叫DefaultSqlSessionFactory建立sqlSession
*DefaultSqlSession:與資料庫進行JDBC操作的類
* MappedStatement:與JDBC操作的StateMent類類似,封裝sql資訊,
* mybatis的動態sql標籤在提交給資料庫之前會進行sql的規範化,控制檯日誌顯示
* executor:真正和資料庫進行互動的執行者
* configuration:mybatis配置檔案資訊的封裝類
*部分原始碼:
* @Override
public int update(String statement, Object parameter) {
try {
dirty = true;
MappedStatement ms = configuration.getMappedStatement(statement);
return executor.update(ms, wrapCollection(parameter));
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error updating database. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}
*
* */
//通過mybatis的控制檔案建立sqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
sqlSession=sqlSessionFactory.openSession();
return sqlSession;
}
/**
* 關閉mybatis SqlSession會話
*/
public static void resourceClosing(){
try{
if(sqlSession!=null){
sqlSession.close();
}
if(is!=null){
is.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
物件的操作方法介面(方法名必須與Mapper.xml檔案中sql的Id對應,mybatis無法正確解析):
package com.zhiwei.service;
import org.apache.ibatis.session.SqlSession;
import com.zhiwei.domain.User;
import com.zhiwei.tool.MybatisTool;
/***
* 基礎服務類
* @author Yang Zhiwei
*/
public class BasicServiceImp{
private static SqlSession sqlSession=null;
//SqlSession初始化
static{
sqlSession=MybatisTool.getSession();
}
/**
* 通過Id查詢使用者資訊
* test:表示名稱空間
* findUserById:mapper.xml檔案的動態sql id
* test.findUserById:指明訪問動態sql地址--->對應:<mapper namespace="test">
* @param id
* @return
*/
public static User findUserById(int id) {
return sqlSession.selectOne("test.findUserById", id);
}
/**
* 更新使用者資訊
* @param user
*/
public static void updateUser(User user) {
sqlSession.update("test.updateUser",user);
sqlSession.commit();
MybatisTool.resourceClosing();
}
/**
* 刪除使用者資訊
* @param id
*/
public static void deleteUserById(int id) {
sqlSession.delete("test.deleteUserById", id);
sqlSession.commit();
MybatisTool.resourceClosing();
}
/**
* 新增使用者資訊
* @param user
*/
public static void addUser(User user) {
sqlSession.insert("test.addUser",user);
sqlSession.commit();
MybatisTool.resourceClosing();
}
}
測試類:
package com.zhiwei.test;
import com.zhiwei.domain.User;
import com.zhiwei.service.BasicServiceImp;
public class BasicTest {
public static void main(String[] args) {
User user=BasicServiceImp.findUserById(1);
System.out.println(user);
}
}
結果:
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG [main] - Class not found: org.jboss.vfs.VFS
DEBUG [main] - JBoss 6 VFS API is not available in this environment.
DEBUG [main] - Class not found: org.jboss.vfs.VirtualFile
DEBUG [main] - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
DEBUG [main] - Using VFS adapter org.apache.ibatis.io.DefaultVFS
DEBUG [main] - Find JAR URL: file:/D:/BaiduYunDownload/mybatis/bin/com/zhiwei/domain
DEBUG [main] - Not a JAR: file:/D:/BaiduYunDownload/mybatis/bin/com/zhiwei/domain
DEBUG [main] - Reader entry: User.class
DEBUG [main] - Reader entry: UserMapper.xml
DEBUG [main] - Listing file:/D:/BaiduYunDownload/mybatis/bin/com/zhiwei/domain
DEBUG [main] - Find JAR URL: file:/D:/BaiduYunDownload/mybatis/bin/com/zhiwei/domain/User.class
DEBUG [main] - Not a JAR: file:/D:/BaiduYunDownload/mybatis/bin/com/zhiwei/domain/User.class
DEBUG [main] - Find JAR URL: file:/D:/BaiduYunDownload/mybatis/bin/com/zhiwei/domain/UserMapper.xml
DEBUG [main] - Not a JAR: file:/D:/BaiduYunDownload/mybatis/bin/com/zhiwei/domain/UserMapper.xml
DEBUG [main] - Reader entry: <?xml version="1.0" encoding="utf-8"?>
DEBUG [main] - Checking to see if class com.zhiwei.domain.User matches criteria [is assignable to Object]
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Openning JDBC Connection
DEBUG [main] - Created connection 1211076369.
DEBUG [main] - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@482f8f11]
DEBUG [main] - ==> Preparing: select *from user where id=?
DEBUG [main] - ==> Parameters: 1(Integer)
User [id=1, name=zhangsan, passwd=zhangsan]
日誌分析:從Log4J的控制檯日誌可以清楚看到,mybatis的本質就是JDBC操作, 對資料庫資料的操作就可以直接通過像呼叫普通方法一樣進行,非常方便
資料庫資料:
相關推薦
【Mybatis】- 工作流程
浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>
【mybatis】mybatis產生過程和執行流程
產生必然性 傳統的JDBC的實現方式,存在太多的硬編碼方式,包括對資料庫的管理,sql語句的編寫,引數和返回值等,這種現象很難應對多變化的需求開發。 這個時候,mybatis產生了。mybatis主要
Mybatis框架中Mapper文件傳值參數獲取。【Mybatis】
ram keyword ddr gem cli view ati copyto one Mybatis框架中,Mapper文件參數獲取一般有以下幾種: 1、參數個數為1個(string或者int) dao層方法為以下兩種: [java] view plain
【Mybatis】連接斷開問題
blog val property www nbsp nsh 數據 query uid 參考:http://www.jianshu.com/p/5124eef40bf0 http://blog.csdn.net/qianbw123/article/details/41959
【轉載】DHCP流程
概念 文件 src -s 獲取ip ase 找到 報文 分配 來源: http://network.51cto.com/art/201406/441752.htm DHCP是一個局域網的網絡協議,使用UDP協議工作,主要有兩個用途:給內部網絡或網絡服務供應商自動分配IP地址
【MyBatis】-----【MyBatis】--CURD---表級聯系【一對一】
去除 style print alt 得到 tag ack clas return 一、核心配置文件 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration PU
【MyBatis】-----【MyBatis】---表級聯系【一對多】
new pda 聯合 測試 asr exc ack 負責 trace 一、核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//myba
【mybatis】IF判斷的坑
log 語法 == pan sta 標簽 使用 myba mybatis <if test="type==‘y‘"> and status = 0 </if> 即使type=y 裏面的sql也不會執行,只需改為 <if
【mybatis】mybatis中的<if test=“”>test中多條件
ID span lun tco sel myba cloud ise uid mybatis中的<if test=“”>test中多條件 代碼展示: 其中 accountCode和apiName都是ApiAllRespBean的屬性 <select
【mybatis】mybaits generator 逆向工程的使用
alibaba gin resolve PE div sed pen sss bsp mybatis逆向工程官方網站:http://www.mybatis.org/generator/quickstart.html
【mybatis】mybatis中insert 主鍵自增和不自增的插入情況【mysql】
pro SQ class TE IV rop generate mys bat 主鍵不自增:返回值是插入的條數 <insert id="add" parameterType="EStudent"> insert into TStudent(name,
【MyBatis】緩存配置
big dtd 應用 使用註解 sql mapper utf actor note 前言 使用緩存可以使應用更快的獲取數據,避免頻繁的數據庫交互,尤其是在查詢越多、緩存命中率越高的情況下,使用緩存的作用就越明顯。MyBatis作為持久化框架,提供了非常強大的查詢緩存特性
【mybatis】mybatis中 <if test=>等於的條件怎麽寫
collect dex cti lis myba ring class elf flag 經常在mybatis中使用<if test="aa != ‘值‘ ">的話 怎麽怎麽樣 那麽等於怎麽寫呢? 註意 要想使用 == 僅僅需要將雙引號和單引號的位置換
【java】【mybatis】在使用mybatis進行批量插入,批量更新等批量操作時,切割In集合List進行分批批量操作的java中的切割代碼
lse span ati 批量更新 次數 sublist 調用 size == 紅字部分代表mybatis的批量操作調用方法: int num = 0; int maxLength = 200; in
【轉載】工作中遇到的js問題以及問題的解決方案
height 方案 線程 rap NPU click 創建 chan 包括 Js執行機制,主線程,和隊列任務: // 無論js中有多少代碼,最終都是要通過js引擎去執行 // 異步代碼都是瀏覽器引擎去控制的,(定時器計時,和ajax請求,都是由瀏覽器引擎控制的)也就
【筆記】ActivityManagerService 流程
1.AMSsystemReady() 都是SystemServer 啟動此service後,完成啟動,SystemServer主動呼叫的。 2. 1.HOME 點選icon 2.application 中呼叫startActivity &nbs
Mybatis的工作流程
MyBatis工作流程 1:載入配置檔案(mybatis-config.xml 、 *...Mapper.xml)並初始化, 將SQL的配置資訊載入成為一個個MappedStatement物件(包括了傳 入引數對映配置、執行的SQL語句、結果對映配置),儲存在記憶體中。 2:接收呼叫請求(呼叫Mybatis
【mybatis】mybatis訪問報錯:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
配置 esp 文件中 map XML 需要 r.java文件 指定 space mybatis訪問報錯:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 需要檢
【mybatis 】mybatis foreach操作動態表
1.傳入的資料key為表的欄位,value為值。Map<String, String>。 int saveDatalist(@Param("params")Map<String, String> params); <!-- 儲存新增資料 --> &l
【mybatis】mybatis oracle批量插入資料
參考:mybatis 對 oracle 的批量操作:https://blog.csdn.net/dzhuqiaolun/article/details/54864521 寫法一: <insert id="insertAttractionsBatch" parameterType="ja