【Mybatis】- 工做流程

ORM:Object Relation Mapping:對象關係映射,通俗理解就是將一個對象相關屬性和數據庫數據進行關聯(映射),傳統咱們對數據庫數據的操做能夠經過ORM框架轉移到對對象的操做上來,這無疑有利於提升程序的開發效率和項目的可維護性,本質是對傳統的JDBC操做高級封裝java

工做流程

mybatis經過sqlSessionFactory建立sqlSession, sqlSession表示應用程序與數據庫的會話,當用戶使用mapper.xml文件中配置的的方法時,mybatis首先會解析sql動態標籤爲對應數據庫sql的形式,並將其封裝進MapperStatement對象,而後經過executor將sql注入數據庫執行,並返回結果mysql

常見ORM框架:hibernate、mybatisspring

mybatis主要經過兩個配置文件(sqlMapConfig.xml和Mapper.xml),來配置數據庫和對象的關係sql

sqlMapConfig.xml

Mybatis全局配置文件,主要配置mybatis的環境參數、映射對象運行參數。數據庫

mybatis的環境參數:數據源配置、事務控制apache

映射對象運行參數:映射對象的別名設置、映射對象配置文件加載session

案例: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:主要配置映射對象在數據庫中相關的操做app

案例:框架

<?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操做, 對數據庫數據的操做就能夠直接經過像調用普通方法同樣進行,很是方便

數據庫數據:

相關文章
相關標籤/搜索