主頁 > 軟體設計 > MyBatis實作增刪改查&優化

MyBatis實作增刪改查&優化

2021-10-13 08:47:34 軟體設計

MyBatis增刪改查&優化

一、概述

0、框架介紹

框架是一款半成品軟體,我們可以基于這個半成品軟體繼續開發,來完成我們個性化的需求!

前提:ORM介紹

  • ORM(Object Relational Mapping): 物件關系映射

  • 指的是持久化資料和物體物件的映射模式,為了解決面向物件與關系型資料庫存在的互不匹配的現象的技術,

  • 如圖:

  • 具體映射關系如下圖:

1.現在JDBC代碼的問題

  1.存在大量的冗余代碼,不同表的DAO操作,操作步驟只是Sql陳述句不同
  2.給?占位符設定麻煩,需要手動完成
  3.針對查詢結果的處理比較麻煩,需要手動將結果集中的資料封裝到物體物件中【手工進行ORM映射】
  4.sql 陳述句在代碼中硬編碼,如果要修改 sql 陳述句,就需要修改 java 代碼,造成代碼不易維護,
  5.沒有資料查詢時的優化策略,查詢優化【mybatis開了一個記憶體空間-->快取區,減少資料庫的鏈接次數,提高程式效率】
  DB 磁盤 硬碟 慢
  記憶體:快
  6.頻繁創建和銷毀資料庫的連接會造成系統資源浪費從而影響系統性能
  • 原始 JDBC 的操作問題解決方案
1.使用資料庫連接池初始化連接資源, 
2. 將 sql 陳述句抽取到組態檔中, 
3. 使用反射、內省等底層技術,將物體與表進行屬性與欄位的自動映射    

2.概念

  • mybatis內部封裝了jdbc,使開發者只需要關注sql陳述句本身,而不需要花費精力去處理加載驅動、創建連接、創建statement等繁雜的程序,

  • mybatis通過xml或注解的方式將要執行的各種 statement配置起來,并通過java物件和statement中sql的動態引數進行映射生成最終執行的sql陳述句,

  • 最后mybatis框架執行sql并將結果映射為java物件并回傳,采用ORM思想解決了物體和資料庫映射的問題,對jdbc 進行了封裝,屏蔽了jdbc api 底層訪問細節,使我們不用與jdbc api 打交道,就可以完成對資料庫的持久化操作,

MyBatis框架是一個基于java的 持久層框架,主要用于 對資料庫進行增刪改查 等操作,
 是對現有JDBC-DAO層代碼的合理封裝,可以自動完成物件關系映射 (ORM),極大的簡化開發,提高開發效率,

MyBatis官網地址:http://www.mybatis.org/mybatis-3/

3.與JDBC的對比

JDBC

1.加載驅動 Class.forName()
2.獲取鏈接 conn=DriverManager.getConnection()
3.準備sql陳述句 String sql=""
4.裝載Sql陳述句執行
  pstm=conn.prepareStatement()
  patm.executeUpdate();
