Mybatis簡介 MyBatis歷史 MyBatis最初是Apache的一個開源項目iBatis, 2010年6月這個項目由Apache Software Foundation遷移到了Google Code。隨著開發團隊轉投Google Code旗下,iBatis3.x正式更名為MyBatis。代 ...
MyBatis歷史
-
MyBatis最初是Apache的一個開源項目iBatis, 2010年6月這個項目由Apache Software Foundation遷移到了Google Code。隨著開發團隊轉投Google Code旗下,iBatis3.x正式更名為MyBatis。代碼於2013年11月遷移到Github
-
iBatis一詞來源於“internet”和“abatis”的組合,是一個基於Java的持久層框架。iBatis提供的持久層框架包括SQL Maps和Data Access Objects(DAO)
MyBatis特性
-
MyBatis 是支持定製化 SQL、存儲過程以及高級映射的優秀的持久層框架
-
MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集
-
MyBatis可以使用簡單的XML或註解用於配置和原始映射,將介面和Java的POJO(Plain Old Java Objects,普通的Java對象)映射成資料庫中的記錄
-
1 <dependencies> 2 <dependency> 3 <groupId>org.mybatis</groupId> 4 <artifactId>mybatis</artifactId> 5 <version>3.5.10</version> 6 </dependency> 7 <dependency> 8 <groupId>mysql</groupId> 9 <artifactId>mysql-connector-java</artifactId> 10 <version>8.0.33</version> 11 </dependency> 12 </dependencies>
要使用Mybatis需要配置Mybatis的核心配置,在resources資源文件夾下創建一個mybatis配置文件(名字隨意),並寫入配置,配置參考Mybatis官方文檔mybatis – MyBatis 3 | 入門
在數據源<dataSource>的配置中,配置好driver,url,username,password
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "https://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <environments default="development"> 7 <environment id="development"> 8 <transactionManager type="JDBC"/> 9 <dataSource type="POOLED"> 10 <property name="driver" value="com.mysql.cj.jdbc.Driver"/> 11 <property name="url" value="jdbc:mysql://localhost:3307/mybatis"/> 12 <property name="username" value="root"/> 13 <property name="password" value="root"/> 14 </dataSource> 15 </environment> 16 </environments> 17 <!--<mappers> 18 <mapper resource="org/mybatis/example/BlogMapper.xml"/> 19 </mappers>--> 20 </configuration>
現在需要一個資料庫和表和一些數據用做連接測試
1 CREATE DATABASE IF NOT EXISTS `mybatis` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 2 3 CREATE TABLE USER( 4 `id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID', 5 `name` VARCHAR(100) COMMENT '姓名', 6 `age` TINYINT UNSIGNED COMMENT '年齡', 7 `gender` TINYINT UNSIGNED COMMENT '性別, 1:男, 2:女', 8 `phone` VARCHAR(11) COMMENT '手機號' 9 ) COMMENT '用戶表'; 10 11 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'白眉鷹王',55,'1','18800000000'); 12 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'金毛獅王',45,'1','18800000001'); 13 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'青翼蝠王',38,'1','18800000002'); 14 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'紫衫龍王',42,'2','18800000003'); 15 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'光明左使',37,'1','18800000004'); 16 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'光明右使',48,'1','18800000005');
構建整體項目結構controller、service、mapper三層架構,創建一個實體類對應資料庫的表結構,創建MyBatis的映射文件xxxMapper.xml
-
-
表所對應的實體類的類名+Mapper.xml
-
例如:表t_user,映射的實體類為User,所對應的映射文件為UserMapper.xml
-
因此一個映射文件對應一個實體類,對應一張表的操作
-
MyBatis映射文件用於編寫SQL,訪問以及操作表中的數據
-
在resources文件目錄下創建mapper的時候需要和main文件目錄下的mapper同包名,在創建directory的時候,目錄結構不能使用點,而是用/代替
User實體類中的屬性需要和表中的欄位名相對應,這裡也可以用Lombok註解
然後在mapper中寫我們需要的語句,查詢語句用<select>、增加語句用<insert>、刪除語句用<delete>、修改語句用<update>標簽,返回類型resultType要和實體類中的實體類名稱對應
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 6 <mapper namespace="mapper.UserMapper"> 7 8 <select id="selectAll" resultType="pojo.User"> 9 SELECT id, name, age, gender, phone FROM user 10 </select> 11 </mapper>
寫好了之後回到mybatis-config.xml中配置一下mapper映射
在UserMapper中將UserMapper.xml中配置好的方法聲明一下,方法名要和上面的id對應上
在service層寫好業務邏輯代碼,在介面中聲明方法,在實現類中實現方法
1 public class UserServiceImpl implements UserService { 2 3 @Override 4 public List<User> selectAll() throws IOException { 5 //讀取MyBatis的核心配置文件 6 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); 7 //獲取SqlSessionFactoryBuilder對象 8 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); 9 //通過核心配置文件所對應的位元組輸入流創建工廠類SqlSessionFactory,生產SqlSession對象 10 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is); 11 //獲取sqlSession,此時通過SqlSession對象所操作的sql都必須手動提交或回滾事務 12 SqlSession sqlSession = sqlSessionFactory.openSession(); 13 //通過代理模式創建UserMapper介面的代理實現類對象 14 UserMapper mapper = sqlSession.getMapper(UserMapper.class); 15 //調用UserMapper介面中的方法,就可以根據UserMapper的全類名匹配元素文件,通過調用的方法名匹配映射文件中的SQL標簽,並執行標簽中的SQL語句 16 List<User> users = mapper.selectAll(); 17 return users; 18 } 19 }
在controller層中寫好處理結果代碼
1 public class UserController { 2 private UserService userService = new UserServiceImpl(); 3 4 public void selectAll() throws IOException { 5 List<User> users = userService.selectAll(); 6 users.forEach(System.out::println); 7 } 8 }
創建一個Test類去測試mybatis資料庫連接,因為沒有引入單元測試依賴,所以這裡用主函數去測試
發現結果成功輸出列印
如果SQL語句比較簡單,可以使用mybatis中的註解,查詢語句用@Select、增加語句用@Insert、刪除語句用@Delete、修改語句用@Update註解
在裡面寫上sql語句,再運行發現,也可以查詢成功。
當然,複雜一點的sql語句和動態SQL建議還是使用Mapper配置,只是簡單的sql語句寫在註解裡面可以簡化,複雜的sql只會增加代碼的複雜度
總結
在Maven項目中,使用mybatis需要先導入mybatis依賴和連接資料庫的依賴,然後創建mybatis配置文件,在配置文件中配置數據源細信息,隨後創建MyBatis的映射文件Mapper,在mapper文件中寫好對應的語句,然後在業務層進行SqlSession連接,調用mapper中的方法,再在controller層處理返回方法。
2、用Spring框架整合Mybatis
1 <dependencies> 2 <dependency> 3 <groupId>org.mybatis</groupId> 4 <artifactId>mybatis</artifactId> 5 <version>3.5.10</version> 6 </dependency> 7 <dependency> 8 <groupId>mysql</groupId> 9 <artifactId>mysql-connector-java</artifactId> 10 <version>8.0.33</version> 11 </dependency> 12 <dependency> 13 <groupId>org.springframework</groupId> 14 <artifactId>spring-context</artifactId> 15 <version>5.3.30</version> 16 </dependency> 17 <dependency> 18 <groupId>com.alibaba</groupId> 19 <artifactId>druid</artifactId> 20 <version>1.2.20</version> 21 </dependency> 22 <dependency> 23 <groupId>org.mybatis</groupId> 24 <artifactId>mybatis-spring</artifactId> 25 <version>1.3.2</version> 26 </dependency> 27 <dependency> 28 <groupId>org.springframework</groupId> 29 <artifactId>spring-jdbc</artifactId> 30 <version>5.3.2</version> 31 </dependency> 32 </dependencies>
構建整體項目結構
2.1、基於XML整合Mybatis
- 導入Mybatis整合Spring的相關坐標
- 編寫Mapper和Mapper.xml
- 配置SqlSessionFactoryBean和MapperScannerConfigurer
- 編寫測試代碼
和上面步驟相同,編寫Mapper和Mapper.xml,一定要放在相同路徑下
在UserMapper.xml中寫我們需要的語句,併在UserMapper介面中寫對應id的方法聲明;
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 6 <mapper namespace="mapper.UserMapper"> 7 8 <select id="selectAll" resultType="pojo.User"> 9 SELECT id, name, age, gender, phone FROM user 10 </select> 11 </mapper>
public interface UserMapper { List<User> selectAll(); }
同樣的,簡單的SQL語句也可以用@Select註解編寫,不需要UserMapper.xml配置
在Spring配置文件中配置SqlSessionFactoryBean
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <!--配置SqlSessionFactoryBean,作用將SqlSessionFactory存儲到spring容器--> 7 <bean class="org.mybatis.spring.SqlSessionFactoryBean"> 8 <property name="dataSource" ref="dataSource"></property> 9 </bean> 10 11 <!--配置數據源信息--> 12 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> 13 <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property> 14 <property name="url" value="jdbc:mysql://localhost:3307/mybatis"></property> 15 <property name="username" value="root"></property> 16 <property name="password" value="root"></property> 17 </bean> 18 </beans>
對應的是之前配置文件中的
1 <dataSource type="POOLED"> 2 <property name="driver" value="com.mysql.cj.jdbc.Driver"/> 3 <property name="url" value="jdbc:mysql://localhost:3307/mybatis"/> 4 <property name="username" value="root"/> 5 <property name="password" value="root"/> 6 </dataSource>
在Spring配置文件中配置MapperScannerConfigurer
1 <!--MapperScannerConfigurer,作用掃描指定的包,產生Mapper對象存儲到Spring容器--> 2 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 3 <property name="basePackage" value="mapper"></property> 4 </bean>
對應的是
1 <mappers> 2 <package name="com.tedu.mapper"/> 3 </mappers>
在Spring配置文件中配置好之後,在使用的時候就不用手動創建了,直接註入即可。
在UserServiceImpl屬性中添加UserMapper,併為其添加setter方法用於註入。
1 public class UserServiceImpl implements UserService { 2 private UserMapper userMapper; 3 4 public void setUserMapper(UserMapper userMapper) { 5 this.userMapper = userMapper; 6 } 7 8 @Override 9 public List<User> selectAll() { 10 return userMapper.selectAll(); 11 } 12 }
同樣,在UserController屬性中添加UserService,併為其添加setter方法用於註入。在selectAll方法中處理返回的結果。
1 public class UserController { 2 private UserService userService; 3 4 public void setUserService(UserService userService) { 5 this.userService = userService; 6 } 7 8 public void selectAll(){ 9 List<User> users = userService.selectAll(); 10 users.forEach(System.out::println); 11 } 12 }
在Spring配置文件中配置上述UserService和UserController用於註入
1 <bean id="userServiceImpl" class="service.impl.UserServiceImpl"> 2 <property name="userMapper" ref="userMapper"></property> 3 </bean> 4 5 <bean id="userContorller" class="controller.UserController"> 6 <property name="userService" ref="userServiceImpl"></property> 7 </bean>
最後創建一個測試類進行資料庫連接測試
1 public class TestSelectAll { 2 public static void main(String[] args) { 3 ApplicationContext context = new ClassPathXmlApplicationContext("application.xml"); 4 UserController userController = context.getBean(UserController.class); 5 userController.selectAll(); 6 } 7 }
可以在控制台看到列印的結果