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" 去取值並賦值在對象實例上。