5.處理結果(單個 if()while(sc.next(){
 //封裝物體類
  手工封裝物體
}
6.關閉資源
  • 原始的查詢資料

在這里插入圖片描述

  • 原始的插入資料

在這里插入圖片描述

MyBatis

Jdbc實作時的問題
1、代碼冗余   
2、手工處理ORM映射
3、資料查詢沒有優化機制

Mybatis實作Dao介面
1.mybatis不寫代碼替換 組態檔(mapper.xml組態檔)
2.自動封裝結果集
3、Mybatis支持查詢資料快取
<mapper namespace="Dao介面的全限定名 com.tjcu.dao.UserDao">
//插入
<insert id="方法名">
 inset into t_user values(....)【不能加;】
</insert>
//洗掉
<delete id="方法名">
delete from t_user where......
</delete>
//更新
<update id="方法名">
update t_user set...
</update>
//查詢
<select id="selectById">
select * from t_user;
</select>
</mapper>

4、MyBatis整體架構

MyBatis的整體架構分為三層

1:基礎支持層,2:核心處理層,3:介面層

https://www.liangzl.com/get-article-detail-21203.html

二、環境搭建

①添加MyBatis的jar包

資料庫驅動jar包 mysql  mysql-connector-java-8.0.16.jar

Mybatis前身 叫 Ibatis apache組織負責管理
后續交由Google Code 維護管理 ibatis3.0改名為Mybatis 3.0
GitHub 開源社區網站【微軟收購】

②引入框架相關組態檔

1.log4j.properties  日志組態檔 查詢框架的運行流程
  名字固定 位置固定:src下
2.mybatis-config.xml Mybatis框架核心組態檔
   名字:隨意 位置:隨意  需要手工加載 建議路徑不要太深,直接放在src下
3.mapper.xml檔案  相當于Dao介面的實作類
   名字:隨意  位置:隨意 需要手工加載 建議路徑不要太深,直接放在src下
  • log4j.properties 日志組態檔作用

③初始化配置 讓框架生效 資料庫的鏈接配置

1、transactionManager 事務控制

DDL:資料定義語言  表的增刪改查
DML:資料操作語言  insert update delete
DQL:date query Language資料查詢語言
TCL:transaction 事務控制語言 commit rollback
 
  • 事務具有ACID特性
原子性(Atomicity):整個事務中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環節,
一致性(Consistency):事務必須始終保持系統處于一致的狀態,不管在任何給定的時間并發事務有多少,
隔離性(Isolation):隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作,
持久性(Durability):在事務完成以后,該事務對資料庫所作的更改便持久的保存在資料庫之中,并不會被回滾,

  • 事務控制技巧
如果配置的是JDBC,則會使用Connection 物件的commit()rollback()close()管理事務,

如果配置成MANAGED,會把事務交給容器來管理,比如JBOSS,Weblogic,因為我們跑的是本地程式,如果配置成MANAGE 不會有任何事務,

如果是Spring + MyBatis , 則沒有必要配置, 因為我們會直接在applicationContext.xml 里面配置資料源,覆寫MyBatis 的配置,

2、datasuorce連接池

  • 用戶每次請求都需要向資料庫獲得鏈接,而資料庫創建連接通常需要消耗相對較大的資源,創建時間也較長,假設網站一天10萬訪問量,資料庫服務器就需要創建10萬次連接,極大的浪費資料庫的資源,并且極易造成資料庫服務器記憶體溢位、拓機,如下圖所示:

資料庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程式中體現的尤為突出.對資料庫連接的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式的性能指標.資料庫連接池正式針對這個問題提出來的.資料庫連接池負責分配,管理和釋放資料庫連接,它允許應用程式重復使用一個現有的資料庫連接,而不是重新建立一個,如下圖所示:

https://blog.csdn.net/qq_36528311/article/details/87264571

框架連接池:訪問操作資料庫的框架具備的連接池
容器連接池:服務器上配置的連接池 歸服務器連接池 tomcat配置連接池
三方連接池:專業的一些連接池產品,用于做連接的管理【專業】 DBCP,c3po,druid(阿里旗下)
**mybatis-config.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>
    <!--  環境設定 mysql oracle db2 sqlserver2008  default:框架當前默認使用那個環境設定 書寫的是環境的id屬性值-->
    <environments default="mysql">
        <!--    單個資料庫鏈接配置 id:隨意 唯一-->
        <environment id="mysql">
            <!--transactionManager 事務控制 jdbc:原生JDBC事務控制方式 JPA:分布式事務控制-->
            <transactionManager type="JDBC"></transactionManager>
            <!--資料庫連接池設定 type:指定使用連接池的型別  POOLED:OOMybatis框架默認連接池
              框架連接池:訪問操作資料庫的框架具備的連接池 POOLED
              容器連接池:服務器上配置的連接池 歸服務器連接池 tomcat配置連接池
              三方連接池:專業的一些連接池產品,用于做連接的管理【專業】  DBCP,c3po,druid(阿里旗下)
            -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/db1?useUnicode=true&amp;characterEncoding=UTF-8&amp; useSSL=false &amp;serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
</configuration>


④Mybatis核心API

1.Resource 加載Mybatis核心組態檔
org.apache.ibatis.io.Resources:加載資源的工具類,

2.構建器SqlSessionFactoryBuilder
org.apache.ibatis.session.SqlSessionFactoryBuilder:獲取 SqlSessionFactory 工廠物件的功能類通過加載mybatis的核心檔案的輸入流的形式構建一個SqlSessionFactory物件

*功能:通過加載mybatis的核心檔案的輸入流的形式構建一個SqlSessionFactory物件
      String resource = "mybatis-config.xml"; 
      InputStream inputStream = Resources.getResourceAsStream(resource); 
      SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); 
      SqlSessionFactory factory = builder.build(inputStream);
其中, Resources 工具類,這個類在 org.apache.ibatis.io 包中,
      Resources 類幫助你從類路徑下、檔案系統或一個 web URL 中加載資源檔案,

3.sqlSessionFactory sqlSession的工廠物件
 org.apache.ibatis.session.SqlSessionFactory:獲取 SqlSession 構建者物件的工廠介面,
  工廠:重量級的資源,占用記憶體較多 功能強大 執行緒安全
       用于創建sqlsession物件
  
4.sqlSession 會話物件
org.apache.ibatis.session.SqlSession:構建者物件介面,用于執行 SQL、管理事務、介面代理,

  (1)將dao介面對應的mapper檔案翻譯為代碼
  (2)代替JDBC Connection連接物件充當鏈接物件 內部封裝的就是Connection物件
       sqlSession底層封裝的就是Connection3)控制事務
  JDBC:JDBC自動控制事務
      Connection.setAutoCommit(false);
      Connection.commit() 提交事務
      Connection.rollback();回滾事務
  據庫的增刪改操作
     Mybatis手工控制事務,不自動控制事務,沒有自動控制事務,程式不出現在資料庫中
  查詢操作Mybatis中不能控制事務
 SqlSession 實體在 MyBatis 中是非常強大的一個類,在這里你會看到所有執行陳述句、提交或回滾事務和獲取映射器實體的方法,
  • Resource核心api

  • sqlSessionFactory核心api

  • sqlSession核心api

