這篇文章主要介紹“MyBatis簡單使用實(shí)例”,在日常操作中,相信很多人在MyBatis簡單使用實(shí)例問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MyBatis簡單使用實(shí)例”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
目前創(chuàng)新互聯(lián)公司已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站運(yùn)營、企業(yè)網(wǎng)站設(shè)計、都蘭網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
使用MyBatis可以分以下幾個關(guān)鍵點(diǎn)
引入MyBatis依賴
配置mybatis-config.xml配置文件
創(chuàng)建數(shù)據(jù)庫實(shí)體類與Mapper映射文件
通過SqlSessionFactoryBuilder加載配置并使用
以下按步驟寫一個單元測試:
引入依賴
org.mybatis mybatis 3.5.4 mysql mysql-connector-java 5.1.40 org.projectlombok lombok 1.16.6
編寫配置文件
mybatis-config.xml
db.properties數(shù)據(jù)庫連接配置
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/data_test?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true jdbc.username=root jdbc.password=123456
初始化數(shù)據(jù),用于后邊的單元測試。
## 部門表 CREATE TABLE `department` ( `id` int(5) NOT NULL, `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, `parent_id` int(5) NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; ## 員工表 CREATE TABLE `user_department` ( `id` int(5) NOT NULL, `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, `age` int(4) DEFAULT NULL, `default_department_id` int(5) NOT NULL, `all_department_id` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; ## 初始化部門 insert into department values (1,'部門1',null); insert into department values (2,'部門2',1); insert into department values (3,'部門3',null); ## 初始化員工 insert into user_department values (1,'張三',18,1,'2,3'); insert into user_department values (2,'李4',18,2,'1,2'); insert into user_department values (3,'王5',18,3,'3'); insert into user_department values (4,'趙6',18,1,'1');
數(shù)據(jù)庫實(shí)體類與mapper配置
/** * 業(yè)務(wù)實(shí)體對象 */ @Data @NoArgsConstructor @AllArgsConstructor public class User implements Serializable { /** 主鍵ID */ private Long id; /** 姓名 */ private String name; /** 年齡 */ private Integer age; }
UserMapper.xml 映射文件
insert into user_department (id,name,age) values (#{id},#{name},#{age}) update user_department where id = #{id} name = #{name} ,age = #{age}
mapper調(diào)用接口,方法名要到Mapper.xml文件中的配置的Id相同,否則無法映射成功。
public interface UserMapper { /** * 根據(jù)主鍵查詢 * @param id * @return */ public User byId(Long id); /** * 新增 * @param user * @return */ public void save(User user); /** * 修改 * @param user */ public void update(User user); /** * 多表關(guān)聯(lián)查詢 * @param id * @return */ public UserAndDepartment getUserAndDepartmentById(Long id); /** * 關(guān)聯(lián)查詢,有N + 1問題 * @param id * @return */ public UserAndDepartment getUserAndDepartmentById1(Long id); /** * 關(guān)聯(lián)查詢,1對多 * @param id * @return */ public UserAndDepartment getUserAndDepartmentById2(Long id); }
單元測試
package com.freecloud.plug.mybatis; import com.freecloud.common.LoggerUtil; import com.freecloud.plug.mybatis.dao.UserMapper; import com.freecloud.plug.mybatis.entity.User; import com.freecloud.plug.mybatis.entity.UserAndDepartment; 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.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; /** * @Author: maomao * @Date: 2021-04-08 11:36 */ public class MyBatisTest { private SqlSessionFactory sqlSessionFactory; @Before public void init() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } /** * 使用mybatis api 方式硬編碼方式 */ @Test public void testApiStatement(){ SqlSession sqlSession = sqlSessionFactory.openSession(); try { sqlSession.selectOne("com.freecloud.plug.mybatis.dao.UserMapper.byId",1); }finally { sqlSession.close(); } } /** * 測試使用mapper包裝直接使用接口調(diào)用 */ @Test public void testMapperInterface(){ SqlSession sqlSession = sqlSessionFactory.openSession(); try { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.byId(1L); LoggerUtil.printThread(user.toString()); }finally { sqlSession.close(); } } /** * 多表關(guān)聯(lián)查詢 */ @Test public void testUserAndDepartment(){ SqlSession sqlSession = sqlSessionFactory.openSession(); try { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); UserAndDepartment user = userMapper.getUserAndDepartmentById(1L); LoggerUtil.printThread(user.toString()); }finally { sqlSession.close(); } } /** * 關(guān)聯(lián)查詢,有N + 1問題 */ @Test public void testUserAndDepartment1(){ SqlSession sqlSession = sqlSessionFactory.openSession(); try { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); UserAndDepartment user = userMapper.getUserAndDepartmentById1(1L); LoggerUtil.printThread(user.toString()); }finally { sqlSession.close(); } } /** * 關(guān)聯(lián)查詢,1對多 */ @Test public void testUserAndDepartment2(){ SqlSession sqlSession = sqlSessionFactory.openSession(); try { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); UserAndDepartment user = userMapper.getUserAndDepartmentById2(1L); LoggerUtil.printThread(user.toString()); }finally { sqlSession.close(); } } }
使用以上例子,就可以運(yùn)行起來MyBatis??磫卧獪y試中的使用方法,分別描述了幾種常見方式。
使用傳統(tǒng)硬編碼直接通過Mapper映射器中配置的ID訪問
使用一個空接口實(shí)現(xiàn)方法調(diào)用(無實(shí)現(xiàn)類),使用sqlSession.getMapper(UserMapper.class);方式獲取實(shí)例執(zhí)行
對象關(guān)聯(lián)性查詢一對多、一對一形式
在單元測試類中我們看到了MyBatis里面的幾個核心對象:
SqlSessionFactoryBuiler
SqlSessionFactory
SqlSession
Mpper
這幾個核心對象在MyBatis的整個工作流程里面的不同環(huán)節(jié)發(fā)揮作用。如果我們不用容器,自己去管理這些對象的話,我們必須考慮一個問題:什么時候創(chuàng)建和銷毀這些對象?
在一些分布式應(yīng)用里,多線程高并發(fā)場景中,如果要寫出高效的代碼,就必須了解這四個對象的生命周期。
它是用來構(gòu)建SqlSessionFactory與解析mybatis-config等配置的,而SqlSessionFactory只需要一個,所以只要構(gòu)建了一個SqlSessionFactory之后它的使命就完成了,也就沒有存在的必要了。所以它的生命周期只存在于方法的局部。
SqlSessionFactory是用來創(chuàng)建SqlSession的,每次訪問數(shù)據(jù)庫都需要創(chuàng)建一個回話。因?yàn)槲覀円恢庇袆?chuàng)建會話的需要,所以SqlSessionFactory應(yīng)該存在于應(yīng)用的整個生命周期中(作用域是應(yīng)用作用域)。創(chuàng)建SqlSession只需要一個實(shí)例來做這件事就可以了,否則會造成混亂和資源浪費(fèi)。所以我們應(yīng)該采用單例模式。
一般工廠類在都應(yīng)該是單例模式。
SqlSession是一個會話,因?yàn)樗皇蔷€程安全的,不能在線程間共享。所以我們在請求開始的時候創(chuàng)建一個SqlSession對象,在請求結(jié)束時要及時關(guān)閉它。也可以把它理解成Jdbc 的Connection連接。
實(shí)際是Mapper是一個代理對象,是從SqlSession中獲取的。
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
它的作用是發(fā)送Sql來操作數(shù)據(jù)庫的數(shù)據(jù)。它應(yīng)該在一個SqlSession事務(wù)方法之內(nèi)。
對象 | 作用域 |
---|---|
SqlSessionFactoryBuilder | 方法局部(method) |
SqlSessionFactory | 應(yīng)用級別(application) |
SqlSession | 請求和操作(request、method) |
Mapper | 方法(method) |
以上就是四個核心對象的生命周期。
到此,關(guān)于“MyBatis簡單使用實(shí)例”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!