MyBatis配置與CRUD超詳細(xì)講解
namespace:命名空間 必須綁定一個(gè)對(duì)應(yīng)Mapper接口
使用全限定名: com.yuqu.Dao.UserMapper
id:對(duì)應(yīng)上面的Mapper接口下面的某一方法名
resultType:表示返回結(jié)果類型 如:com.yuqu.pojo.User
parameterType:參數(shù)類型,基本數(shù)據(jù)類型通常忽略不寫
CRUD增刪改查
增刪改切記提交事務(wù):sqlSession.commit();
在確保已經(jīng)配置好了mybatis-config.xml核心配置文件之后,我們每次需要操作sql時(shí),就只需要操作接口UserMapper和UserMapper.xml配置文件即可
示例代碼
UserMapper.xml
<mapper namespace="com.yuqu.dao.UserMapper"> <select id="getUserList" resultType="com.yuqu.pojo.User"> select * from testmybatis.tb_user; </select> <select id="getUserById" parameterType="int" resultType="com.yuqu.pojo.User"> select * from testmybatis.tb_user where id = #{id}; </select> <insert id="insertUser" parameterType="com.yuqu.pojo.User"> insert into testmybatis.tb_user (id,username,password,gender,addr) values(#{id},#{username},#{password},#{gender},#{addr}); </insert> <update id="updateUser" parameterType="com.yuqu.pojo.User"> update testmybatis.tb_user set username=#{username},password=#{password},gender=#{gender},addr=#{addr} where id = #{id}; </update> <delete id="deleteUser" parameterType="int"> delete from testmybatis.tb_user where id = #{id}; </delete> </mapper>
Test代碼(僅以添加為例)
@Test public void testInsertUser(){ // 獲取SqlSession SqlSession sqlSession = MyBatisUtils.getSqlSession(); // 執(zhí)行sql UserMapper mapper = sqlSession.getMapper(UserMapper.class); int res = mapper.insertUser(new User(4, "趙六", "1234", '妖', "鄭州")); if (res > 0){ System.out.println("插入成功!"); // 增刪改必須提交事務(wù) sqlSession.commit(); } }
Map傳參
上述UserMapper.xml所示,如果參數(shù)過多時(shí),當(dāng)我們進(jìn)行添加操作或者修改操作就會(huì)非常麻煩。所以,可以優(yōu)化采用Map來進(jìn)行可選參數(shù)。以查詢用戶selectUser為例:
// UserMapper接口 // 查詢用戶 Map入?yún)?簡(jiǎn)單實(shí)現(xiàn)模糊查詢 int selectUser2(Map<String,Object> map); // UserMapper.xml <select id="selectUser2" parameterType="map" resultType="com.yuqu.pojo.User"> select * from testmybatis.tb_user where username = #{helloName}; </select> // @Test @Test public void testSelectUser2(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map<String, Object> map = new HashMap<String, Object>(); map.put("helloName","順子"); User user = mapper.selectUser2(map); System.out.println(user); sqlSession.close(); }
map傳遞參數(shù),可以直接在sql中獲取key,實(shí)現(xiàn)定制化參數(shù)
對(duì)象傳遞參數(shù),直接在sql中取出sql的對(duì)象屬性。但要保證字段名相同
基本數(shù)據(jù)類型時(shí)直接在sql中獲取
模糊查詢
// UserMapper // 模糊查詢用戶 List<User> getUserLikeList(String value); // UserMapper.xml <select id="getUserLikeList" resultType="com.yuqu.pojo.User"> select * from testmybatis.tb_user where username like #{value}; </select>
還有一種方式就是直接把sql固定寫死,獲取用戶輸入的一個(gè)穩(wěn)定的值
select * from testmybatis.tb_user where username like "%"#{value}"%";
MyBatis配置解析
核心配置文件mybatis-config.xml
參考mybatis官網(wǎng)給出的配置信息:
configuration(配置)
properties(屬性)
settings(設(shè)置)
typeAliases(類型別名)
typeHandlers(類型處理器)
objectFactory(對(duì)象工廠)
plugins(插件)
environments(環(huán)境配置)
environment(環(huán)境變量)
transactionManager(事務(wù)管理器)
dataSource(數(shù)據(jù)源)
databaseIdProvider(數(shù)據(jù)庫廠商標(biāo)識(shí))
mappers(映射器)
環(huán)境變量(Environments)
mybatis可以配置多種環(huán)境,但每個(gè)sqlSessionFactory智能選擇一個(gè)環(huán)境
一個(gè)數(shù)據(jù)庫對(duì)應(yīng)一個(gè)SqlSessionFactory
我們可以在environments
元素下配置多個(gè)環(huán)境environment
,每個(gè)環(huán)境都需要設(shè)置單獨(dú)的id,當(dāng)我們需要用到哪一個(gè)的時(shí)候就需要將default設(shè)置為哪一個(gè)環(huán)境的id
<environments default="development"><environments>
environments下包含
事務(wù)管理器transactionManger
<transactionManager type="JDBC"> <property name="skipSetAutoCommitOnClose" value="true"/> </transactionManager>
事務(wù)管理器不僅有JDBC一種,還有一種 MANAGED
<transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager>
MyBatis官網(wǎng)提示: 如果你正在使用 Spring + MyBatis,則沒有必要配置事務(wù)管理器,因?yàn)镾pring 模塊會(huì)使用自帶的管理器來覆蓋前面的配置
數(shù)據(jù)源DataSource
之前學(xué)過的比如dbcp、c3p0、druid等等。用于連接數(shù)據(jù)庫
mybatis內(nèi)置了三種數(shù)據(jù)源:type="[UNPOOLED|POOLED|JND]"
UNPOOLED:表示無池連接,用完即銷毀
POOLED:有池連接,用完后回收等待下次使用。(默認(rèn)情況使用)
JND:表示正常連接
屬性(Properties)
屬性可以通過外部文件配置,也可以在Properties的子元素當(dāng)中配置,在Properties子元素配置如下示例:
<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&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments>
也可以通過典型的Java屬性文件進(jìn)行配置,比如db.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&;useUnicode=true&;characterEncoding=UTF-8&;serverTimezone=UTC
username=root
password=123456
最后價(jià)格文件用properties標(biāo)簽引入到mybatis-config.xml中,環(huán)境則更改為初始形式
<!-- 引入外部資源 --> <properties resource="db.properties" /> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
通過官網(wǎng)可以知道,我們也可以將db.properties中的配置信息只寫一半,另一半在引入的同時(shí)用雙標(biāo)簽閉合,在其中用properties的子標(biāo)簽property重新引入即可
<properties resource="db.properties" > <property name="username" value="root"/> <property name="password" value="123456"/> </properties>
如果同時(shí)存在于外部文件和property中,優(yōu)先使用外部文件的配置信息
類型別名(typeAliases)
typeAliases用于簡(jiǎn)化全限定名的書寫,僅限于在xml中配置
指定全限定類名別名:
<typeAliases> <typeAlias type="com.yuqu.pojo.User" alias="user" /> </typeAliases>
type代表全限定名,將其映射為一個(gè)簡(jiǎn)化名稱 user。如上所示在需要用到com.yuqu.pojo.User的地方就可以替換成user
指定包名配置
<typeAliases> <package name="com.yuqu.pojo"/> </typeAliases>
經(jīng)此配置后,mybatis會(huì)自動(dòng)查找在com.yuqu.pojo下的所需Java Bean。
在沒有對(duì)實(shí)體類添加注解用法:默認(rèn)使用Bean的首字母小寫的非限定類名來作為它的別名
添加注解的用法:
@Alias("hello") public class User { //... }
接下來就可以在任何要用com.yuqu.pojo.User的地方使用hello代替
建議在實(shí)體類較少的情況下使用第一種指定全限定類名的別名
實(shí)體類較多時(shí)可以使用指定包名配置
其他的Java類型內(nèi)建的別名可以參考MyBatis官網(wǎng)
映射器(mappers)
在定義sql映射語句之前,首先我們要告訴mybatis去哪里獲取這些語句。這個(gè)時(shí)候就需要用到映射器mappers,mybatis根據(jù)映射的路徑去找到對(duì)應(yīng)的文件或者接口再去執(zhí)行sql語句
映射器使用一:使用相對(duì)于類路徑的資源引用(建議使用)
<mappers> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers> // 如果將Mapper文件直接放在resource下就可以改成 <mappers> <mapper resource="PostMapper.xml"/> </mappers>
映射器使用二:使用class文件的完全限定類名
<mappers> <mapper class="org.mybatis.builder.PostMapper" /> </mappers>
- 接口和它的Mapper配置文件必須在同一包下!
- 接口和它的Mapper配置文件必須同名!
映射器使用使用三:將包內(nèi)的映射器接口全部注冊(cè)為映射器
<mappers> <package name="org.mybatis.builder"/> </mappers>
- 接口和它的Mapper配置文件必須在同一包下!
- 接口和它的Mapper配置文件必須同名!
生命周期和作用域
錯(cuò)誤的使用生命周期和作用域會(huì)導(dǎo)致非常嚴(yán)重的并發(fā)問題
SqlSessionFactoryBuilder:
- 創(chuàng)建SqlSessionFactory工廠使用,一旦創(chuàng)建了SqlSessionFactory就不再需要使用它
- 最佳作用域是方法域(局部方法變量)
SqlSessionFactory:
- SqlSessionFactory用于生產(chǎn)SqlSession實(shí)例
- 一旦創(chuàng)建就應(yīng)該一直存在于程序的運(yùn)行期間,不要丟棄或嘗試重新創(chuàng)建另一個(gè)SqlSessionFactory
- 可以采用單例模式來保證唯一的SqlSessionFactory
- 最佳作用域是全局作用(應(yīng)用作用域)
SqlSession:
- SqlSession用于執(zhí)行已映射的sql指令
- 每個(gè)線程都有自己的SqlSession實(shí)例,因?yàn)樗皇蔷€程安全的不能被共享
- 最佳作用域是方法域或者請(qǐng)求域
到此這篇關(guān)于MyBatis配置與CRUD超詳細(xì)講解的文章就介紹到這了,更多相關(guān)MyBatis配置與CRUD內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot如何使用AOP做訪問請(qǐng)求日志
這篇文章主要介紹了springboot如何使用AOP做訪問請(qǐng)求日志,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01Springcloud中的@RefreshScope的實(shí)現(xiàn)
@RefreshScope注解是Spring Cloud中的一個(gè)注解,它用來實(shí)現(xiàn)Bean中屬性的動(dòng)態(tài)刷新,本文就來介紹一下@RefreshScope注解的使用,感興趣的可以了解一下2024-06-06使用Java讀取Excel文件數(shù)據(jù)的方法詳解
通過編程方式讀取Excel數(shù)據(jù)能實(shí)現(xiàn)數(shù)據(jù)導(dǎo)入、批量處理、數(shù)據(jù)比對(duì)和更新等任務(wù)的自動(dòng)化,本文為大家介紹了三種Java讀取Excel文件數(shù)據(jù)的方法,需要的可以參考下2024-01-01如何把idea中的項(xiàng)目導(dǎo)入github倉(cāng)庫中(圖文詳解)
這篇文章主要介紹了如何把idea中的項(xiàng)目導(dǎo)入github倉(cāng)庫中,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Java編程實(shí)現(xiàn)多線程TCP服務(wù)器完整實(shí)例
這篇文章主要介紹了Java編程實(shí)現(xiàn)多線程TCP服務(wù)器完整實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01使用mongoTemplate實(shí)現(xiàn)多條件加分組查詢方式
這篇文章主要介紹了使用mongoTemplate實(shí)現(xiàn)多條件加分組查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06SpringMVC使用MultipartResolver實(shí)現(xiàn)文件上傳
MultipartResolver 用于處理文件上傳,當(dāng)收到請(qǐng)求時(shí) DispatcherServlet 的 checkMultipart() 方法會(huì)調(diào)用 MultipartResolver 的 isMultipart() 方法判斷請(qǐng)求中是否包含文件2023-02-02Elasticsearch常見字段映射類型之scaled_float解讀
這篇文章主要介紹了Elasticsearch常見字段映射類型之scaled_float解讀。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11