三、第一個程式(查一個)

前提:Mybatis.config.xml

核心組態檔包含了 MyBatis 最核心的設定和屬性資訊,如資料庫的連接、事務、連接池資訊等,

<?xml version="1.0" encoding="UTF-8"?>
<!--MyBatis的DTD約束-->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
    <!--  環境設定 mysql oracle db2 sqlserver2008  default:框架當前默認使用那個環境設定 書寫的是環境的id屬性值-->
    <environments default="mysql">
        <!--    單個資料庫鏈接配置 id:隨意 唯一-->
        <environment id="mysql">
            <!--transactionManager 事務控制 jdbc:原生JDBC事務控制方式 JPA:分布式事務控制-->
            <transactionManager type="JDBC"></transactionManager>
            <!--資料庫連接池設定 type:指定使用連接池的型別  POOLED:OOMybatis框架默認連接池
              框架連接池:訪問操作資料庫的框架具備的連接池 POOLED
              容器連接池:服務器上配置的連接池 歸服務器連接池 tomcat配置連接池
              三方連接池:專業的一些連接池產品,用于做連接的管理【專業】  DBCP,c3po,druid(阿里旗下)
            -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/db1?useUnicode=true&amp;characterEncoding=UTF-8&amp; useSSL=false &amp;serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
<!--    將mapper檔案路徑注冊到Mybatis中-->
    <mappers>
     <!-- mapper 引入指定的映射組態檔   resource屬性指定映射組態檔的名稱 -->
        <mapper resource="com/tjcu/dao/StudentDaoImpl.xml"></mapper>
    </mappers>
</configuration>

  • 開發步驟(查1個)
開發步驟(查1個) : 
1. 根據表結構,定義物體類(同JDBC)
2. 創建DAO介面(同JDBC) 
3. 使用mapper映射檔案,實作介面【重點】 
4. 注冊mapper檔案(在mybatis-config.xml核心組態檔)【重點】 
5. 測驗

0、命令視窗創建mysql

mysql -h localhost -uroot -proot -u后面的為用戶名名稱 -p后面輸入密碼
顯示出這個時證明連接資料庫成功
show databases;    //顯示存在的資料庫
use test;                //test為相對應的資料庫名稱,表示使用某個資料庫
show tables;        //顯示此資料庫的所有表
desc book;            //book為對應的表名稱,此命令為展示表的欄位詳情
create database test;    //建資料庫,名字為test

CREATE DATABASE db1;

USE db1;

CREATE TABLE student(
  id INT PRIMARY KEY AUTO_INCREMENT,
  NAME VARCHAR(20),
  age INT
);

