mybatis-day01-自定義框架-基礎入門

目錄

一、今日內容

二、框架的介紹

1、什麼是框架

2、框架能解決什麼問題

3、三層架構中常用的框架

三、mybatis框架的介紹

1、jdbc中的代碼

創建數據庫:

新建maven工程,導入junit和mysql驅動包

編寫javabean和測試類

小結:原生jdbc流程:

2、jdbc代碼中的問題

四、自定義mybatis框架

1、主要設計模式

2、流程圖(注意下面一邊對照流程圖理解,一邊搭環境)

3、具體編碼

3.1新建項目

3.2  jar包和目錄結構

3.3 第一部分:配置文件和對應的存儲類

3.3 第二部分:SqlSession和實現類

3.4 第三部分:SqlSessionFactory

打成jar包以供使用:

五、使用自定義框架

六、使用mybatis框架(簡單,重點)

簡單mybatis框架使用小結(重點):

1、添加依賴(jar)

2、編寫pojo對象

3、編寫映射文件

4、編寫核心配置文件

5、測試框架


 

一、今日內容

1. 框架的介紹
2. 介紹mybatis框架
3. JDBC於Mybatis框架的比較
4. 自定義Mybatis框架(底層原理,難點)
5. mybatis框架的快速入門(簡單,但重點掌握)

 

二、框架的介紹

1、什麼是框架

半成品

2、框架能解決什麼問題

1、把技術封裝起來
2、在開發中不應該考慮技術, 專注於邏輯(業務)開發
3、框架時位於底層技術 和應用程序之間的代碼

3、三層架構中常用的框架

a、web:表現層: 處理用戶請求和響應
        servlet -- struts(放棄) -- struts2(放棄 jd數據泄露事件) -- springMVC(主流)
b、service:業務層
        自己寫業務 --- ejb(過氣) -- spring(整合框架,業務)(不可取代)
c、dao: 持久層(數據接收對象)
        jdbc--dbutils--BeanUtils -- jdbcTemplate -- hibernate(放棄)--mybatis(主流)--spring data(簡稱jpa,持久層框架,未來趨勢)
        
        主流:整合: springmvc + spring + mybatis = ssm
        趨勢:整合:springmvc + spring +spring data  = spring全家桶

 

三、mybatis框架的介紹

換個工作空間就要重新配置一下maven...麻煩...儘量不要換(當練習也好,但不要經常)

1、jdbc中的代碼

創建數據庫:

create database mybatisdb_331;
use mybatisdb_331;

create table user(
	id int primary key auto_increment,
	username varchar(50),
	password varchar(50),
	sex varchar(2),
	address varchar(50)
);

insert into user values(null,'zhangsan','zhangsan','男','蜀山');
insert into user values(null,'lisi','lisi','男','天墉城');
insert into user values(null,'wangwu','wangwu','男','瓊華派');

select * from user;

新建maven工程,導入junit和mysql驅動包

刪掉pom裏對junit域僅test的限制:刪掉 

<scope>test</scope>

否則@Test在java包下用不了

編寫javabean和測試類

User.java

package cn.ahpu.domain;

/**
 * @author 韓竹安
 * @create 2020-01-06 12:28
 */
public class User {
    private Integer id;
    private String username;
    private String password;
    private String sex;
    private String address;

      //省略get/set

    @Override
    public String toString() {
        return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}';
    }
}

TestJDBC.java

package cn.ahpu;

import cn.ahpu.domain.User;
import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 *
 * 回顧JDBC代碼
 */
public class TestJDBC {
    @Test
    public void test() throws Exception {
        //1.註冊驅動
        Class.forName("com.mysql.jdbc.Driver");
        //2.獲取連接
        String url="jdbc:mysql://localhost:3306/mybatisdb_331";
        String username="root";
        String password="root";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.sql語句
        String sql="select * from user";
        //4.創建statement對象 statement 和 PreparedStatement
        PreparedStatement pst = conn.prepareStatement(sql);
        //5.執行sql語句,返回結果集
        ResultSet rs = pst.executeQuery();
        //6.處理結果集
        while(rs.next()){
            User u = new User();
            u.setId(rs.getInt("id"));
            u.setUsername(rs.getString("username"));
            u.setPassword(rs.getString("password"));
            u.setAddress(rs.getString("address"));
            u.setSex(rs.getString("sex"));
            System.out.println("u = " + u);
        }
        //7.釋放資源
        rs.close();
        pst.close();
        conn.close();
    }
}

小結:原生jdbc流程:

