Mybatis和其他主流框架的整合使用過程詳解
Mybatis簡介
MyBatis歷史
- MyBatis最初是Apache的一個開源項目iBatis, 2010年6月這個項目由Apache Software Foundation遷移到了Google Code。隨著開發(fā)團隊轉(zhuǎn)投Google Code旗下,iBatis3.x正式更名為MyBatis。代碼于2013年11月遷移到Github
- iBatis一詞來源于“internet”和“abatis”的組合,是一個基于Java的持久層框架。iBatis提供的持久層框架包括SQL Maps和Data Access Objects(DAO)
MyBatis特性
- MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的持久層框架
- MyBatis 避免了幾乎所有的 JDBC 代碼和手動設(shè)置參數(shù)以及獲取結(jié)果集
- MyBatis可以使用簡單的XML或注解用于配置和原始映射,將接口和Java的POJO(Plain Old Java Objects,普通的Java對象)映射成數(shù)據(jù)庫中的記錄
- MyBatis 是一個 半自動的ORM(Object Relation Mapping)框架
1、在Maven項目中使用Mybatis
先創(chuàng)建一個普通的Maven項目,然后在pom.xml文件中引入Mybatis的依賴,因為要連接數(shù)據(jù)庫,所以還需要引入數(shù)據(jù)庫連接的依賴
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> </dependencies>
要使用Mybatis需要配置Mybatis的核心配置,在resources資源文件夾下創(chuàng)建一個mybatis配置文件(名字隨意),并寫入配置,配置參考Mybatis官方文檔mybatis – MyBatis 3 | 入門
在數(shù)據(jù)源<dataSource>的配置中,配置好driver,url,username,password
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3307/mybatis"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!--<mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers>--> </configuration>
習(xí)慣上命名為mybatis-config.xml
,這個文件名僅僅只是建議,并非強制要求。將來整合Spring之后,這個配置文件可以省略,所以大家操作時可以直接復(fù)制、粘貼。 核心配置文件主要用于配置連接數(shù)據(jù)庫的環(huán)境以及MyBatis的全局配置信息 核心配置文件存放的位置是src/main/resources目錄下
現(xiàn)在需要一個數(shù)據(jù)庫和表和一些數(shù)據(jù)用做連接測試
CREATE DATABASE IF NOT EXISTS `mybatis` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE USER( `id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID', `name` VARCHAR(100) COMMENT '姓名', `age` TINYINT UNSIGNED COMMENT '年齡', `gender` TINYINT UNSIGNED COMMENT '性別, 1:男, 2:女', `phone` VARCHAR(11) COMMENT '手機號' ) COMMENT '用戶表'; INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'白眉鷹王',55,'1','18800000000'); INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'金毛獅王',45,'1','18800000001'); INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'青翼蝠王',38,'1','18800000002'); INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'紫衫龍王',42,'2','18800000003'); INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'光明左使',37,'1','18800000004'); INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'光明右使',48,'1','18800000005');
構(gòu)建整體項目結(jié)構(gòu)controller、service、mapper三層架構(gòu),創(chuàng)建一個實體類對應(yīng)數(shù)據(jù)庫的表結(jié)構(gòu),創(chuàng)建MyBatis的映射文件xxxMapper.xml
映射文件的命名規(guī)則
- 表所對應(yīng)的實體類的類名+Mapper.xml
- 例如:表t_user,映射的實體類為User,所對應(yīng)的映射文件為UserMapper.xml
- 因此一個映射文件對應(yīng)一個實體類,對應(yīng)一張表的操作
- MyBatis映射文件用于編寫SQL,訪問以及操作表中的數(shù)據(jù)
- MyBatis映射文件存放的位置是src/main/resources/mappers目錄下
在resources文件目錄下創(chuàng)建mapper的時候需要和main文件目錄下的mapper同包名,在創(chuàng)建directory的時候,目錄結(jié)構(gòu)不能使用點,而是用/代替
User實體類中的屬性需要和表中的字段名相對應(yīng),這里也可以用Lombok注解
mapper接口的全類名和映射文件的命名空間(namespace)保持一致、mapper接口中方法的方法名和映射文件中編寫SQL的標簽的id屬性保持一致
然后在mapper中寫我們需要的語句,查詢語句用<select>、增加語句用<insert>、刪除語句用<delete>、修改語句用<update>標簽,返回類型resultType要和實體類中的實體類名稱對應(yīng)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="mapper.UserMapper"> <select id="selectAll" resultType="pojo.User"> SELECT id, name, age, gender, phone FROM user </select> </mapper>
寫好了之后回到mybatis-config.xml中配置一下mapper映射
在UserMapper中將UserMapper.xml中配置好的方法聲明一下,方法名要和上面的id對應(yīng)上
在service層寫好業(yè)務(wù)邏輯代碼,在接口中聲明方法,在實現(xiàn)類中實現(xiàn)方法
public class UserServiceImpl implements UserService { @Override public List<User> selectAll() throws IOException { //讀取MyBatis的核心配置文件 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); //獲取SqlSessionFactoryBuilder對象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); //通過核心配置文件所對應(yīng)的字節(jié)輸入流創(chuàng)建工廠類SqlSessionFactory,生產(chǎn)SqlSession對象 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is); //獲取sqlSession,此時通過SqlSession對象所操作的sql都必須手動提交或回滾事務(wù) SqlSession sqlSession = sqlSessionFactory.openSession(); //通過代理模式創(chuàng)建UserMapper接口的代理實現(xiàn)類對象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //調(diào)用UserMapper接口中的方法,就可以根據(jù)UserMapper的全類名匹配元素文件,通過調(diào)用的方法名匹配映射文件中的SQL標簽,并執(zhí)行標簽中的SQL語句 List<User> users = mapper.selectAll(); return users; } }
在controller層中寫好處理結(jié)果代碼
public class UserController { private UserService userService = new UserServiceImpl(); public void selectAll() throws IOException { List<User> users = userService.selectAll(); users.forEach(System.out::println); } }
創(chuàng)建一個Test類去測試mybatis數(shù)據(jù)庫連接,因為沒有引入單元測試依賴,所以這里用主函數(shù)去測試
發(fā)現(xiàn)結(jié)果成功輸出打印
如果SQL語句比較簡單,可以使用mybatis中的注解,查詢語句用@Select、增加語句用@Insert、刪除語句用@Delete、修改語句用@Update注解
在里面寫上sql語句,再運行發(fā)現(xiàn),也可以查詢成功。
當(dāng)然,復(fù)雜一點的sql語句和動態(tài)SQL建議還是使用Mapper配置,只是簡單的sql語句寫在注解里面可以簡化,復(fù)雜的sql只會增加代碼的復(fù)雜度
總結(jié)
在Maven項目中,使用mybatis需要先導(dǎo)入mybatis依賴和連接數(shù)據(jù)庫的依賴,然后創(chuàng)建mybatis配置文件,在配置文件中配置數(shù)據(jù)源細信息,隨后創(chuàng)建MyBatis的映射文件Mapper,在mapper文件中寫好對應(yīng)的語句,然后在業(yè)務(wù)層進行SqlSession連接,調(diào)用mapper中的方法,再在controller層處理返回方法。
2、用Spring框架整合Mybatis
同樣的先創(chuàng)建一個Maven項目,然后在pom.xml文件中引入Spring的依賴,Mybatis的依賴,數(shù)據(jù)庫連接依賴,druid連接池依賴,spring-mybatis依賴,spring-jdbc依賴。
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.30</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.20</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.2</version> </dependency> </dependencies>
構(gòu)建整體項目結(jié)構(gòu)
2.1、基于XML整合Mybatis
- 導(dǎo)入Mybatis整合Spring的相關(guān)坐標
- 編寫Mapper和Mapper.xml
- 配置SqlSessionFactoryBean和MapperScannerConfigurer
- 編寫測試代碼
和上面步驟相同,編寫Mapper和Mapper.xml,一定要放在相同路徑下
在UserMapper.xml中寫我們需要的語句,并在UserMapper接口中寫對應(yīng)id的方法聲明;
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="mapper.UserMapper"> <select id="selectAll" resultType="pojo.User"> SELECT id, name, age, gender, phone FROM user </select> </mapper>
public interface UserMapper { List<User> selectAll(); }
同樣的,簡單的SQL語句也可以用@Select注解編寫,不需要UserMapper.xml配置
在Spring配置文件中配置SqlSessionFactoryBean
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--配置SqlSessionFactoryBean,作用將SqlSessionFactory存儲到spring容器--> <bean class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> </bean> <!--配置數(shù)據(jù)源信息--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3307/mybatis"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> </beans>
對應(yīng)的是之前配置文件中的
<dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3307/mybatis"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource>
在Spring配置文件中配置MapperScannerConfigurer
<!--MapperScannerConfigurer,作用掃描指定的包,產(chǎn)生Mapper對象存儲到Spring容器--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="mapper"></property> </bean>
對應(yīng)的是
<mappers> <package name="com.tedu.mapper"/> </mappers>
在Spring配置文件中配置好之后,在使用的時候就不用手動創(chuàng)建了,直接注入即可。
在UserServiceImpl屬性中添加UserMapper,并為其添加setter方法用于注入。
public class UserServiceImpl implements UserService { private UserMapper userMapper; public void setUserMapper(UserMapper userMapper) { this.userMapper = userMapper; } @Override public List<User> selectAll() { return userMapper.selectAll(); } }
同樣,在UserController屬性中添加UserService,并為其添加setter方法用于注入。在selectAll方法中處理返回的結(jié)果。
public class UserController { private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } public void selectAll(){ List<User> users = userService.selectAll(); users.forEach(System.out::println); } }
在Spring配置文件中配置上述UserService和UserController用于注入
<bean id="userServiceImpl" class="service.impl.UserServiceImpl"> <property name="userMapper" ref="userMapper"></property> </bean> <bean id="userContorller" class="controller.UserController"> <property name="userService" ref="userServiceImpl"></property> </bean>
最后創(chuàng)建一個測試類進行數(shù)據(jù)庫連接測試
public class TestSelectAll { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("application.xml"); UserController userController = context.getBean(UserController.class); userController.selectAll(); } }
可以在控制臺看到打印的結(jié)果
總結(jié)
基于XML方式整合Mybatis首先需要創(chuàng)建Spring的配置文件,在XML配置文件中去配置bean,將bean對象交由Spring容器管理,其余的mapper和普通方法一樣。需要配置數(shù)據(jù)源DataSource,配置SqlSessionFactoryBean、配置MapperScannerConfigurer,再配置UserMapper、UserService和UserController。在測試類中用ClassPathXmlApplicationContext和getBean獲取到UserContorller對象再調(diào)用其方法即可。這種方式不用編寫mybatis-config.xml配置文件,在Spring配置文件中全部配置了,雖然簡化了部分操作,但是還是較為繁瑣,下面講一種用注解方式整合mybatis。
2.2、基于注解整合Mybatis
導(dǎo)入和上述基于XML整合mybatis方法相同的依賴
再構(gòu)建同樣的項目結(jié)構(gòu)
還需要在resources資源目錄下面添加一個配置文件用于存放數(shù)據(jù)源配置信息
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=root
jdbc.url=jdbc:mysql://localhost:3307/mybatis
除了像上面方法構(gòu)建的項目結(jié)構(gòu)之外,還需要一個配置類進行配置
@Configuration @ComponentScan("cn.test") @PropertySource("classpath:jdbc.properties") @MapperScan("cn.test.mapper") public class MybatisConfig { @Bean public DataSource dataSource( @Value("${jdbc.driver}") String driver, @Value("${jdbc.username}") String username, @Value("${jdbc.password}") String passwrod, @Value("${jdbc.url}") String url ){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driver); dataSource.setUsername(username); dataSource.setPassword(passwrod); dataSource.setUrl(url); return dataSource; } @Bean public SqlSessionFactoryBean sqlSessionFactoryBean(@Autowired DataSource dataSource){ SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); return sqlSessionFactoryBean; } }
@Configuration注解是聲明該類是一個配置類
@ComponentScan注解是包掃描,掃描該包和該包的子孫包中的類帶有@Component注解的類,交由Spring容器管理
@PropertySource注解是設(shè)置資源文件目錄,classpath后是properties文件的路徑,加載后可以用${}占位符獲取properties文件中的屬性
@MapperScan注解是設(shè)置Mapper文件掃描,相當(dāng)于mybatis配置文件中<mapper>標簽
配置文件中用@Bean注解配置非自定義Bean的配置,在dataSource方法中傳入連接數(shù)據(jù)庫四要素并且用@Value注解去注入值,其中用${}占位符獲取properties文件中的屬性,最后方法返回dataSource,同樣的用sqlSessionFactoryBean方法sqlSessionFactoryBean,在參數(shù)中用@AutoWried注入dataSource參數(shù),其中@AuroWired注解可省略,最后方法返回sqlSessionFactoryBean。
這樣,在Config配置文件中就完成了SqlSessionFactoryBean和MapperScannerConfigurer的配置
接下來就是編寫UserMapper和UserMapper.xml文件,這里就不在用XML配置文件進行演示,如需要,上面的其他方法都有演示,這里就用注解的方式編寫SQL語句。
隨后,編寫三層架構(gòu)的代碼,在UserController中,用@AuroWired注解自動注入UserService,并且在類上加上@Controller注解,表示該類是Contriller層類并交由Spring容器管理
@Controller public class UserController { @Autowired private UserService userService; public void findAll() { List<User> all = userService.findAll(); all.forEach(System.out::println); } }
在UserServiceImpl中用,@AuroWired注解自動注入UserMapper,并且在類上加上@Service注解,表示該類是Service層類并交由Spring容器管理
@Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List<User> findAll() { return userMapper.findAll(); } }
在UserMapper中,編寫SQL方法,用@Select注解編寫SQL語句,因為在配置文件中加了@MapperScan("cn.test.mapper")注解,所以在此類上不需要加任何Component注解
public interface UserMapper { @Select("SELECT id, name, age, gender, phone FROM user") List<User> findAll(); }
最后,編寫測試方法進行數(shù)據(jù)庫連接測試
public class TestAnnoMyBatis { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(MybatisConfig.class); UserController userController = context.getBean(UserController.class); userController.findAll(); } }
在測試方法中用AnnotationConfigApplicationContext方法加載MybatisConfig配置文件,同樣在控制臺中可以看到成功輸出結(jié)果
總結(jié)
基于注解整合Mybatis方法中,我們不需要配置任何XML文件,其他操作基本相同,只需要新增一個配置文件,在配置文件中用一些注解和方法去完成配置。同時,在管理Bean時,也是用注解去自動裝配,交由Spring容器去管理。大大簡化了配置。
3、SpringBoot整合Mybatis
用SpringBoot框架整合Mybatis相對就較為簡單了
首先創(chuàng)建于一個SpringBoot項目
在勾選依賴的時候,需要勾選MyBatisFarmework依賴和MySql依賴進行數(shù)據(jù)的連接和Mybatis的使用
創(chuàng)建完成之后在application.properties配置文件中配置數(shù)據(jù)源
spring.datasource.url=jdbc:mysql://localhost:3307/mybatis?serverTimezone=Asia/Shanghai&characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
然后在UserMapper中開始寫SQL語句
@Mapper public interface UserMapper { @Select("SELECT id, name, age, gender, phone FROM user") List<User> userList(); }
一定要在UserMapper類上加上@Mapper注解,@Mapper注解是識別他為mybatis的mapper接口,會自動的把 加@Mapper 注解的接口生成動態(tài)代理類。
同樣的,在UserService中用@AutoWired對UserMapper進行注入,并在該類上加上@Service注解
@Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; public List<User> userList(){ return userMapper.userList(); } }
在UserController中用@AutoWired對UserService進行注入并處理返回的結(jié)果,并在該類上加上@Controiller注解
@Controller public class UserController { @Autowired private UserService userService; public void userList(){ List<User> users = userService.userList(); users.forEach(System.out::println); } }
最后在SpringBoot的測試類中寫一個測試方法進行數(shù)據(jù)庫連接的測試
@SpringBootTest class SpringBootMybatisApplicationTests { @Autowired private UserController userController; @Test public void test(){ userController.userList(); } }
可以看到控制臺成功輸出結(jié)果
總結(jié)
使用SpringBoot框架整合Mybatis更為簡單,只需要在application.properties配置文件中配置數(shù)據(jù)源四要素就行,隨后就可以直接在Mapper中寫SQL語句,最后可以在SpringBootTest類中直接進行測試。
到此這篇關(guān)于Mybatis和其他主流框架的整合使用的文章就介紹到這了,更多相關(guān)Mybatis框架的整合使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 中Json中既有對象又有數(shù)組的參數(shù)如何轉(zhuǎn)化成對象(推薦)
Gson庫是一個功能強大、易于使用的Java序列化/反序列化庫,它提供了豐富的API來支持Java對象和JSON之間的轉(zhuǎn)換,這篇文章主要介紹了Java 中Json中既有對象又有數(shù)組的參數(shù)如何轉(zhuǎn)化成對象,需要的朋友可以參考下2024-07-07Spingboot?JPA?CriteriaBuilder?如何獲取指定字段
這篇文章?主要介紹了Spingboot?JPA?CriteriaBuilder?如何獲取指定字段,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12Spring Boot 開發(fā)私有即時通信系統(tǒng)(WebSocket)
本文利用Spring Boot作為基礎(chǔ)框架,Spring Security作為安全框架,WebSocket作為通信框架,實現(xiàn)點對點聊天和群聊天2017-04-04Java中for、foreach、stream區(qū)別和性能比較詳解
for、foreach、stream都可以循環(huán)處理數(shù)據(jù),如果單純當(dāng)循環(huán)使用,for、foreach、stream哪個性能更好,這篇文章主要給大家介紹了關(guān)于Java中for、foreach、stream區(qū)別和性能的相關(guān)資料,需要的朋友可以參考下2024-03-03struts2中通過json傳值解決亂碼問題的實現(xiàn)方法
這篇文章主要介紹了struts2中通過json傳值解決亂碼問題的實現(xiàn)方法,涉及js編碼及java解碼的相關(guān)操作技巧,需要的朋友可以參考下2016-06-06