INSERT INTO student VALUES (NULL,'張三',23);
INSERT INTO student VALUES (NULL,'李四',24);
INSERT INTO student VALUES (NULL,'王五',25);

SELECT * FROM student;

1.創建物體類

同JDBC, 注意:必須有 默認的公共無參構造方法! 
package com.tjcu.entity;
public class Student {
    private int id;
    private String name;
    private int age;

2.創建DAO介面

public interface StudentDao {

    /**
     *   根據id查詢用戶
     * @param id
     * @return Student
     */
    public Student selectById(int id);
}

3.創建mapper檔案

  • id:唯一標識, 配合名稱空間使用,

????parameterType:指定引數映射的物件型別,

????resultType:指定結果映射的物件型別,

  • 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="com.tjcu.dao.StudentDao">
    <!--
    id:當前實作的功能 方法名
    parameterType:引數型別,可寫可不寫
    resultType:回傳值型別
    #{id}:表示接收Dao引數中id的值
    -->
    <select id="selectById"  resultType="com.tjcu.entity.Student">
        select * from student where id=#{id};
    </select>
</mapper>
  • 多個傳參

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-JrvLP5yo-1634006849270)(image/1590917925968.png)]

4.在mybatis-config.xml中注冊mapper檔案

<!--    將mapper檔案路徑注冊到Mybatis-->
    <mappers>
        <mapper resource="com/tjcu/dao/StudentDaoImpl.xml"></mapper>
    </mappers>

5.測驗

package com.tjcu.test;

import com.tjcu.dao.StudentDao;
import com.tjcu.entity.Student;
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 java.io.IOException;
import java.io.InputStream;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/10/11 15:05
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class TestMybatis {

    public static void main(String[] args) throws IOException {
        //      1.加載Mybatis配置引數 核心組態檔 引數Lmybatis-config.xml的引數路徑
        InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
//        2.創建sqlSessionFactory物件 構建者模式
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//        3.獲取sqlSession物件
        SqlSession sqlSession = ssf.openSession();
//        4.翻譯(映射)Dao介面的實作類 引數是dao介面的類物件   動態代理   多型:StudentDao介面直接參考
//        類物件獲取:class.forName   xxx.getClass()  xxx.class
        StudentDao mapper = sqlSession.getMapper(StudentDao.class);
//        5.呼叫功能方法
        Student student = mapper.selectById(1);
        System.out.println(student);
//        6.關閉資源
        if(sqlSession!=null){
            sqlSession.close();
        }


    }

}

  • 結構圖

三、Mybatsi優化

1、 資料庫連接組態檔引入優化

  • properties標簽引入外部檔案
<!--引入資料庫連接的組態檔-->
    <properties resource="jdbc.properties"/>
  • 具體使用,如下配置
 <!-- property獲取資料庫連接的配置資訊 -->
    <property name="driver" value="${driver}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />

2、起別名優化

  • typeAliases:型別別名

  • typeAlias>:為全類名起別名的子標簽,

  • 屬性

     type:指定全類名
    
     alias:指定別名
    
  • :為指定包下所有類起別名的子標簽,(別名就是類名)

  • 如下圖:

mybatis-config.xml具體如下配置:

<!--起別名-->
<typeAliases>
<typeAlias type="com.tjcu.entity.Student" alias="student"></typeAlias>
<!--package com.tjcu.entity;-->
</typeAliases>

StudentDaoImpl.xml具體修改配置如下:

修改前:
 <select id="selectStudentByNameAndAge" resultType="com.tjcu.entity.Student">
        select * from student where name=#{name} and age=#{age} ;
</select>

修改后:
<select id="selectStudentByNameAndAge" resultType="student">
        select * from student where name=#{name} and age=#{age} ;
</select>

3、DAO介面中方法的引數接收

1.引數是一個

 在mapper檔案中接收時可以書寫任意值
<select id="selectById"  resultType="com.tjcu.entity.Student">
        select * from student where id=#{id};
</select>

2.引數是多個(2-多)

在mapper檔案中接收時需要書寫引數的下標

<select id="selectUserByNameAndAge" resultType="com.tjcu.entity.Student">
        select * from student where name=#{0} and age=#{1} ;
    </select>

3. 引數系結

在mapper檔案中接收指定引數值時 使用的特定的名字

????通過注解實作: @Param

????添加位置:引數前