原生的jdbc操作數據庫流程:
1.註冊驅動程序:Class.forName(“com.mysql.jdbc.Driver”);
2.使用驅動管理類來獲取數據連接對象:conn = DriverManager.getConnection(…);
3.獲取數據庫操作對象:Statement stmt = conn.createStatement();
4.定義操作的SQL語句
5.執行SQL:stmt.executeQuery(sql);
6.處理結果集:ResultSet,如果SQL前有參數值就設置參數值setXXX()
7.關閉對象,回收數據庫資源(關閉結果集–>關閉數據庫操作對象–>關閉連接)

2、jdbc代碼中的問題

a、頻繁創建和釋放數據庫的連接對象,造成資源的浪費. 使用數據庫連接池可以解決(c3p0 ,dbcp, spring jdbc ,durid)
b、sql語句硬編碼(寫死),如果數據庫發生改變,需要重新編譯代碼,再運行 。 可以考慮把sql語句寫到配置文件中
c、傳參數硬編碼,必須按照特定的順序傳參
d、處理結果集硬編碼,如果改變了數據庫,結果集的映射必須重新寫,需要重新編譯代碼,再運行
e、連接的配置信息硬編碼

 

四、自定義mybatis框架

(難點,但僅僅爲了瞭解底層原理,重在理解,不求會熟練地寫)

1、主要設計模式

工廠模式

什麼是工廠模式

1.工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。 2.在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,是通過使用一個共同的接口來指向新創建的對象。

栗子

您需要一輛汽車,可以直接從工廠裏面提貨,而不用去管這輛汽車是怎麼做出來的,以及這個汽車裏面的具體實現。

優缺點

優點: 1、一個調用者想創建一個對象,只要知道其名稱就可以了。 2、擴展性高,如果想增加一個產品,只要擴展一個工廠類就可以。 3、屏蔽產品的具體實現,調用者只關心產品的接口。

缺點: 每次增加一個產品時,都需要增加一個具體類和對象實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這並不是什麼好事。

構建者模式

什麼是構建者模式

構建者模式一般用在構建流程或者組成部件固定的場合,將這些部件分開構建成爲組件對象,再將這些組件對象整合成爲目標對象。

栗子

組裝臺式電腦的情況,我們可以分別購買主板、CPU、內存、硬盤等部件,然後將這些部件組裝在一起就形成了一臺完整的電腦。

構建者模式和工廠模式的區別

工廠模式一般都是創建一個產品,注重的是把這個產品創建出來就行,只要創建出來,不關心這個產品的組成部分。從 代碼上看,工廠模式就是一個方法,用這個方法就能生產出產品。 構建者模式也是創建一個產品,但是不僅要把這個產品創建出來,還要關心這個產品的組成細節,組成過程。從代碼上看,建造者模式在建造產品時,這個產品有很多方法,建造者模式會根據這些相同方法但是不同執行順序建造出不同組成細節的產品

2、流程圖(注意下面一邊對照流程圖理解,一邊搭環境)

3、具體編碼

3.1新建項目

maven配置默認即可

流程對了,也不用斷網了

3.2  jar包和目錄結構

resources目錄下新建目錄:

 

3.3 第一部分:配置文件和對應的存儲類

UserMapper.xml

<?xml version="1.0" encoding="utf-8" ?>
<mapper namespace="cn.ahpu.dao.UserDao">
    <select id="findAll" resultType="cn.ahpu.domain.User">
        select * from user
    </select>
</mapper>

SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatisdb?characterEncoding=utf8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
	<mappers>
		<mapper resource="cn/ahpu/mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>    

都不要約束(就是hibernate中的核心xml和單個javabean的xml)  注意一邊對照流程圖理解,一邊搭環境

 

java目錄下新建類:Configuration(對應核心配置文件SqlMapConfig.xml)

Configuration.java

package frame.domain;


public class Configuration {
    //基本配置信息
    private String url;
    private String username;
    private String password;
    private String driverClass;

    /**引入的一個個單個類的xml
     * 第一個泛型String: 唯一標識:mapperId
     * 第二個泛型Mapper: 存儲sql+resultType
     */
    private Map<String,Mapper> xmlMap=new HashMap<String,Mapper>();

    //省略get/set
}

新建Mapper類

Mapper.java

package frame.domain;

public class Mapper {
    private String sql;//執行的sql語句
    private String resultType;//返回的結果集類型

    //省略get/set
}

 

3.3 第二部分:SqlSession和實現類

java目錄下新建接口:frame.dao.SqlSession

SqlSession.java

package dao;

import java.util.List;

