天天看點

SSM學習8:MyBatis簡介,基本CRUD

MyBatis作用

  • MyBatis 是支援定制化 SQL、存儲過程以及進階映射的優秀的持久層架構。
  • MyBatis 避免了幾乎所有的 JDBC 代碼和手動設定參數以及擷取結果集。
  • MyBatis可以使用簡單的XML用于配置和原始映射,将接口和Java的POJO類映射成資料庫中的記錄

    使開發者隻需要關注 SQL 本身,而不需要花費精力去處理例如注冊驅動、建立connection、建立statement、手動設定參數、結果集檢索等jdbc繁雜的過程代碼。

曆史

  • 原是apache的一個開源項目iBatis

    2010年6月這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。

    iBATIS一詞來源于“internet”和“abatis”的組合,是一個基于Java的持久層架構。

    為什麼要使用MyBatis?

    JDBC

    SQL夾在Java代碼塊裡,耦合度高導緻寫死内傷

    維護不易且實際開發需求中sql是有變化,頻繁修改的情況多見

    要自已建立connection、建立statement、手動設定參數、結果集檢索等

    Hibernate

    長難複雜SQL,對于Hibernate而言處理也不容易

    内部自動生産的SQL,不容易做特殊優化。

    基于全映射的全自動架構,javaBean存在大量字段時無法隻映射部分字段。導緻資料庫性能下降。

    Mybatis

    對開發人員而言,核心sql還是需要自己優化

    MyBatis是一個半自動化的持久化層架構。

    MyBatis 是支援定制化 SQL、存儲過程以及進階映射的優秀的持久層架構。

    MyBatis入門程式

    1. 下載下傳Mybatis核心包

    http://www.mybatis.org/mybatis-3/getting-started.html

    https://github.com/mybatis/mybatis-3/releases

    2.建立工程,引入MyBatis核心包及依賴包

    3.建立customer表,建立與表對象的domain

    4.建立MyBatis核心配置檔案SqlMappingConfig.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>
    		    <!-- spring整合後 environments配置将廢除 使用spring中的連接配接池 -->
    		    <environments default="development">
    		        <environment id="development">
    		            <!-- 使用jdbc事務管理 -->
    		            <transactionManager type="JDBC" />
    		            <!-- 資料庫連接配接池 -->
    		            <dataSource type="POOLED">
    		                <property name="driver" value="com.mysql.jdbc.Driver" />
    		                <property name="url"
    		                          value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
    		                <property name="username" value="root" />
    		                <property name="password" value="1234" />
    		            </dataSource>
    		        </environment>
    		    </environments>
    		</configuration>
               
    5.建立與表對象的關系映射Mapping檔案編寫sql語句
    <?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="myTest">
    		    <!--根據cust_id查詢客戶-->
    		    <select id="queryCustomerById" parameterType="Int" resultType="com.itlike.domain.Customer">
    			  SELECT * FROM `customer` WHERE cust_id  = #{cust_id}
    			</select>
    		</mapper>
               
    6.在核心配置檔案當中引入Mapping
    <!--加載映射檔案-->
    		    <mappers>
    		        <mapper resource="com/myxq/domain/Customer.xml"></mapper>
    		    </mappers>
               
    7.建立工廠,執行sql語句

MyBatis核心Api

SqlSessionFactoryBuilder:用于建立SqlSessionFacoty

SqlSessionFacoty:一旦建立完成就不需要SqlSessionFactoryBuilder了

因為SqlSession是通過SqlSessionFactory建立的

是以可以将SqlSessionFactoryBuilder當成一個工具類使用,最佳使用範圍是方法範圍即方法體内局部變量。

SqlSessionFactory:建立sqlSession的工廠,是一個接口

接口中定義了openSession的不同重載方法

SqlSessionFactory的最佳使用範圍是整個應用運作期間,一旦建立後可以重複使用,通常以單例模式管理SqlSessionFactory。

SqlSession:連接配接到資料庫的一個會話

sqlSession中定義了資料庫操作方法。

每個線程都應該有它自己的SqlSession執行個體

SqlSession的執行個體不能共享使用,它也是線程不安全的。是以最佳的範圍是請求或方法範圍

絕對不能将SqlSession執行個體的引用放在一個類的靜态字段或執行個體字段中。

MyBatis架構

SSM學習8:MyBatis簡介,基本CRUD

MyBatis-查詢

  • 封裝工具類
public class MyBatisUtils {
    public static final SqlSessionFactory sessionFactory;

    //靜态代碼塊  隻加載一次
    static {
        //1 加載配置檔案的
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

        //2 讀取配置檔案  在src目錄下
        InputStream resourceAsStream = null;
        try {
            resourceAsStream = Resources.getResourceAsStream("SqlMappingConfig.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3 擷取session工廠  session就是與資料庫的一個會話
        sessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
    }

    public static SqlSession openSession(){
        return sessionFactory.openSession();
    }
}

           

查詢所有

SSM學習8:MyBatis簡介,基本CRUD
SSM學習8:MyBatis簡介,基本CRUD

配置sql語句在控制台列印

在SqlMappingConfig.xml

SSM學習8:MyBatis簡介,基本CRUD

模糊查詢

查詢失敗示例:

SSM學習8:MyBatis簡介,基本CRUD

為什麼:對于參數#{cust_name}來說,該查詢語句執行時,會轉化為sql語句

SELECT * FROM customer WHERE cust_name LIKE '%?'%'

,也就是#{cust_name}=‘cust_name’ 多了一對單引号 是以産生文法錯誤

解決方法:

先介紹#{}與${}的差別

#{}

表示一個占位符号,通過#{}可以實作preparedStatement向占位符中設定值
自動進行java類型和jdbc類型轉換
#{}可以有效防止sql注入
#{}可以接收簡單類型值或pojo屬性值
如果parameterType傳輸單個簡單類型值,#{}括号中可以是value或其它名稱
           

${}

表示拼接sql串
通過${}可以将parameterType 傳入的内容拼接在sql中且不進行jdbc類型轉換
${}可以接收簡單類型值或pojo屬性值
如果parameterType傳輸單個簡單類型值,${}括号中隻能是value  ${value}
           
SSM學習8:MyBatis簡介,基本CRUD

注意采用${}方式無法防止sql注入,是以還是使用#{},隻不過是#{一個名稱} 而傳參數為"%李%" 就是把%李%當做一個占位符

MyBatis-插入一條資料

SSM學習8:MyBatis簡介,基本CRUD
SSM學習8:MyBatis簡介,基本CRUD

一定要手動添加事務,若無送出事務則添加不了到資料庫

擷取最後插入的id

背景:引導使用者注冊時需讓使用者填寫的資訊越少越好,注冊完之後再調至完善個人資訊的視窗,是以需要擷取最後插入的那1條記錄,在配置插入語句的前面加上以下内容,最後在送出事務語句後就可以擷取id了

SSM學習8:MyBatis簡介,基本CRUD

更新操作

SSM學習8:MyBatis簡介,基本CRUD

先找出要更新的對象,将要修改的字段設定好,傳入update方法,删除操作也類似

Customer customer = sqlSession.selectOne("queryCustomerById", 12);
 customer.setCust_name("孫悟空");
 sqlSession.update("updateCustomer", customer);
           

删除操作

SSM學習8:MyBatis簡介,基本CRUD
Customer customer = sqlSession.selectOne("queryCustomerById", 13);
sqlSession.delete("deleteCustomer", customer);