????使用方式:@Param(“在mapper檔案中接收時使用的名字”)

  • StduentDao.java
 public Student selectStudentByNameAndAge
 (@Param(value = "name") String name, @Param(value = "age") int age);
  • Studentmapper.xml
 <select id="selectStudentByNameAndAge" resultType="com.tjcu.entity.Student">
        select * from student where name=#{name} and age=#{age} ;
    </select>
  • 優化版本:@param(“name”) String name

4、mybatis的增刪改&查所有

1、修改 StudnetMapper.xml配置

 <update id="updateById">
        update student set name=#{name},age=#{age} where id=#{id};
    </update>
  • 測驗代碼
package com.tjcu.test;

import com.tjcu.dao.StudentDao;
import com.tjcu.entity.Student;
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 java.io.IOException;
import java.io.InputStream;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/10/11 15:05
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class TestMybatisUpdate {

    public static void main(String[] args) throws IOException {
        //      1.加載Mybatis配置引數 核心組態檔 引數Lmybatis-config.xml的引數路徑
        InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
//        2.創建sqlSessionFactory物件 構建者模式
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//        3.獲取sqlSession物件
        SqlSession sqlSession = ssf.openSession();
//        4.翻譯(映射)Dao介面的實作類 引數是dao介面的類物件   動態代理   多型:StudentDao介面直接參考
//        類物件獲取:class.forName   xxx.getClass()  xxx.class
        StudentDao mapper = sqlSession.getMapper(StudentDao.class);
//        5.呼叫功能方法
        Student student = new Student(1, "王恒杰", 23);
        mapper.updateById(student);
        System.out.println(student);
//        增刪改操作必須手動提交事務
        sqlSession.commit();
//        6.關閉資源
        if(sqlSession!=null){
            sqlSession.close();
        }


    }

}

2、洗掉StudnetMapper.xml配置

<delete id="deleteById">
     delete from student where id=#{id}
</delete>
  • 測驗代碼
package com.tjcu.test;

import com.tjcu.dao.StudentDao;
import com.tjcu.entity.Student;
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 java.io.IOException;
import java.io.InputStream;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/10/11 15:05
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class TestMybatisDelete {

    public static void main(String[] args) throws IOException {
        //      1.加載Mybatis配置引數 核心組態檔 引數Lmybatis-config.xml的引數路徑
        InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
//        2.創建sqlSessionFactory物件 構建者模式
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//        3.獲取sqlSession物件
        SqlSession sqlSession = ssf.openSession();
//        4.翻譯(映射)Dao介面的實作類 引數是dao介面的類物件   動態代理   多型:StudentDao介面直接參考
//        類物件獲取:class.forName   xxx.getClass()  xxx.class
        StudentDao mapper = sqlSession.getMapper(StudentDao.class);
//        5.呼叫功能方法
        mapper.deleteById(1);
//        增刪改操作必須手動提交事務
        sqlSession.commit();
//        6.關閉資源
        if(sqlSession!=null){
            sqlSession.close();
        }


    }

}