/**
 * 框架入口,提供:增刪改查方法
 *      簡單寫一個框架,因此只設計一個查詢所有的方法了
 */
public interface SqlSession {

    /**
     * 執行查詢的方法
     * mapperId 具體執行哪一條sql 唯一Id
     * List:本來應該寫泛型,爲了簡單就不寫了
     */
    public List selectList(String mapperId);

    /**
     * 釋放資源
     */
    public void close();
}

 

編寫實現類,直接在接口上alter+enter

工具類:utils.Executor

開始有點亂序了,看視頻複習最好

Executor.java(反射 難點)

package frame.utils;

import frame.domain.Configuration;

import java.lang.reflect.Method;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class Executor {

    //想要執行肯定要加載驅動 獲取連接 肯定需要配置信息 也就需要cfg
    private Configuration cfg;
    public Executor(Configuration cfg) {
        this.cfg = cfg;
    }

    private Connection conn =null;
    private PreparedStatement pst =null;
    private ResultSet rs=null;


    /**
     * 在類名,屬性列名都未知的情況下執行sql語句封裝結果集
     * driverClass,url,username,password
     * @param sql
     * @param resultType
     * @return
     */
    public List executeQuery(String sql, String resultType){
        List list=new ArrayList();

        //1.加載驅動類
        try {
            Class.forName(cfg.getDriverClass());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        try {
            //2.獲取連接
            conn = DriverManager.getConnection(cfg.getUrl(), cfg.getUsername(), cfg.getPassword());
            //3.創建statement對象
            pst = conn.prepareStatement(sql);
            //4.執行sql語句 返回結果集
            rs = pst.executeQuery();
            //5.處理結果集
            //5.1 通過結果集獲取所有列名
            List<String> columnNames=new ArrayList<>();
            //獲取結果集的元數據:修飾代碼的代碼 eg:註解
            ResultSetMetaData metaData = rs.getMetaData();
            //獲取列的個數
            int columnCount = metaData.getColumnCount();
            //根據列索引得到列名 metaData.getColumnName(colum) 注意列的索引從1開始
            for (int i = 1; i <= columnCount; i++) {//快捷 fori
                String columnName = metaData.getColumnName(i);
                columnNames.add(columnName);
            }
            //5.2 通過類全限定名創建對象
            // 獲取字節碼文件
            Class clz = Class.forName(resultType);
            while(rs.next()){//判斷是否有下一個元素 如有 就應該還有一個新的對象
                //創建一個對象
                //字節碼通過反射創建對象
                Object o = clz.newInstance();
                //給對象賦值
                //獲取某列對應的set方法,執行set方法,進行賦值
                //獲取所有方法
                Method[] methods = clz.getMethods();
                for (Method method : methods) {//快捷:n=methods.for
                    for (String columnName : columnNames) {
                        //使用每一個列名與每一個方法比較(columnNames是rs得到的  methods是類全限定名得到的 可見javabean和表的列名要一致)
                        //setusername 忽略大小寫進行比較 setUsername
                        if(("set"+columnName).equalsIgnoreCase(method.getName())){
                            //method就是columnName列對應的set方法了
                            //還需要獲取屬性對應的值
                            //通過列名獲取列值
                            Object columValue = rs.getObject(columnName);
                            //執行set方法
                            //invoke方法2個參數:要執行的對象  方法的參數
                            //o對象執行method方法 參數爲columValue
                            method.invoke(o,columValue);
                        }

                    }

                }
                //添加到返回的集合中
                list.add(o);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return list;
    }

    public void close(){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(pst!=null){
            try {
                pst.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

SqlSessionImpl.java(簡單調用)

package frame.dao.impl;

import frame.domain.Configuration;
import frame.domain.Mapper;
import frame.utils.Executor;

import java.util.List;

/**
 * SqlSession實現類
 */
public class SqlSessionImpl implements dao.SqlSession {

    //框架啓動時會提前將xml配置文件信息全都讀到Configuration類中
    private Configuration cfg;
    private Executor executor;
    public SqlSessionImpl(Configuration cfg) {//唯一構造器 不給cfg參數不讓創建對象
        this.cfg = cfg;
        executor=new Executor(cfg);//統一執行對象 方便close資源
    }

    //配置文件信息都已經在cfg中了(認爲已經dom解析過了) 此處直接用cfg取內容即可
    @Override
    public List selectList(String mapperId) {
        //根據mapperId獲取sql語句和返回值類型
        Mapper mapper = cfg.getXmlMap().get(mapperId);
        String sql = mapper.getSql();
        String resultType = mapper.getResultType();
        return executor.executeQuery(sql,resultType);
    }

    @Override
    public void close() {
        executor.close();
    }
}

3.4 第三部分:SqlSessionFactory

frame包下新建類:

SqlSessionFactory.java

package frame.factory;

import frame.dao.impl.SqlSessionImpl;
import frame.domain.Configuration;
import frame.domain.Mapper;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.util.List;

/**
 * 使用工廠模式創建SqlSession對象
 * 主要是根據配置文件加載配置文件
 */
public class SqlSessionFactory {
    //配置文件輸入流(動態給出配置文件 位置+命名都不方便 直接給出文件流本身)
    private InputStream inputStream;
    public SqlSessionFactory(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    private Configuration cfg;
    public dao.SqlSession openSession(){
        cfg=new Configuration();
        //給cfg賦值
        loadConfiguration();
        //創建sqlSession對象
        SqlSessionImpl sqlSession = new SqlSessionImpl(cfg);
        return sqlSession;
    }


    /**
     * 讀取配置文件SqlMapConfig.xml
     */
    private void loadConfiguration() {
        //dom4j 解析時,直接可以解析InputStream
        //創建解析對象
        SAXReader reader=new SAXReader();
        Document doc = null;
        try {
            //獲取文檔對象:根據字節輸入流獲取文檔對象
            doc = reader.read(inputStream);
            //獲取根結點
            Element root = doc.getRootElement();
            //獲取所有propert結點
            List<Element> list = root.selectNodes("//property");
            for (Element element : list) {
                //獲取指定屬性的屬性值
                String value = element.attributeValue("value");
                String name = element.attributeValue("name");
                //判斷是哪一個屬性
                if(name.equals("driver")){
                    cfg.setDriverClass(value);
                }else if(name.equals("url")){
                    cfg.setUrl(value);
                }else if(name.equals("username")){
                    cfg.setUsername(value);
                }else if(name.equals("password")){
                    cfg.setPassword(value);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        //讀取關聯的映射文件
        //獲取根結點對象
        Element root = doc.getRootElement();
        //得到mappers結點  就在第二層 於是一層層地讀最簡單
        //element("name"):得到第一個name的子結點
        //elements("name"):得到所有name的子結點
        //elements():得到所有子結點
        Element mappers = root.element("mappers");
        List<Element> mapperList = mappers.elements("mapper");
        for (Element element : mapperList) {
            //獲取單個類的xml路徑
            String path = element.attributeValue("resource");
            loadXmlConfig(path);
        }
    }

    /**
     * 讀取單個類的映射xml文件
     */
    private void loadXmlConfig(String path){
        //通過資源路徑 獲取資源的輸入流對象
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(path);
        //dom4j解析
        SAXReader reader=new SAXReader();
        try {
            //獲取文檔對象
            Document document = reader.read(inputStream);
            //獲取根結點
            Element root = document.getRootElement();
            //獲取根結點namespace屬性值
            String namespace = root.attributeValue("namespace");
            //獲取根結點中所有子節點(防止有多個select)
            List<Element> elements = root.elements();
            //遍歷每個結點 獲取id resultType sql語句
            for (Element element : elements) {
                String id = element.attributeValue("id");
                String resultType = element.attributeValue("resultType");
                String sql = element.getText().trim();//結點中的文本就是sql語句
                String key=namespace+"."+id;//方法全限定名爲key
                Mapper value=new Mapper();
                value.setSql(sql);
                value.setResultType(resultType);
                cfg.getXmlMap().put(key,value);

            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

SqlSessionFactoryBuider.java(簡單高層調用api)

package frame.factory;

import java.io.InputStream;

/**
 * @author 寒面銀槍
 * @create 2020-01-06 22:50
 *
 * 使用構建者模式創建SqlSessionFactory對象
 * 簡單高層調用api
 *
 */
public class SqlSessionFactoryBuider {
    /**
     * 通過配合文件的輸入流創建 SqlSessionFactory對象
     * @param path
     * @return
     */
    public SqlSessionFactory build(String path){
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(path);
        return new SqlSessionFactory(inputStream);
    }


    /**
     * 沒有參數創建sqlsessionFactory對象
     * 假設某位置(resources下)有sqlMapConfig
     * @param path
     * @return
     */
    public SqlSessionFactory build(){
        String path="SqlMapConfig.xml";//假設resources下有個配置文件SqlMapConfig.xml
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(path);
        return new SqlSessionFactory(inputStream);
    }
}

打成jar包以供使用:

雙擊install即可打成jar包 並安裝到本地倉庫,直接雙擊install即可

注意:配置文件框架模型本身用不着,只爲方便寫代碼的參考

自定義框架源碼下載:mybatis_day01_2_customer_frame

 

---------------------------------------------------------------------至此自定義框架寫好------------------------------------------------------------------------

五、使用自定義框架

pom.xml

User.java

package cn.ahpu.domain;

public class User {
    private Integer id;
    private String username;
    private String password;
    private String sex;
    private String address;

    //省略get/set

    @Override
    public String toString() {
        return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}';
    }
}

上面寫框架模板的工程中本不需要xml,可以直接刪了  測試工程才需要

UserMapper.xml

<?xml version="1.0" encoding="utf-8" ?>
<mapper namespace="cn.ahpu.dao.UserDao">
    <select id="findAll" resultType="cn.ahpu.domain.User">
        select * from user
    </select>
</mapper>

SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatisdb_331?characterEncoding=utf8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
	<mappers>
        <!--關聯單個類的映射文件 eg: UserMapper.xml-->
		<mapper resource="cn/ahpu/mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>

AppTest.java  測試類內寫測試方法

package cn.ahpu;

import static org.junit.Assert.assertTrue;

import cn.ahpu.domain.User;
import dao.SqlSession;
import frame.factory.SqlSessionFactory;
import frame.factory.SqlSessionFactoryBuider;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

/**
 * Unit test for simple App.
 */
public class AppTest 
{

    @Test
    public void shouldAnswerWithTrue()
    {
        assertTrue( true );
    }

    @Test
    public void testCustomerFrame(){
        //0.獲取配置文件輸入流對象
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");

        //創建sqlSessionFactoryBuider對象
        SqlSessionFactoryBuider sqlSessionFactoryBuider = new SqlSessionFactoryBuider();
        //創建sqlSessionFactory對象
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuider.build(inputStream);
        //獲取sqlSession對象
        SqlSession sqlSession = sessionFactory.openSession();
        //執行sql語句
        List<User> list = sqlSession.selectList("cn.ahpu.dao.UserDao.findAll");
        //遍歷結果集
        for (User user : list) {
            System.out.println(user);
        }
        //關閉資源
        sqlSession.close();
    }
}

倉庫沒有jaxen包也沒事

六、使用mybatis框架(簡單,重點)

自己寫的那麼好用,mybatis寫的肯定更好用

注:
    今日會向倉庫導入(複製粘貼)600M+的jar包
    需要在idea內更新下本地倉庫

這個測試工程和上面的測試工程一模一樣,除了配置文件要加上頭約束外

其他代碼都不用改(唯一尷尬的是之前代碼的builder寫成了buider少了個l,mybatis框架內肯定,沒寫錯 要改下^_^)

mapper:

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

config:

<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

mybatis包肯定不能用自己的了:

把自己的包刪了,他會自動引入mybatis的包

簡單mybatis框架使用小結(重點):

1、添加依賴(jar)

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.6</version>
    </dependency>
  </dependencies>

2、編寫pojo對象

package cn.ahpu.domain;

public class User {
    private Integer id;
    private String username;
    private String password;
    private String sex;
    private String address;

    //省略get/set

    @Override
    public String toString() {
        return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}';
    }
}

3、編寫映射文件

UserMapper.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">
<mapper namespace="cn.ahpu.dao.UserDao">
    <select id="findAll" resultType="cn.ahpu.domain.User">
        select * from user
    </select>
</mapper>

4、編寫核心配置文件

SqlMapConfig.xml

<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatisdb_331?characterEncoding=utf8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
	<mappers>
        <!--關聯單個類的映射文件 eg: UserMapper.xml-->
		<mapper resource="cn/ahpu/mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>

5、測試框架

AppTest.java

package cn.ahpu;

import cn.ahpu.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

import static org.junit.Assert.assertTrue;

/**
 * Unit test for simple App.
 */
public class AppTest 
{
    /**
     * Rigorous Test :-)
     */
    @Test
    public void shouldAnswerWithTrue()
    {
        assertTrue( true );
    }

    @Test
    public void testCustomerFrame(){
        //0.獲取配置文件輸入流對象
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");

        //創建sqlSessionFactoryBuider對象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //創建sqlSessionFactory對象
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        //獲取sqlSession對象
        SqlSession sqlSession = sessionFactory.openSession();
        //執行sql語句
        List<User> list = sqlSession.selectList("cn.ahpu.dao.UserDao.findAll");
        //遍歷結果集
        for (User user : list) {
            System.out.println(user);
        }
        //關閉資源
        sqlSession.close();
    }
}

 

發佈了388 篇原創文章 · 獲贊 89 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章