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&characterEncoding=UTF-8& useSSL=false &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底層封裝的就是Connection
(3)控制事務
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&characterEncoding=UTF-8& useSSL=false &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 的功能來實作執行資訊的輸出,
-
使用步驟:
- 匯入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迎新妙妙賽
下一篇:如何快速學會別人的代碼和思維