3、增加StudnetMapper.xml配置

  <insert id="insertStudent">
        insert into student values(#{id},#{name},#{age})
    </insert>
  • 測驗代碼
package com.tjcu.test;

import com.tjcu.dao.StudentDao;
import com.tjcu.entity.Student;
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 java.io.IOException;
import java.io.InputStream;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/10/11 15:05
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class TestMybatisInsert {

    public static void main(String[] args) throws IOException {
        //      1.加載Mybatis配置引數 核心組態檔 引數mybatis-config.xml的引數路徑
        InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
//        2.創建sqlSessionFactory物件 構建者模式
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//        3.獲取sqlSession物件
        SqlSession sqlSession = ssf.openSession();
//        4.翻譯(映射)Dao介面的實作類 引數是dao介面的類物件   動態代理   多型:StudentDao介面直接參考
//        類物件獲取:class.forName   xxx.getClass()  xxx.class
        StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
//        5.呼叫功能方法
        Student student = new Student(null, "王恒杰", 23);
        studentDao.insertStudent(student);
        sqlSession.commit();
//        6.關閉資源
        if(sqlSession!=null){
            sqlSession.close();
        }
    }
}

4、查所有StudnetMapper.xml配置

<!--查所有-->
    <select id="selectAll" resultType="student">
        select * from student;
    </select>

  • 測驗代碼
package com.tjcu.test;

import com.tjcu.dao.StudentDao;
import com.tjcu.entity.Student;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/10/11 15:05
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class TestMybatisSelectAll {

    public static void main(String[] args) throws IOException {
        //      1.加載Mybatis配置引數 核心組態檔 引數Lmybatis-config.xml的引數路徑
        InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
//        2.創建sqlSessionFactory物件 構建者模式
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//        3.獲取sqlSession物件
        SqlSession sqlSession = ssf.openSession();
//        4.翻譯(映射)Dao介面的實作類 引數是dao介面的類物件   動態代理   多型:StudentDao介面直接參考
//        類物件獲取:class.forName   xxx.getClass()  xxx.class
        StudentDao mapper = sqlSession.getMapper(StudentDao.class);
//        5.呼叫功能方法
        List<Student> students = mapper.selectAll();
        for (Student student : students) {
            System.out.println(student);
        }
//        6.關閉資源
        if(sqlSession!=null){
            sqlSession.close();
        }
    }
}

5、插入主鍵回填 StudnetMapper.xml配置

  • Mybatis插入用戶資料 同時將主鍵回填到指定屬性中 id 主鍵回填【主鍵能自增】
    <insert id="insertStudent" useGeneratedKeys="true" keyProperty="id">
        insert into student values(#{id},#{name},#{age})
    </insert>

  • 測驗代碼
package com.tjcu.test;

import com.tjcu.dao.StudentDao;
import com.tjcu.entity.Student;
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 java.io.IOException;
import java.io.InputStream;

/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/10/11 15:05
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class TestMybatisInsert {

    public static void main(String[] args) throws IOException {
        //      1.加載Mybatis配置引數 核心組態檔 引數mybatis-config.xml的引數路徑
        InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
//        2.創建sqlSessionFactory物件 構建者模式
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//        3.獲取sqlSession物件
        SqlSession sqlSession = ssf.openSession();
//        4.翻譯(映射)Dao介面的實作類 引數是dao介面的類物件   動態代理   多型:StudentDao介面直接參考
//        類物件獲取:class.forName   xxx.getClass()  xxx.class
        StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
//        5.呼叫功能方法
        Student student = new Student(null, "王恒杰", 23);
        System.out.println(student.getId());//null
        studentDao.insertStudent(student);
        System.out.println(student.getId());//6
        sqlSession.commit();
//        6.關閉資源
        if(sqlSession!=null){
            sqlSession.close();
        }
    }
}

6、模糊查詢 StudnetMapper.xml配置

  <!--模糊查詢 -->
    <select id="selectUserLikeUsername" resultType="user" >
        select  * from t_user where username like #{username}
    </select>
  • 測驗代碼
public void selectUserLikeUsername() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = build.openSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        String str="恒";
        List<User> users = mapper.selectUserLikeUsername("%"+str + "%");
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }

四、核心組態檔總結

核心組態檔包含了Mybatis最核心的設定和屬性資訊,如資料庫的鏈接,事務,連接池資訊等,
1.<configuration>:核心根標簽
2.<properties>:引入資料庫鏈接資訊組態檔標簽,
3.<typeAliases>:起別名標簽
4.<environments>:配置資料庫環境標簽
5.<environment>:配置資料庫資訊標簽
6.<transactionManager>:事務管理標簽
7.<dataSources>:資料源標簽
8.<property>:資料庫鏈接資訊標簽
9.<mappers>:引入映射檔案配置標簽

五.Mybatis傳統方式開發

1、Dao層傳統實作方式

  • 分成思想:控制層(Controller),業務層(service),持久層(dao)

  • 呼叫流程

2、LOG4J的配置和使用

  • 在日常開發程序中,排查問題時難免需要輸出 MyBatis 真正執行的 SQL 陳述句、引數、結果等資訊,我們就可以借助 LOG4J 的功能來實作執行資訊的輸出,

  • 使用步驟:

  1. 匯入jar包

log4j-1.2.16.jar

log4j.rootLogger=DEBUG, stdout

# SqlMap logging configuration...
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.cache.CacheModel=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientImpl=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.builder.xml.SqlMapParser=DEBUG
log4j.logger.com.ibatis.common.util.StopWatch=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/310618.html

標籤:其他

上一篇:SYU迎新妙妙賽

下一篇:如何快速學會別人的代碼和思維

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more