Mybatis源碼解析,一步一步從淺入深(一):建立準備工程

Spring SpringMVC Mybatis(簡稱ssm)是一個很流行的java web框架,而Mybatis做爲ORM 持久層框架,因其靈活簡單,深受青睞。並且如今的招聘職位中都要求應試者熟悉Mybatis框架。我認爲有必要分析一下Mybatis的源碼。在進行源碼分析前,先準備一個簡單的工程。若是你還不會使用maven請參考:Maven 建立項目之簡單示例,建立一個簡單的工程。html

開發工具:eclipsejava

jdk版本:1.8mysql

1,建立好的工程目錄以下圖所示:git

  

2,如今來添加工程的依賴包,配置以下:github

  

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.zcz</groupId>
  <artifactId>learnmybatis</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>learnmybatis</name>
  <description>learnmybatis</description>
  <dependencies>
      <!-- 添加junit -->
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
      </dependency>
      <!-- 添加log4j -->
      <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.16</version>
      </dependency>
      <!-- 添加mybatis -->
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.2.6</version>
      </dependency>
      <!-- 添加mysql驅動 -->
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.44</version>
      </dependency>
  </dependencies>
</project>

3,在src/main/resources中添加log4j配置log4j.properties,配置內容以下:web

  

# priority  :debug<info<warn<error
#you cannot specify every priority with different file for log4j 
log4j.rootLogger=debug,stdout,info,debug,warn,error 
 
#console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern= [%d{yyyy-MM-dd HH:mm:ss a}]:%p %l%m%n
#info log
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.info.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.info.File=./src/com/hp/log/info.log
log4j.appender.info.Append=true
log4j.appender.info.Threshold=INFO
log4j.appender.info.layout=org.apache.log4j.PatternLayout 
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#debug log
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.debug.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.debug.File=./src/com/hp/log/debug.log
log4j.appender.debug.Append=true
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.layout=org.apache.log4j.PatternLayout 
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#warn log
log4j.logger.warn=warn
log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.warn.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.warn.File=./src/com/hp/log/warn.log
log4j.appender.warn.Append=true
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.layout=org.apache.log4j.PatternLayout 
log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#error
log4j.logger.error=error
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.error.File = ./src/com/hp/log/error.log 
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR 
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n

 

4.接下來在src/main/resources中添加mybatis的配置文件configuration.xml。配置以下: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配置文件, 我這裏面配置的是數據庫相關 -->
  <properties resource="dbConfig.properties"></properties>
  
  <!-- 指定Mybatis使用log4j -->
  <settings>
     <setting name="logImpl" value="LOG4J"/>
  </settings>
      
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
          <!--
          若是上面沒有指定數據庫配置的properties文件,那麼此處能夠這樣直接配置
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/learnMybatis"/>
        <property name="username" value="root"/>
        <property name="password" value="123"/> -->
         
         
         <!-- 上面指定了數據庫配置文件, 配置文件裏面也是對應的這四個屬性 -->
         <property name="driver" value="${driver}"/>
         <property name="url" value="${url}"/>
         <property name="username" value="${username}"/>
         <property name="password" value="${password}"/>
         
      </dataSource>
    </environment>
  </environments>
  
  <!-- 映射文件,mybatis精髓, 後面纔會細講 -->
  <mappers>
    <mapper resource="mapper/userDao-mapping.xml"/>
  </mappers>
  
</configuration>

5.而後在src/main/resources中添加數據庫配置文件:dbConfig.properties,配置以下:數據庫

  

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/learnmybatis
username=root
password=123

6.在src/main/resources中添加mapper包,這個包中存放是的mybatis的mapper文件。apache

7.新建learnmybatis數據庫,並建立表:user。表結構如圖所示:session

  

  插入一條數據:

  

8.準備工做完成,接下來就是代碼實現了,咱們先看一下這個時候的工程目錄結構,以下圖:

  

9.在src/main/java中新增包:com.zcz.learnmybatis.entity,並在次包下新增類User:

  

package com.zcz.learnmybatis.entity;

public class User {
    private int id;
    private String name;
    private String password;
    private int age;
    private int deleteFlag;
    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 getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getDeleteFlag() {
        return deleteFlag;
    }
    public void setDeleteFlag(int deleteFlag) {
        this.deleteFlag = deleteFlag;
    }
}

10.在src/main/java中新增包:com.zcz.learnmybatis.dao,並在次包下新增類UserDao:

  

package com.zcz.learnmybatis.dao;

import java.util.List;

import com.zcz.learnmybatis.entity.User;

public interface UserDao {
    public void insert(User user);
    public User findUserById(int userId);
    public List<User> findAllUsers();
}

11,在mapper中新增userDao-mapping.xml文件:

  

<?xml version="1.0" encoding="UTF-8" ?>   
<!DOCTYPE mapper   
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"  
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> 
<mapper namespace="com.zcz.learnmybatis.dao.UserDao">

   <select id="findUserById" resultType="com.zcz.learnmybatis.entity.User" > 
      select * from user where id = #{id}
   </select>

</mapper>

12,在src/test/java中新增包:com.test.learnmybatis,並在次包下新增類:UserDaoTest:

  類中使用了@Test註解,不會使用的情查看 經常使用註解記錄

package com.test.learnmybatis;

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 com.zcz.learnmybatis.dao.UserDao;
import com.zcz.learnmybatis.entity.User;

import junit.framework.Assert;

public class UserDaoTest {
    @Test
    public void finUserById() {
        SqlSession sqlSession = getSessionFactory().openSession();
        UserDao userMapper = sqlSession.getMapper(UserDao.class);
        User user = userMapper.findUserById(1);
        Assert.assertNotNull("not find", user);
        
    }
    
    private static SqlSessionFactory getSessionFactory() {
        SqlSessionFactory sessionFactory = null;
        String resource = "configuration.xml";
        try {
            sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
        }catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return sessionFactory;
    }
}

13.到這裏全部的準備工做已經完成了,如今看一下目錄結構:

  

14.在UserDaoTest中右鍵->Run As->JUnit Test。能夠看到,運行成功了:

  

15,到這裏這個簡單的mybatis就建立成功了,接下來就開始源碼的跟蹤與分析吧,接下來就是激動人心的時刻了 -------> Mybatis源碼解析,一步一步從淺入深(二):按步驟解析源碼

 

  工程已經上傳github:https://github.com/ZCC1/learnmybatis.

  須要的夥伴能夠去clone.


 

 

最後不得不提的是:在使用5.1.12版本的mysql驅動包的時候遇到了一個問題:Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: com.mysql.jdbc.Driver。

我另外寫了一篇文章,給出了異常的詳細內容和解決辦法:Cannot find class: com.mysql.jdbc.Driver錯誤及解決辦法。

 

 


  原創不易,轉載請聲明出處:http://www.javashuo.com/article/p-eglcjxwh-cu.html 

相關文章
相關標籤/搜索