Mybatis入門(二)--環境搭建、簡單實現及原理

 1、下載相關依賴JAR包mysql-connector-java-5.1.20.jar(數據庫驅動)、mybatis-3.2.6.jar(Mybatis),最好把相關源碼也下載下來:html

2、 新建JAVA工程,添加依賴JAR包。
java

 

3、 建立Mybatis配置文件(myBatis-config.xml)完成和數據庫的連接設置操做、DTD是xml語法規則。mysql

複製時請將裏面的註釋所有刪掉,否則會報錯---註釋中部的包含特殊符號"--",找半天也沒找到問題,將就下吧。sql

<?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>
    <properties resource="jdbc.properties"/>
	<environments default="dev"><!--能夠定義多個環境,根據實際環境選取配置 -->
			<environment id="dev">
				<transactionManager type="JDBC"/>
				<!-- 事務管理器類型,兩種事務管理類型(type=」[JDBC|MANAGED]」) -->
				<!-- JDBC:直接簡單使用了 JDBC 的提交和回滾設置。 它依賴於從數據源獲得的鏈接來管理事務範圍 -->
				<!-- MANAGED:這個配置幾乎沒作什麼。它歷來不提交或回滾一個鏈接。而它會讓容器來管理事務的整個生命週期(好比 Spring 或 J2EE 應用服務器的上下文)  默認狀況下它會關閉鏈接-->
				
				<!-- 數據源 -->
				<dataSource type="POOLED">
				<!-- 三種內建的數據源類型 -->
				<!-- 一、UNPOOLED:每次被請求時簡單打開和關閉鏈接 -->
				<!-- UNPOOLED 類型的數據源僅僅用來配置如下 4 種屬性: -->
				<!-- driver – 這是 JDBC 驅動的 Java 類的徹底限定名-->
				<!-- url – 這是數據庫的 JDBC URL 地址。-->
				<!-- username – 登陸數據庫的用戶名。 -->
				<!-- password – 登陸數據庫的密碼。 -->
				<!-- defaultTransactionIsolationLevel – 默認的鏈接事務隔離級別。 -->
				<!-- driver.encoding=UTF8 -->
				
				<!-- 二、POOLED – 這是 JDBC 鏈接對象的數據源鏈接池的實現,用來避免建立新的鏈接實例時必要的初始鏈接和認證時間。這是一種當前 Web 應用程序用來快速響應請求很流行的方法。-->
					
			    <!--三、JNDI 這個數據源的實現是爲了使用如 Spring 或應用服務器(tomcat)這類的容器, 容器能夠集
                                                           中或在外部配置數據源,而後放置一個 JNDI 上下文的引用。這個數據源配置只須要兩個屬
                                                  性:initial_context(從 初 始 上 下 文 中 尋 找 環 境)、data_source(引用數據源實例位置的上下文的路徑)、env.encoding=UTF8 -->
					<property name="driver" value="${driver}"/>
					<property name="url" value="${url}"/>
					<property name="username" value="${username}"/>
					<property name="password" value="${password}"/>
				</dataSource>
			</environment>
	</environments>
</configuration>

           jdbc.properties數據庫

jdbc.driverclass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mysql_learn
jdbc.username=root
jdbc.password=123qwe

4、 建立實體類(User.java)apache

  

package com.qding.mybatis.learn.model;

/**
 *
 * @author zhangyonghong 
 *
 */
public class User {
	
	private Long id;
	
	private String name;
	
	private Integer sex ;
	
	private Integer isDel;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getSex() {
		return sex;
	}

	public void setSex(Integer sex) {
		this.sex = sex;
	}

	public Integer getIsDel() {
		return isDel;
	}

	public void setIsDel(Integer isDel) {
		this.isDel = isDel;
	}

}

                  

     5、 建立map文件完成實體類的映射(User.xml)tomcat

<?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="com.qding.mybatis.learn.model.User">
	<insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.qding.mybatis.learn.model.User">
        INSERT INTO `t_user` (name,sex,is_del)
        VALUES (
				#{name,jdbcType=VARCHAR},
				#{sex,jdbcType=TINYINT},
				#{isDel,jdbcType=TINYINT}
		)
    </insert>
</mapper>

  

6、編寫測試類服務器

package com.qding.mybatis.learn.test;

import java.io.IOException;
import java.io.Reader;

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 com.qding.mybatis.learn.model.User;

public class TestAdduser {

	public static void main(String[] args) {
		myBatisTest();
		
	}
	
	public static void myBatisTest(){
		try {
			//一、建立讀取配置文件myBatis-config.xml的輸入流
			String resource = "myBatis-config.xml";
			Reader reader = Resources.getResourceAsReader(resource);
			//二、建立SqlSessionFactory
			SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
			//三、建立SQLSession
			SqlSession session = factory.openSession();
			//四、調用mapper文件插入數據,須要將mapper文件加載到配置文件(myBatis-config.xml)中
			User user =new User();
			user.setName("王靖坤");
			user.setSex(1);
			user.setIsDel(0);
			session.insert("com.qding.mybatis.learn.model.User.insert", user);
			session.commit();
			session.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void JDBCTest(){
		
	}
}

7、簡單的運行原理:session

    一、讀取mybatis配置解析問文件流mybatis

String resource = "myBatis-config.xml";
			Reader reader = Resources.getResourceAsReader(resource);

    二、建立SqlSessionFactory,myBatis的默認實現類是DefaultSqlSessionFactory

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
 SqlSessionFactoryBuilder類的build方法:
 
  public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        reader.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }

    XMLConfigBuilder類部分代碼:

  屬性:
   protected final Configuration configuration;
  
  。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  
  。。。。。。。。。。。。。。。。。。。。。。。
  方法:
  public Configuration parse() {
    if (parsed) {
      throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    }
    parsed = true;
    parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
  }

    最終會myBatis配置文件解析爲Configuration類、其中Configuration類中的mappedStatements(Map)屬性將存儲每一個mapper配置信息(Map<key,MappedStatement>)key=namespace+id ===>"com.qding.mybatis.learn.model.User.insert"

    三、獲取session連接 獲取默認DefaultSqlSession實例。

    四、新增  session.insert("com.qding.mybatis.learn.model.User.insert", user); DefaultSqlSession.insert

  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 會根據你傳入的「com.qding.mybatis.learn.model.User.insert」在初始化的configuration裏查找到對應的MappedStatement並經過默認的Executor執行sql

    BoundSql是myBatis 封裝的原子性操做封裝:

public class BoundSql {

  private String sql;
  private List<ParameterMapping> parameterMappings;
  private Object parameterObject;
  private Map<String, Object> additionalParameters;
  private MetaObject metaParameters;
  
  。。。。。
}

處理返回主鍵:

PreparedStatementHandler

  public int update(Statement statement) throws SQLException {
    PreparedStatement ps = (PreparedStatement) statement;
    ps.execute();
    int rows = ps.getUpdateCount();
    Object parameterObject = boundSql.getParameterObject();
    KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();
    keyGenerator.processAfter(executor, mappedStatement, ps, parameterObject);
    return rows;
  }

processAfter這個方法會根據mapper中的配置useGeneratedKeys="true" keyProperty="id" 去取值並賦值在對象實例上。

相關文章
相關標籤/搜索