文章目錄
- 1、簡介
- 1.1、 什么是Mybatis
- 1.2、 持久化層
- 1.3、其它一些層次
- 1.4、為什么需要Mybatis?
- 2、第一個Mybatis程式
- 2.1、搭建環境
- 2.2、創建一個模塊
- 2.3、撰寫代碼
- 2.4、測驗
- 2.5、最后呈現的結構圖
- 3、CRUD
- 3.1、namespace
- 3.2、select
- 3.3、 insert
- 3.4、update
- 3.5、delete
- 3.6、分析錯誤
- 3.7、萬能的Map
- 3.8、模糊查詢
- 4、配置決議
- 4.1、核心組態檔
- 4.2、環境配置
- 4.3、屬性(properties)
- 4.4、類別名
- 4.5、設定
- 4.6、其他配置
- 4.7、映射器(mappers)
- 4.8、生命周期和作用域
- (1)、SqlSessionFactoryBuilder
- (2)、SqlSessionFactory:
- (3)、SqlSession
1、簡介
1.1、 什么是Mybatis
-
MyBatis 是一款優秀的持久層框架
-
它支持自定義 SQL、存盤程序以及高級映射,
-
MyBatis 免除了幾乎所有的 JDBC 代碼以及設定引數和獲取結果集的作業,
-
MyBatis 可以通過簡單的 XML 或注解來配置和映射原始型別、介面和 Java POJO(Plain Old Java Objects,普通老式 Java 物件)為資料庫中的記錄,
-
MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名為MyBatis ,
-
2013年11月遷移到Github,
如何獲得Mybatis?
- Maven
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
- Github GitHub - mybatis/mybatis-3: MyBatis SQL mapper framework for Java
- 中文檔案 mybatis – MyBatis 3 | 簡介
1.2、 持久化層
資料持久化
- 持久化就是將程式的資料在持久化狀態和順時狀態轉化的程序
- 記憶體:斷電即失
- 資料庫(Jdbc),io檔案持久化
- 生活:冷藏,罐頭
為什么需要持久化?
- 有一些物件不能讓它丟失
- 記憶體太貴
1.3、其它一些層次
Dao層,Service層,Controller層
- 完成持久化作業的代碼
- 層界限十分明顯
1.4、為什么需要Mybatis?
-
幫助程式員將資料存入到資料庫中,
-
方便
-
傳統的JDBC代碼太復雜了,簡化,框架,自動化
-
不用Mybatis也可以,更容易上手,技術沒有高低之分,
-
優點
- 簡單易學
- 靈活
- sql和代碼的分離,提高了可維護性,
- 提供映射標簽,支持物件與資料庫的orm欄位關系映射
- 提供物件關系映射標簽,支持物件關系組建維護
- 提供xml標簽,支持撰寫動態sql,
最重要的一點:使用的人多!
2、第一個Mybatis程式
思路:搭建環境–>匯入Mybatis–>撰寫代碼–>測驗!
2.1、搭建環境
- 搭建資料庫
CREATE DATABASE `mybatis`;
CREATE TABLE `users`(
`id` INT(20) NOT NULL PRIMARY KEY,
`name` VARCHAR(30) DEFAULT NULL,
`pwd` VARCHAR(30) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `users` (`id`,`name`,`pwd`) VALUES
(1,'索隆','123456'),
(2,'索隆1','783456'),
(3,'索隆2','893456');
-
搭建專案
- 新建一個空專案
- 洗掉src目錄
- 匯入依賴
<dependencies> <!-- junit依賴--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- mysql依賴--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!-- mybatis依賴--> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
2.2、創建一個模塊
- 撰寫mybatis核心組態檔
<?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://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
<mappers>
<mapper class="com.xiao.dao.UserDao"/>
</mappers>
- 撰寫mybatis工具類
package com.xiao.utils;
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;
//撰寫 Mybatis 工具類 獲取SqlSessionFactory
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
static{//靜態代碼塊封裝 從一開始就會加載
String resource = "mybatis-config.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//獲取sqlSession 物件
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
2.3、撰寫代碼
- 撰寫物體類
package com.xiao.pojo;
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
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 getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
- 撰寫介面
package com.xiao.Dao;
import com.xiao.pojo.User;
import java.util.List;
public interface UserDao {
public abstract List<User> getUserList();
}
- 撰寫組態檔
<?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">
<!--namespace 命名空間 : 這里等價于之前縮寫的 UserDaoImp 指向一個Mapper介面-->
<mapper namespace="com.xiao.Dao.UserDao">
<!-- id 表示的是實作 namespace 中所對應介面的方法 resultType 表示的是回傳值型別 -->
<select id="getUserList" resultType="com.xiao.pojo.User">
select * from mybatis.users
</select>
</mapper>
2.4、測驗
public class UserMapperTest {
@Test
public void test(){
//獲取Sqlsession 物件
SqlSession sqlSession = MybatisUtils.getSqlSession();
//從 介面的反射類 獲得相應的 mapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
/*
1.這里一開始就有錯誤 命名的重名了
*/
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
//關閉資源
sqlSession.close();
}
}
可能會遇到的問題
- 組態檔沒有配置
- 系結介面錯誤
- 方法名不對
- 回傳型別不對
- Maven匯出資源問題
6.如果出現 connect failure
通過管理員下的命令視窗打開mysql
2.5、最后呈現的結構圖

3、CRUD
3.1、namespace
namespace中的包名要和介面的包名一致,
3.2、select
id:就是對應的namespace中的方法名;
resultType:sql陳述句的回傳值 型別在包中的位置
parameter:引數型別
- 撰寫介面
//查詢對應的具體人的資訊
User getUser(int id);
- 撰寫sql
<select id="getUser" parameterType="int" resultType="com.xiao.pojo.User">
select * from mybatis.users where id=#{id}
</select>
- 測驗
//獲取id確定的 用戶資訊
@Test
public void getUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUser(1);
System.out.println(user);
sqlSession.close();
}
3.3、 insert
<insert id="insertUser" parameterType="com.xiao.pojo.User">
insert into mybatis.users (id, name, pwd) VALUES (#{id},#{name},#{pwd})
</insert>
3.4、update
<update id="updateUser" parameterType="com.xiao.pojo.User">
update mybatis.users set name=#{name}, pwd=#{pwd} where id=#{id};
</update>
3.5、delete
<delete id="deleteUser" parameterType="int">
delete from mybatis.users where id=#{id}
</delete>
注意點:
增刪改都必須執行提交事務階段,
3.6、分析錯誤
- 標簽不要寫錯
- namespace必須是對應介面的位置名稱
- resource中必須是/隔開
- 程式組態檔必須符合規范
- 空指標例外問題,sqlSessionFactory
- 輸出的xml檔案中存在中文亂碼問題
- Maven中存在資源匯出問題
3.7、萬能的Map
假設我們物體類或資料庫中的欄位過多,我們應當考慮使用Map
//根據Map傳參實作不需要 傳入大量的引數,如果 是之前的查詢 需要new 一個User ,但 如果欄位過多,可以通過Map傳參
User getUserBy(Map<String,Object> map);//當需要傳入多個引數
<select id="getUserBy" parameterType="map" resultType="com.xiao.pojo.User">
select * from mybatis.users where id=#{Id} and name=#{Name}
</select>
-
Map傳遞引數,直接在sql中取出Key即可
-
物件傳遞引數,直接在sql中取物件的即可
- 只有一個基本資料型別,可以不寫,可以直接在sql中取到
- 多個引數使用Map,或者注解
3.8、模糊查詢
- 在java代碼中書寫的模糊查詢
List<User> users = mapper.getUserBy1("%索%");
- 在sql陳述句中使用通配符
select * from mybatis.users where name like "%"#{value}"%";
4、配置決議
4.1、核心組態檔
-
mybatis-config.xml
-
MyBatis 的組態檔包含了會深深影響 MyBatis 行為的設定和屬性資訊,
configuration(配置)
properties(屬性)
settings(設定)
typeAliases(型別別名)
typeHandlers(型別處理器)
objectFactory(物件工廠)
plugins(插件)
environments(環境配置)
environment(環境變數)
transactionManager(事務管理器)
dataSource(資料源)
databaseIdProvider(資料庫廠商標識)
mappers(映射器)
4.2、環境配置
MyBatis 可以配置成適應多種環境
不過要記住:盡管可以配置多個環境,但每個 SqlSessionFactory 實體只能選擇一種環境,
學會使用多套運行環境
Mybatis默認的事務管理器就是JDBC,連接池:POOLED
4.3、屬性(properties)
我們可以通過properties屬性實作參考組態檔
這些屬性可以在外部進行配置,并可以進行動態替換,你既可以在典型的 Java 屬性檔案中配置這些屬性,也可以在 properties 元素的子元素中設定,[db.properties]

撰寫一個組態檔
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&useSSL=true
username=root
password=123456
在核心檔案中映入
<!-- 引入資源檔案-->
<properties resource="db.properties"></properties>
<!-- 還可以在之間添加一些 其他屬性-->
- 可以直接引入外部檔案
- 可以在其中增加一些屬性配置
- 如果兩個檔案有同一個欄位,優先使用外部檔案組態檔的,
4.4、類別名
- 型別別名可為 Java 型別設定一個縮寫名字,
- 意在降低冗余的全限定類名書寫
類別名
<typeAliases>
<typeAlias type="com.xiao.pojo.User" alias="User"></typeAlias>
</typeAliases>
也可以指定一個包名,Mybatis會在包名下面搜索需要的JavaBean,比如掃描物體類的包,他的默認別名就是這個類的類名,首字母小寫!
包別名
<typeAliases>
<package name="com.xiao.pojo"/>
</typeAliases>
-
在物體類比較少的時候,使用第一種方式
-
如果物體類十分多,建議使用第二種
-
第一種可以DIY別名,第二種則不行,如果非要改,需要在物體類上增加注解,
@Alias("hello")
public class User {
4.5、設定
- 這是Mybatis中極為重要的調整設定,他們會改變Mybatis的運行時行為,


4.6、其他配置
typeHandlers(型別處理器)
objectFactory(物件工廠)
plugins(插件)
-mybatis-plus
-通用mapper
-mybatis-generator-core
4.7、映射器(mappers)
方式一:使用相對于類路徑的資源參考
<mappers>
<mapper resource="com/xiao/Dao/UserMapper.xml"/>
<!-- 2.這里的映射路徑 映射的是一個xml檔案 所以前面的路徑指代 是用/隔開 -->
</mappers>
方式二:使用映射器介面實作類的完全限定類名
<mappers>
<mapper class="com.xiao.Dao.UserMapper"/>
</mappers>
注意點:
- 介面和他的Mapper組態檔必須同名
- 介面和他的組態檔必須在同一個包下
方式三:將包內的映射器介面實作全部注冊為映射器
<mappers>
<package name="com.xiao.Dao"/>
<!-- 2.這里的映射路徑 映射的是一個xml檔案 所以前面的路徑指代 是用/隔開 -->
</mappers>
注意點:
- 介面和他的Mapper組態檔必須同名
- 介面和他的組態檔必須在同一個包下
4.8、生命周期和作用域

不同作用域和生命周期類別是至關重要的,因為錯誤的使用會導致非常嚴重的并發問題,
(1)、SqlSessionFactoryBuilder
- 一旦創建了 SqlSessionFactory,就不再需要它了
- 區域變數
(2)、SqlSessionFactory:
- 說白了就是可以想象為:資料庫連接池
- SqlSessionFactory一旦被創建就應該在應用的運行期間一直存在,沒有任何理由丟棄它或重新創建另一個實體,
- 因此 SqlSessionFactory 的最佳作用域是應用作用域,
- 最簡單的就是使用單例模式或者靜態單例模式,
(3)、SqlSession
- 連接到連接池的一個請求!
- SqlSession 的實體不是執行緒安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域,
- 用完之后需要趕緊關閉,否則資源被占用!

這里面的每一個Mapper,就代表一個具體的業務!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/382926.html
標籤:其他
上一篇:Go1.18版本泛型詳解
