java回顾:MyBatis开发、配置、标签、封装会话工具
目錄
1、Mybatis框架介紹
1.1 介紹
1.2 優(yōu)點(diǎn)
1.3 缺點(diǎn)?
1.4 官方網(wǎng)站及框架包下載
1.5??mybatis框架整體架構(gòu)
1.6? mybatis的ORM(Object Relational Mapping 對(duì)象關(guān)系映射 )方式?
2、?MyBatis老式入門開發(fā)(了解)
2.1 Mybatis框架的核心類
2.2?config.xml核心配置文件:?
2.3?mapper.xml映射文件:
2.4?log4j.properties配置文件:
2.5?測例及流程圖:
2.6?使用mybatis老式的開發(fā)模式弊端
3、mybatis的dao層動(dòng)態(tài)代理(掌握)
3.1 核心步驟
3.2 測:建接口UserMapper、綁定接口和映射文件、獲取接口動(dòng)態(tài)代理對(duì)象完成查詢
3.3 在3.2基礎(chǔ)上測試mybatis的dao層動(dòng)態(tài)代理
3.4??mybatis的dao層動(dòng)態(tài)代理查詢-原理
3.5?mybatis動(dòng)態(tài)代理小結(jié)
4、mybatis核心配置
4.1 properties(屬性)定義全局變量
4.2?settings(設(shè)置)標(biāo)簽駝峰映射、延時(shí)加載
4.3?typeAliases標(biāo)簽類型別名
4.4?typeAliases標(biāo)簽內(nèi)置別名
4.5?environments?標(biāo)簽配置環(huán)境
4.6?mappers 標(biāo)簽映射器
5、myBatis增刪改測例
5.1 insert標(biāo)簽
5.2 update標(biāo)簽
5.3 delete標(biāo)簽
5.4 增刪改查標(biāo)簽
5.5 mybatis.xml核心配置文件(完整標(biāo)簽示例)
6、mybatis會(huì)話工具
1、Mybatis框架介紹
1.1 介紹
mybatis框架是對(duì)JDBC進(jìn)行封裝,解決了dao層的問題。
?? ?mybatis是Apache軟件基金會(huì)下的一個(gè)開源項(xiàng)目,前身是iBatis框架。2010年這個(gè)項(xiàng)目由apache 軟件基金會(huì)遷移到google code下,改名為mybatis。2013年11月又遷移到了github(GitHub 是一個(gè)面向開源及私有 軟件項(xiàng)目的托管平臺(tái))。
?? ?MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射(多表)。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。它對(duì) jdbc 的操作數(shù)據(jù)庫的過程進(jìn)行封裝,使開發(fā)者只需要關(guān)注 SQL 本身,而不需要花費(fèi)精力去處理例如注冊(cè)驅(qū)動(dòng)、創(chuàng)建 connection、創(chuàng)建 statement、手動(dòng)設(shè)置參數(shù)、結(jié)果集檢索等 jdbc 繁雜的過程代碼。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對(duì)象)為數(shù)據(jù)庫中的記錄。 ?
1.2 優(yōu)點(diǎn)
簡單易學(xué):mybatis本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個(gè)jar文件+配置幾個(gè)SQL映射文件即可。
使用靈活:Mybatis不會(huì)對(duì)應(yīng)用程序或者數(shù)據(jù)庫的現(xiàn)有設(shè)計(jì)強(qiáng)加任何影響。SQL語句寫在XML里,便于統(tǒng)一管理和優(yōu)化。
解除SQL與程序代碼的耦合:通過提供DAO層,將業(yè)務(wù)邏輯和數(shù)據(jù)訪問邏輯分離,使系統(tǒng)的設(shè)計(jì)更清晰,更易維護(hù),更易進(jìn)行單元測試。SQL語句和代碼的分離,提高了可維護(hù)性
1.3 缺點(diǎn)?
編寫SQL語句時(shí)工作量很大,尤其是字段多、關(guān)聯(lián)表多時(shí),更是如此。
SQL語句依賴于數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫移植性差,不能更換數(shù)據(jù)庫。
Mybatis框架還是比較簡陋(半自動(dòng)化框架),功能尚有缺失,雖然簡化了數(shù)據(jù)綁定代碼,但是整個(gè)底層數(shù)據(jù)庫查詢實(shí)際還是自己寫,工作量比較大,且不太容易適應(yīng)快速數(shù)據(jù)庫修改。
1.4 官方網(wǎng)站及框架包下載
官網(wǎng)地址:mybatis – MyBatis 3 | Introduction
1.5??mybatis框架整體架構(gòu)
1.6? mybatis的ORM(Object Relational Mapping 對(duì)象關(guān)系映射 )方式?
Mybatis有兩種映射方式:
????????1.通過XML映射;
????????2.通過注解;
2、?MyBatis老式入門開發(fā)(了解)
2.1 Mybatis框架的核心類
SqlSessionFactoryBuilder 會(huì)話工廠構(gòu)建類 主要用來構(gòu)建會(huì)話工廠的 SqlSessionFactory :會(huì)話工廠類 主要用來生產(chǎn)會(huì)話對(duì)象的; SqlSession:會(huì)話對(duì)象,底層是對(duì)Connection連接對(duì)象的封裝;數(shù)據(jù)準(zhǔn)備
數(shù)據(jù)庫 create table user (id int primary key auto_increment,username varchar(20) not null,birthday date,sex char(1) default '男',address varchar(50) ); insert into user values (null, '大猩猩','1980-10-24','男','湘北高中三年'); insert into user values (null, '櫻木花道','1992-11-12','男','湘北高中一年'); insert into user values (null, '流川楓','1983-05-20','男','湘北高中一年'); insert into user values (null, '宮城良田','1995-03-22','男','湘北高中二年'); insert into user values (null, '三井壽','1980-10-24','男','湘北高中三年'); insert into user values (null, '井上彩子','1995-03-22','女','湘北高中二年'); insert into user values (null, '赤木晴子','1995-03-22','女','湘北高中一年'); 用戶類 public class User {private Integer id;private String username;private Date birthday;private String sex;private String address; }2.2?config.xml核心配置文件:?
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><environments default="development"><!--配置數(shù)據(jù)庫環(huán)境--><environment id="development"><transactionManager type="JDBC"/><!--數(shù)據(jù)源--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/test0908"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--引入映射文件--><mappers><mapper resource="mapper/UserMapper.xml"/></mappers> </configuration>2.3?mapper.xml映射文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="hhy.UserMapper"><!--命名空間--><!--resultType結(jié)果類型:寫實(shí)體類路徑(將查詢出的數(shù)據(jù)轉(zhuǎn)換為User對(duì)象)--><!--執(zhí)行語句時(shí)使用:命名空間名.id,如hhy.UserMapper.findUserById--><select id="findUserById" resultType="hhy.pojo.User">select * from user where id = #{id}</select> </mapper>2.4?log4j.properties配置文件:
可將詳細(xì)信息輸出到控制臺(tái),例:sql語句、參數(shù)、JDBC連接、autocommit事務(wù)狀態(tài)等。
### 設(shè)置Logger輸出級(jí)別和輸出目的地 ### log4j.rootLogger=debug, stdout ### 把日志信息輸出到控制臺(tái) ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout2.5?測例及流程圖:
//myBatis查詢@Testpublic void t10() throws SQLException, IOException {//加載核心配置文件,構(gòu)建會(huì)話工廠String resource="mybatis-config.xml";//路徑名字正確可以直接點(diǎn)擊進(jìn)入xmlInputStream rs = Resources.getResourceAsStream(resource);SqlSessionFactory build = new SqlSessionFactoryBuilder().build(rs);//獲取會(huì)話對(duì)象SqlSession sqlSession = build.openSession();//調(diào)用查詢api//第一個(gè)參數(shù)為mapper.xml中的命名空間名.sql的id,第二個(gè)參數(shù)為想要查詢的數(shù)據(jù)庫中數(shù)據(jù)idUser user = sqlSession.selectOne("hhy.UserMapper.findUserById",1);System.out.println("user = " + user);sqlSession.close();rs.close();}?2.6?使用mybatis老式的開發(fā)模式弊端
1)要使用指定的sql必須使用命名空間.id進(jìn)行字符串拼接,維護(hù)性比較差; 2)并且這個(gè)sql用多少次,就拼接多少次,維護(hù)性比較差;3、mybatis的dao層動(dòng)態(tài)代理(掌握)
?3.1 核心步驟
Mybatis存在2種開發(fā)方式: 1)舊版本mybatis執(zhí)行的方式(了解即可); 2)動(dòng)態(tài)代理實(shí)現(xiàn)操縱數(shù)據(jù)庫(掌握);核心步驟 1)接口與xml映射文件綁定;接口名稱與xml映射文件命名空間要一致;接口方法與xml中crud標(biāo)簽ID要一致; 2)通過SqlSession獲取代理對(duì)象;eg:sqlSession.getMapper(接口);3.2 測:建接口UserMapper、綁定接口和映射文件、獲取接口動(dòng)態(tài)代理對(duì)象完成查詢
推薦idea安裝插件MyBatisX小鳥,可以在接口和映射文件間跳轉(zhuǎn)?
?1)新建接口 UserMapper
public interface UserMapper {/*** 根據(jù)用戶id查詢用戶信息* @param id*/User findUserById(Integer id); }2)將接口和映射文件綁定,在映射文件中書寫SQL語句
命名空間:此處為UserMapper接口的全限定名,路徑正確可以跳轉(zhuǎn)
此處id要與UserMapper接口中對(duì)應(yīng)方法名一致,MyBatisX可以直接跳轉(zhuǎn)
resultType結(jié)果類型:寫實(shí)體類路徑(將查詢出的數(shù)據(jù)轉(zhuǎn)換為User對(duì)象)
?3.3 在3.2基礎(chǔ)上測試mybatis的dao層動(dòng)態(tài)代理
//myBatis的dao層動(dòng)態(tài)代理查詢@Testpublic void t2() throws SQLException, IOException {//加載核心配置文件,構(gòu)建會(huì)話工廠String resource="mybatis-config.xml";//路徑名字正確可以直接點(diǎn)擊進(jìn)入xmlInputStream rs = Resources.getResourceAsStream(resource);SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(rs);//獲取會(huì)話對(duì)象SqlSession sqlSession = ssf.openSession();//獲取接口代理對(duì)象UserMapper mapper = sqlSession.getMapper(UserMapper.class);//調(diào)用方法根據(jù)id查詢單個(gè)數(shù)據(jù)User user = mapper.findUserById(1);System.out.println("user = " + user);sqlSession.close();rs.close();}3.4??mybatis的dao層動(dòng)態(tài)代理查詢-原理
?3.5?mybatis動(dòng)態(tài)代理小結(jié)
1)導(dǎo)入依賴的jar mybatis.jar jdbc驅(qū)動(dòng)包 log4j.jar 2)定義pojo類型; 3)定義操縱pojo類的接口 4)定義xml映射文件,然后與接口進(jìn)行綁定4.1 xml的命名空間與接口的全限定名稱要一致;4.2 xml中的crud的標(biāo)簽id與接口中的方法名稱要一致; 5)配置核心配置文件 (1.配置數(shù)據(jù)源 2.加載xml映射文件) 6)通過SqlSessionFactoryBuilder類加載核心配置文件,構(gòu)建會(huì)話工廠; 7)通過會(huì)話工廠獲取會(huì)話對(duì)象; 8)通過會(huì)話對(duì)象調(diào)用getMapper(接口.class)獲取代理對(duì)象(正常使用接口完成數(shù)據(jù)庫的操作) 9)釋放資源,關(guān)閉連接(session.close())4、mybatis核心配置
????????mybatis-config.xml,是MyBatis的全局配置文件,包含全局配置信息,如數(shù)據(jù)庫連接參數(shù)、插件等。整個(gè)框架中只需要一個(gè)即可。 ?
參考:https://mybatis.org/mybatis-3/zh/configuration.html
?說明:上述標(biāo)簽在實(shí)際使用過程中,要嚴(yán)格遵循使用順訊,否則報(bào)錯(cuò);
4.1 properties(屬性)定義全局變量
1、通過子標(biāo)簽property設(shè)置屬性,內(nèi)部定義(不推薦);
2、加載外部的java資源文件(properties文件),外部引用(掌握);
?1)兩種使用<properties>標(biāo)簽的方式
方式1(了解即可): 1、通過properties的子標(biāo)簽設(shè)置屬性; 2、使用${key}獲取設(shè)置的屬性值;方式2(掌握): 1.通過properties標(biāo)簽 resource屬性引入加載外部properties文件?2)練習(xí)
方式1配置mayBatis-config.xml(了解即可)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><properties><!--此處name對(duì)應(yīng)dataSource標(biāo)簽中的value,使用${}獲取值--><property name="driverClass" value="com.mysql.jdbc.Driver"/><property name="dburl" value="jdbc:mysql://127.0.0.1:3306/test0908"/><property name="username" value="root"/><property name="passwd" value="123456"/></properties><environments default="development"><!--配置數(shù)據(jù)庫環(huán)境--><environment id="development"><transactionManager type="JDBC"/><!--數(shù)據(jù)源--><dataSource type="POOLED"><property name="driver" value="${driverClass}"/><property name="url" value="${dburl}"/><property name="username" value="${username}"/><property name="password" value="${passwd}"/></dataSource></environment></environments><!--引入映射文件--><mappers><mapper resource="hhy/mapper/UserMapper.xml"/></mappers> </configuration>方式2配置mayBatis-config.xml(掌握)
創(chuàng)建jdbc.properties文件
##配置參數(shù) jdbc.driverClass=com.mysql.jdbc.Driver jdbc.dburl=jdbc:mysql://127.0.0.1:3306/test0908 jdbc.userName=root jdbc.password=123456?引入jdbc.properties文件,直接取其中的值。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!-- 引入外部的properties文件 --><properties resource="jdbc.properties"/><environments default="development"><!--配置數(shù)據(jù)庫環(huán)境--><environment id="development"><transactionManager type="JDBC"/><!--數(shù)據(jù)源--><dataSource type="POOLED"><!--加載引入外部的properties文件的value值--><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.dburl}"/><property name="username" value="${jdbc.userName}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--引入映射文件--><mappers><mapper resource="hhy/mapper/UserMapper.xml"/></mappers> </configuration>4.2?settings(設(shè)置)標(biāo)簽駝峰映射、延時(shí)加載
settinngs是 MyBatis 中極為重要的調(diào)整設(shè)置,它們會(huì)改變 MyBatis 的運(yùn)行時(shí)行為。
????????settings參數(shù)有很多,先測試駝峰匹配mapUnderscoreToCamelCase,就是映射下劃線到駝峰式命名。
數(shù)據(jù)準(zhǔn)備:修改數(shù)據(jù)庫username字段名稱為user_name,并建立與pojo映射關(guān)系,配置駝峰映射,若不配置就拿不到相應(yīng)字段值。
-- 修改字段sql alter table user change username user_name varchar(30); public class User {//表:user_name --->類:userName/usernameprivate String username;...; }開啟駝峰映射,且settings標(biāo)簽要在properties標(biāo)簽后不然報(bào)錯(cuò)。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!-- 引入外部的properties文件 --><properties resource="jdbc.properties"/><!--開啟駝峰映射--><settings><!--作用:表:user_name 類:userName/username 自動(dòng)映射--><setting name="mapUnderscoreToCamelCase" value="true"/></settings><environments default="development">...</environments><!--引入映射文件--><mappers><mapper resource="hhy/mapper/UserMapper.xml"/></mappers> </configuration>4.3?typeAliases標(biāo)簽類型別名
????????類型別名是給類的全限定名稱(包名.類名) 取一個(gè)短名稱。存在的意義僅在于用來減少類完全限定名的冗余。
?可以通過設(shè)置一些短名來代替全限定名,有兩種方式:
但是使用typeAliases標(biāo)簽會(huì)和有些idea插件沖突,導(dǎo)致mapper.xml及mapper.java中的某部分爆紅,能運(yùn)行但是比較惡心,想解決需卸載free mab...插件。
例:
mybatis.xml
省略... <configuration><!-- 引入外部的properties文件 --><properties resource="jdbc.properties"/><!--開啟駝峰映射--><settings><!--作用:表:user_name 類:userName/username 自動(dòng)映射--><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><!--方式1:取別名,逐個(gè)取別名--> <!-- <typeAlias type="hhy.pojo.User" alias="user"/>--><!--如果有其他類,繼續(xù)書寫,比較麻煩--><!--方式2:package name指定要取別名的包名,為包下所有類自動(dòng)取別名--><package name="hhy.pojo"/></typeAliases><environments default="development">省略...</environments><!--引入映射文件--><mappers><mapper resource="hhy/mapper/UserMapper.xml"/></mappers> </configuration>mapper.xml:
<mapper namespace="hhy.mapper.UserMapper"><!--此處id要與UserMapper接口中對(duì)應(yīng)方法名一致,MyBatisX可以直接跳轉(zhuǎn)--><!--resultType結(jié)果類型:寫實(shí)體類路徑(將查詢出的數(shù)據(jù)轉(zhuǎn)換為User對(duì)象)--><select id="findUserById" resultType="User"><!--結(jié)果類型自動(dòng)生成,user/User都均可-->select id,user_name,birthday,sex,address from user where id = #{id}</select> </mapper>4.4?typeAliases標(biāo)簽內(nèi)置別名
????????常見的 Java 類型內(nèi)建的相應(yīng)的類型別名。均不區(qū)分大小寫,注意對(duì)基本類型名稱重復(fù)采取的特殊命名風(fēng)格。
????????基本類型別名是_基本類型名稱(不加_也可以),包裝類型別名時(shí)包裝類首字母小寫(大寫也可以);
| _byte | byte |
| _long | long |
| _short | short |
| _int | int |
| _integer | int |
| _double | double |
| _float | float |
| _boolean | boolean |
| string | String |
| byte | Byte |
| long | Long |
| short | Short |
| int | Integer |
| integer | Integer |
| double | Double |
| float | Float |
| boolean | Boolean |
| date | Date |
| decimal | BigDecimal |
| bigdecimal | BigDecimal |
| object | Object |
| map | Map |
| hashmap | HashMap |
| list | List |
| arraylist | ArrayList |
| collection | Collection |
| iterator | Iterator |
測例:根據(jù)id查詢用戶姓名返回String類型、根據(jù)name查詢用戶id返回int類型。
mapper.xml:
省略... <mapper namespace="hhy.mapper.UserMapper"><!--resultType結(jié)果類型:包裝類首字母小寫--><select id="getNameById" resultType="String"><!--string、String均可-->select user_name from user where id = #{id}</select><!--resultType結(jié)果類型:基本類型加‘_’--><select id="getIdByName" resultType="int"><!--_int、int、Int均可-->select id from user where user_name = #{userName}</select> </mapper> @Testpublic void t3() throws SQLException, IOException {//加載核心配置文件,構(gòu)建會(huì)話工廠InputStream rs = Resources.getResourceAsStream("mybatis03.xml");SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(rs);//獲取會(huì)話對(duì)象SqlSession sqlSession = ssf.openSession();//獲取接口代理對(duì)象UserMapper mapper = sqlSession.getMapper(UserMapper.class);//調(diào)用方法根據(jù)id查詢單個(gè)數(shù)據(jù)System.out.println("name = " + mapper.getNameById(1));System.out.println("櫻木花道 = " + mapper.getIdByName("櫻木花道"));sqlSession.close();rs.close();}4.5?environments?標(biāo)簽配置環(huán)境
MyBatis 可以配置成適應(yīng)多種環(huán)境,如開發(fā)、測試和生產(chǎn)環(huán)境需要有不同的配置; 但每個(gè) SqlSessionFactory 實(shí)例只能選擇其一,需進(jìn)行選擇。實(shí)際使用場景下,更多的是選擇使用spring來管理數(shù)據(jù)源,來做到環(huán)境的分離。 父標(biāo)簽: environments(環(huán)境配置)子標(biāo)簽:environment(環(huán)境變量)transactionManager(事務(wù)管理器)dataSource(數(shù)據(jù)源)例:
xml配置多環(huán)境數(shù)據(jù)源,指定development為默認(rèn)環(huán)境運(yùn)行,在SqlSessionFactoryBuilder的build方法下指定要切換數(shù)據(jù)源的標(biāo)識(shí),覆蓋默認(rèn)配置build(rs, "test"),選用test環(huán)境。
省略... <configuration><!-- 引入外部的properties文件 --><properties resource="jdbc.properties"/><!--開啟駝峰映射--><settings><!--作用:表:user_name 類:userName/username 自動(dòng)映射--><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><!--方式2:package name指定要取別名的包名,為包下所有類自動(dòng)取別名--><package name="hhy.pojo"/></typeAliases><!--現(xiàn)有三個(gè)環(huán)境,默認(rèn)development--><environments default="development"><!--配置數(shù)據(jù)庫環(huán)境--><environment id="development">省略...</environment><environment id="test"><transactionManager type="JDBC"/><!--數(shù)據(jù)源--><dataSource type="POOLED"><!--加載引入外部的properties文件的value值--><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.dburl}"/><property name="username" value="${jdbc.userName}"/><property name="password" value="${jdbc.password}"/></dataSource></environment><environment id="online">省略...</environment></environments>省略... </configuration>代碼:
@Testpublic void t3() throws SQLException, IOException {//加載核心配置文件,構(gòu)建會(huì)話工廠String resource = "mybatis04.xml";//路徑名字正確可以直接點(diǎn)擊進(jìn)入xmlInputStream rs = Resources.getResourceAsStream(resource);//不指定就走默認(rèn)數(shù)據(jù)源 // SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(rs);//在build方法下指定要切換數(shù)據(jù)源的標(biāo)識(shí),覆蓋默認(rèn)配置SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(rs, "test");//獲取會(huì)話對(duì)象SqlSession sqlSession = ssf.openSession();//獲取接口代理對(duì)象UserMapper mapper = sqlSession.getMapper(UserMapper.class);//調(diào)用方法final int 櫻木花道 = mapper.getIdByName("櫻木花道");System.out.println("櫻木花道 = " + 櫻木花道);sqlSession.close();rs.close();}4.6?mappers 標(biāo)簽映射器
mappers(映射器):UserMapper.xml====>UserMapper.java接口關(guān)聯(lián)。
作用:維護(hù)接口和映射文件之間的關(guān)系.使用方式: 1、加載XML映射文件,關(guān)聯(lián)UserMapper.java接口 【1】<mapper resource="UserMapper.xml"/> 從src下加載映射文件; 【2】<mapper url=""/> 從本地磁盤中加載映射文件,但是需要添加file:///協(xié)議 說明:如果項(xiàng)目采用基于xml的開發(fā)模式,建議使用方式1開發(fā);2、加載接口,關(guān)聯(lián)映射文件 條件:1、接口名和映射文件名保持一致;2、路徑保持一致; 【3】class:加載單獨(dú)的接口:<mapper class="hhy.mapper.UserMapper"/> 【4】批量加載class:<package name="hhy.mapper"/> 說明:如果基于注解開發(fā)的開發(fā)的話,推薦使用方式4開發(fā)推薦:
<mappers><!--通過resource屬性加載工程下相對(duì)路徑下的映射文件--><mapper resource="mapper/UserMapper.xml"/></mappers><!--package表示通過掃包加載接口,然后獲取接口名稱,就獲取了xml映射文件名稱name屬性指定接口的路徑--><package name="hhy.mapper"/>前提條件: 1.接口與映射文件名稱必須相同; 2.接口與映射文件路徑必須相同; 3.映射文件中的namespace必須與接口的全限定名稱一致;5、myBatis增刪改測例
5.1 insert標(biāo)簽
| id | 這條SQL語句的唯一標(biāo)識(shí),和接口的方法名一致 | 是 |
說明:#{username},#{birthday},#{sex},#{address} 大括號(hào)里面的值必須和pojo的實(shí)體類User類中的屬性名一致,否則會(huì)報(bào)錯(cuò)。
注意事項(xiàng):Mybatis默認(rèn)事務(wù)手動(dòng)提交,可設(shè)置事務(wù)自動(dòng)提交:
SqlSession sqlSession = sqlSessionFactory.openSession(true);
5.2 update標(biāo)簽
| id | SQL語句的唯一標(biāo)識(shí),和接口的方法名一致 | 是 |
5.3 delete標(biāo)簽
| id | SQL語句的唯一標(biāo)識(shí),和接口的方法名一致 | 是 |
5.4 增刪改查標(biāo)簽
1.select<select id="對(duì)應(yīng)接口中的方法名" resultType="pojo名默認(rèn)首字符小寫/_基本類型/jdk對(duì)象類型小寫">select * from table where id=#{任意變量}</select> 2.insert<insert id="xx">insert into table values(null,#{對(duì)應(yīng)pojo中屬性名稱},....)</insert> 3.update<update id="xxx">update table set 字段1=#{對(duì)應(yīng)pojo中屬性名稱},.... where id=#{id}</update> 4.delete<delete id="xxx">delete from table where id=#{id}</delete>5.5 mybatis.xml核心配置文件(完整標(biāo)簽示例)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!-- 引入外部的properties文件 --><properties resource="jdbc.properties"/><!--開啟駝峰映射--><settings><!--作用:表:user_name 類:userName/username 自動(dòng)映射--><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><!--方式1:取別名,逐個(gè)取別名--> <!-- <typeAlias type="hhy.pojo.User" alias="user"/>--><!--如果有其他類,繼續(xù)書寫--><!--方式2:package name指定要取別名的包名,為包下所有類自動(dòng)取別名--><package name="hhy.pojo"/></typeAliases><!--現(xiàn)有三個(gè)環(huán)境,默認(rèn)development--><environments default="development"><!--配置數(shù)據(jù)庫環(huán)境--><environment id="development"><transactionManager type="JDBC"/><!--數(shù)據(jù)源--><dataSource type="POOLED"><!--省略...--></dataSource></environment><environment id="test"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--加載引入外部的properties文件的value值--><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.dburl}"/><property name="username" value="${jdbc.userName}"/><property name="password" value="${jdbc.password}"/></dataSource></environment><environment id="online"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--省略...--></dataSource></environment></environments><!--引入映射文件--><mappers><mapper resource="hhy/mapper/UserMapper.xml"/></mappers> </configuration>6、mybatis會(huì)話工具
public class MyBatisUtil {//全局維護(hù)一個(gè)會(huì)話工廠private static SqlSessionFactory ssf;private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();//在靜態(tài)代碼塊中加載mybatis核心配置文件,初始化SqlSessionFactorystatic {String resource = "mybatis03.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);} catch (IOException e) {e.printStackTrace();}ssf = new SqlSessionFactoryBuilder().build(inputStream);}//封裝獲取動(dòng)態(tài)代理對(duì)象的方法public static <T>T getMapper(Class<T> tClass) {//獲取會(huì)話對(duì)象SqlSession sqlSession = getSqlSession();//獲取接口代理對(duì)象T mapper = sqlSession.getMapper(tClass);return mapper;}//獲取sqlSession對(duì)象public static SqlSession getSqlSession() {SqlSession sqlSession = threadLocal.get();if (sqlSession==null){sqlSession = ssf.openSession();//放回線程中 通過threadLocal為每一個(gè)線程都維護(hù)一個(gè)私有的會(huì)話對(duì)象,防止出現(xiàn)并發(fā)問題threadLocal.set(sqlSession);}return sqlSession;}//關(guān)閉資源public static void close() {//關(guān)閉會(huì)話對(duì)象SqlSession sqlSession = threadLocal.get();if (sqlSession!=null){sqlSession.close();}}//事務(wù)提交public static void commit() {SqlSession sqlSession = threadLocal.get();if (sqlSession!=null){sqlSession.commit();}}//事務(wù)回滾public static void rollback(){SqlSession sqlSession = threadLocal.get();if(sqlSession!=null){sqlSession.rollback();}} }總結(jié)
以上是生活随笔為你收集整理的java回顾:MyBatis开发、配置、标签、封装会话工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用爬虫在网站上无限制的批量爬取图片
- 下一篇: 基于msf与badusb的笔记本电脑渗透