3、增刪改查實作
select
-
select標簽是mybatis中最常用的標簽之一
-
select陳述句有很多屬性可以詳細配置每一條SQL陳述句
-
SQL陳述句回傳值型別,【完整的類名或者別名】
-
傳入SQL陳述句的引數型別 ,【萬能的Map,可以多嘗試使用】
-
命名空間中唯一的識別符號
-
介面中的方法名與映射檔案中的SQL陳述句ID 一一對應
-
id
-
parameterType
-
resultType
需求:根據id查詢用戶
1、在UserMapper中添加對應方法
public interface UserMapper {
//查詢全部用戶
List<User> selectUser();
//根據id查詢用戶
User selectUserById(int id);
}
2、在UserMapper.xml中添加Select陳述句
<select id="selectUserById" resultType="com.kuang.pojo.User">
select * from user where id = #{id}
</select>
3、測驗類中測驗
@Test
public void tsetSelectUserById() {
SqlSession session = MybatisUtils.getSession(); //獲取SqlSession連接
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user);
session.close();
}
insert
我們一般使用insert標簽進行插入操作,它的配置和select標簽差不多!
需求:給資料庫增加一個用戶
1、在UserMapper介面中添加對應的方法
//添加一個用戶
int addUser(User user);
2、在UserMapper.xml中添加insert陳述句
<insert id="addUser" parameterType="com.kuang.pojo.User">
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
3、測驗
@Test
public void testAddUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(5,"王五","zxcvbn");
int i = mapper.addUser(user);
System.out.println(i);
session.commit(); //提交事務,重點!不寫的話不會提交到資料庫
session.close();
}
注意點:增、刪、改操作需要提交事務!
update
我們一般使用update標簽進行更新操作,它的配置和select標簽差不多!
需求:修改用戶的資訊
1、同理,撰寫介面方法
//修改一個用戶
int updateUser(User user);
2、撰寫對應的組態檔SQL
<update id="updateUser" parameterType="com.kuang.pojo.User">
update user set name=#{name},pwd=#{pwd} where id = #{id}
</update>
3、測驗
@Test
public void testUpdateUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
user.setPwd("asdfgh");
int i = mapper.updateUser(user);
System.out.println(i);
session.commit(); //提交事務,重點!不寫的話不會提交到資料庫
session.close();
}
delete
我們一般使用delete標簽進行洗掉操作,它的配置和select標簽差不多!
需求:根據id洗掉一個用戶
1、同理,撰寫介面方法
//根據id洗掉用戶
int deleteUser(int id);
2、撰寫對應的組態檔SQL
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
3、測驗
@Test
public void testDeleteUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
int i = mapper.deleteUser(5);
System.out.println(i);
session.commit(); //提交事務,重點!不寫的話不會提交到資料庫
session.close();
}
小結:
-
所有的增刪改操作都需要提交事務!
-
介面所有的普通引數,盡量都寫上@Param引數,尤其是多個引數時,必須寫上!
-
有時候根據業務的需求,可以考慮使用map傳遞引數!
-
為了規范操作,在SQL的組態檔中,我們盡量將Parameter引數和resultType都寫上!
4、配置決議
核心組態檔
-
mybatis-config.xml 系統核心組態檔
-
MyBatis 的組態檔包含了會深深影響 MyBatis 行為的設定和屬性資訊,
-
能配置的內容如下:
configuration(配置)
properties(屬性)
settings(設定)
typeAliases(型別別名)
typeHandlers(型別處理器)
objectFactory(物件工廠)
plugins(插件)
environments(環境配置)
environment(環境變數)
transactionManager(事務管理器)
dataSource(資料源)
databaseIdProvider(資料庫廠商標識)
mappers(映射器)
<!-- 注意元素節點的順序!順序不對會報錯 -->
我們可以閱讀 mybatis-config.xml 上面的dtd的頭檔案!
environments元素
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="https://www.cnblogs.com/ctf99525/archive/2020/11/24/..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="https://www.cnblogs.com/ctf99525/archive/2020/11/24/${driver}"/>
<property name="url" value="https://www.cnblogs.com/ctf99525/archive/2020/11/24/${url}"/>
<property name="username" value="https://www.cnblogs.com/ctf99525/archive/2020/11/24/${username}"/>
<property name="password" value="https://www.cnblogs.com/ctf99525/archive/2020/11/24/${password}"/>
</dataSource>
</environment>
</environments>
-
配置MyBatis的多套運行環境,將SQL映射到多個不同的資料庫上,必須指定其中一個為默認運行環境(通過default指定)
-
子元素節點:environment
-
dataSource 元素使用標準的 JDBC 資料源介面來配置 JDBC 連接物件的資源,
-
資料源是必須配置的,
-
有三種內建的資料源型別
type="[UNPOOLED|POOLED|JNDI]") -
unpooled:這個資料源的實作只是每次被請求時打開和關閉連接,
-
pooled:這種資料源的實作利用“池”的概念將 JDBC 連接物件組織起來 , 這是一種使得并發 Web 應用快速回應請求的流行處理方式,
-
jndi:這個資料源的實作是為了能在如 Spring 或應用服務器這類容器中使用,容器可以集中或在外部配置資料源,然后放置一個 JNDI 背景關系的參考,
-
資料源也有很多第三方的實作,比如dbcp,c3p0,druid等等....
-
詳情:點擊查看官方檔案
-
這兩種事務管理器型別都不需要設定任何屬性,
-
具體的一套環境,通過設定id進行區別,id保證唯一!
-
子元素節點:transactionManager - [ 事務管理器 ]
<!-- 語法 -->
<transactionManager type="[ JDBC | MANAGED ]"/> -
子元素節點:資料源(dataSource)
mappers元素
mappers
-
映射器 : 定義映射SQL陳述句檔案
-
既然 MyBatis 的行為其他元素已經配置完了,我們現在就要定義 SQL 映射陳述句了,但是首先我們需要告訴 MyBatis 到哪里去找到這些陳述句,Java 在自動查找這方面沒有提供一個很好的方法,所以最佳的方式是告訴 MyBatis 到哪里去找映射檔案,你可以使用相對于類路徑的資源參考, 或完全限定資源定位符(包括
file:///的 URL),或類名和包名等,映射器是MyBatis中最核心的組件之一,在MyBatis 3之前,只支持xml映射器,即:所有的SQL陳述句都必須在xml檔案中配置,而從MyBatis 3開始,還支持介面映射器,這種映射器方式允許以Java代碼的方式注解定義SQL陳述句,非常簡潔,
引入資源方式
<!-- 使用相對于類路徑的資源參考 -->
<mappers>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定資源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
<!--
使用映射器介面實作類的完全限定類名
需要組態檔名稱和介面名稱一致,并且位于同一目錄下
-->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
<!--
將包內的映射器介面實作全部注冊為映射器
但是需要組態檔名稱和介面名稱一致,并且位于同一目錄下
-->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
Mapper檔案
<?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.chen.mapper.UserMapper">
</mapper>
-
namespace中文意思:命名空間,作用如下:
-
namespace的命名必須跟某個介面同名
-
介面中的方法與映射檔案中sql陳述句id應該一一對應
-
namespace和子元素的id聯合保證唯一 , 區別不同的mapper
-
系結DAO介面
-
namespace命名規則 : 包名+類名
MyBatis 的真正強大在于它的映射陳述句,這是它的魔力所在,由于它的例外強大,映射器的 XML 檔案就顯得相對簡單,如果拿它跟具有相同功能的 JDBC 代碼進行對比,你會立即發現省掉了將近 95% 的代碼,MyBatis 為聚焦于 SQL 而構建,以盡可能地為你減少麻煩,
Properties優化
資料庫這些屬性都是可外部配置且可動態替換的,既可以在典型的 Java 屬性檔案中配置,亦可通過 properties 元素的子元素來傳遞,具體的官方檔案
我們來優化我們的組態檔
第一步 ; 在資源目錄下新建一個db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=123456
第二步 : 將檔案匯入properties 組態檔
<configuration>
<!--匯入properties檔案-->
<properties resource="db.properties"/>
?
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"${driver}"/>
<property name="url" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"${url}"/>
<property name="username" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"${username}"/>
<property name="password" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
更多操作,可以查看官方檔案!【演示帶領學習】
-
組態檔優先級問題
-
新特性:使用占位符
typeAliases優化
型別別名是為 Java 型別設定一個短的名字,它只和 XML 配置有關,存在的意義僅在于用來減少類完全限定名的冗余,
<!--配置別名,注意順序-->
<typeAliases>
<typeAlias type="com.kuang.pojo.User" alias="User"/>
</typeAliases>
當這樣配置時,User可以用在任何使用com.kuang.pojo.User的地方,
也可以指定一個包名,MyBatis 會在包名下面搜索需要的 Java Bean,比如:
<typeAliases>
<package name="com.kuang.pojo"/>
</typeAliases>
每一個在包 com.kuang.pojo 中的 Java Bean,在沒有注解的情況下,會使用 Bean 的首字母小寫的非限定類名來作為它的別名,
若有注解,則別名為其注解值,見下面的例子:
@Alias("user")
public class User {
...
}
去官網查看一下Mybatis默認的一些型別別名!
其他配置瀏覽
設定
-
設定(settings)相關 => 查看幫助檔案
-
懶加載
-
日志實作
-
快取開啟關閉
-
一個配置完整的 settings 元素的示例如下:
<settings>
<setting name="cacheEnabled" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"true"/>
<setting name="lazyLoadingEnabled" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"true"/>
<setting name="multipleResultSetsEnabled" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"true"/>
<setting name="useColumnLabel" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"true"/>
<setting name="useGeneratedKeys" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"false"/>
<setting name="autoMappingBehavior" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"WARNING"/>
<setting name="defaultExecutorType" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"SIMPLE"/>
<setting name="defaultStatementTimeout" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"25"/>
<setting name="defaultFetchSize" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"100"/>
<setting name="safeRowBoundsEnabled" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"false"/>
<setting name="mapUnderscoreToCamelCase" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"false"/>
<setting name="localCacheScope" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"SESSION"/>
<setting name="jdbcTypeForNull" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"OTHER"/>
<setting name="lazyLoadTriggerMethods" value=https://www.cnblogs.com/ctf99525/archive/2020/11/24/"equals,clone,hashCode,toString"/>
</settings>
型別處理器
-
無論是 MyBatis 在預處理陳述句(PreparedStatement)中設定一個引數時,還是從結果集中取出一個值時, 都會用型別處理器將獲取的值以合適的方式轉換成 Java 型別,
-
你可以重寫型別處理器或創建你自己的型別處理器來處理不支持的或非標準的型別,【了解即可】
物件工廠
-
MyBatis 每次創建結果物件的新實體時,它都會使用一個物件工廠(ObjectFactory)實體來完成,
-
默認的物件工廠需要做的僅僅是實體化目標類,要么通過默認構造方法,要么在引數映射存在的時候通過有參構造方法來實體化,
-
如果想覆寫物件工廠的默認行為,則可以通過創建自己的物件工廠來實作,【了解即可】
生命周期和作用域
作用域(Scope)和生命周期
理解我們目前已經討論過的不同作用域和生命周期類是至關重要的,因為錯誤的使用會導致非常嚴重的并發問題,
作用域理解
-
SqlSessionFactoryBuilder 的作用在于創建 SqlSessionFactory,創建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于創建 SqlSessionFactory 的方法中,而不要讓其長期存在,因此 SqlSessionFactoryBuilder 實體的最佳作用域是方法作用域(也就是區域方法變數),
-
SqlSessionFactory 可以被認為是一個資料庫連接池,它的作用是創建 SqlSession 介面物件,因為 MyBatis 的本質就是 Java 對資料庫的操作,所以 SqlSessionFactory 的生命周期存在于整個 MyBatis 的應用之中,所以一旦創建了 SqlSessionFactory,就要長期保存它,直至不再使用 MyBatis 應用,所以可以認為 SqlSessionFactory 的生命周期就等同于 MyBatis 的應用周期,
-
由于 SqlSessionFactory 是一個對資料庫的連接池,所以它占據著資料庫的連接資源,如果創建多個 SqlSessionFactory,那么就存在多個資料庫連接池,這樣不利于對資料庫資源的控制,也會導致資料庫連接資源被消耗光,出現系統宕機等情況,所以盡量避免發生這樣的情況,
-
因此在一般的應用中我們往往希望 SqlSessionFactory 作為一個單例,讓它在應用中被共享,所以說 SqlSessionFactory 的最佳作用域是應用作用域,
-
如果說 SqlSessionFactory 相當于資料庫連接池,那么 SqlSession 就相當于一個資料庫連接(Connection 物件),你可以在一個事務里面執行多條 SQL,然后通過它的 commit、rollback 等方法,提交或者回滾事務,所以它應該存活在一個業務請求中,處理完整個請求后,應該關閉這條連接,讓它歸還給 SqlSessionFactory,否則資料庫資源就很快被耗費精光,系統就會癱瘓,所以用 try...catch...finally... 陳述句來保證其正確關閉,
-
所以 SqlSession 的最佳的作用域是請求或方法作用域,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/227248.html
標籤:其他
上一篇:MyBatis學習01
下一篇:8、Spring Boot任務
