這篇文章主要介紹“MyBatis集成方法是什么”,在日常操作中,相信很多人在MyBatis集成方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”MyBatis集成方法是什么”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
站在用戶的角度思考問題,與客戶深入溝通,找到固安網(wǎng)站設(shè)計(jì)與固安網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋固安地區(qū)。
MyBaits
是一個(gè)著名的持久層框架,本文首先介紹了MyBatis
的簡單使用,接著與Spring
進(jìn)行整合,最后簡單地使用了Generator
去自動(dòng)生成代碼。
MyBatis
簡介MyBatis
本來是Apache
的一個(gè)開源項(xiàng)目——iBatis
,2010年由Apaceh Software Foundation
遷移到了Google Code
,并改名為MyBatis
。
MyBatis
是一個(gè)基于Java
的持久層框架,提供的持久層框架包括SQL Maps
和Data Access Objects
,使用簡單的XML
或者注解用于配置映射,將接口和POJO
映射成數(shù)據(jù)庫中的記錄,是一個(gè)小巧、方便、高效、簡單、直接、半自動(dòng)化的持久層框架。
上圖:
讀取配置文件:mybatis-config.xml
是全局MyBatis
配置文件,配置了MyBatis
運(yùn)行環(huán)境信息
加載映射文件:也就是SQL
映射文件,配置了操作數(shù)據(jù)庫的SQL
語句
構(gòu)造會(huì)話工廠:通過配置文件構(gòu)造會(huì)話工廠SqlSessionFactory
創(chuàng)建會(huì)話對(duì)象:由上一步的會(huì)話工廠創(chuàng)建會(huì)話對(duì)象SqlSession
獲取MapperStatement
:通過用戶調(diào)用的api
的Statement ID
獲取MapperStatement
對(duì)象
輸入?yún)?shù)映射:通過Executor
對(duì)MapperStatement
進(jìn)行解析,將各種Java
基本類型轉(zhuǎn)化為SQL
操作語句中的類型
輸出結(jié)果映射:JDBC
執(zhí)行SQL
后,借助MapperStatement
的映射關(guān)系將返回結(jié)果轉(zhuǎn)化為Java
基本類型并返回
MyBatis
示例首先先來看一下純MyBaits
的示例,沒有整合Spring
,一個(gè)簡單的Maven
工程,項(xiàng)目結(jié)構(gòu)如下:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> <!--驅(qū)動(dòng)用的是MySQL,版本請(qǐng)自行修改--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency>
Gradle
:
compile group: 'org.mybatis', name: 'mybatis', version: '3.5.5' compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.21'
@Setter @Getter @Builder public class User { private Integer id; private String name; @Override public String toString() { return "id:"+id+"\tname:"+name; } }
新建一個(gè)叫UserMapper.xml
的映射文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="UserMapper"> <select id="selectById" parameterType="Integer" resultType="pers.entity.User"> select * from user where id=#{id} </select> <select id="selectAll" resultType="pers.entity.User"> select * from user </select> <insert id="insert" parameterType="pers.entity.User"> INSERT INTO `user` (`id`,`name`) VALUES (#{id},#{name}) </insert> <update id="update" parameterType="pers.entity.User"> UPDATE `user` set `name`=#{name} where id=#{id} </update> <delete id="delete" parameterType="Integer"> DELETE FROM `user` WHERE `id` = #{id} </delete> </mapper>
映射文件是一個(gè)XML
文件,根元素為<mapper>
,需要注意其中的namespace
屬性,調(diào)用的時(shí)候通過該namespace
調(diào)用。其中的子元素表示SQL
語句:
<select>
:查詢,id
指定了這條語句的id
號(hào),調(diào)用時(shí)通過namespace.id
的方式調(diào)用,比如該條select
需要通過UserMapper.selectById
調(diào)用,parameterType
指定參數(shù)類型,這里是一個(gè)Integer
的參數(shù),resultType
指定返回類型,實(shí)體類
<insert>
/<update>
/<delete>
:對(duì)應(yīng)的插入/修改/刪除語句
關(guān)于占位符:#{}
表示是占位符,相當(dāng)于傳統(tǒng)JDBC
中的?
,#{id}
表示該占位符等待接收的參數(shù)名稱為id
MyBatis
的配置文件,叫mybatis-config.xml
:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://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:3306/test"/> <property name="username" value="test"/> <property name="password" value="test"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/UserMapper.xml" /> </mappers> </configuration>
指定了數(shù)據(jù)庫的一些連接屬性還有mapper
的位置。
public class Main { public static void main(String[] args) { try { InputStream inputStream = Resources.getResourceAsStream("config/mybatis-config.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = factory.openSession(); User user = session.selectOne("UserMapper.selectById",1); System.out.println(user); User user1 = User.builder().name("test").build(); session.insert("UserMapper.insert",user1); user1.setName("222"); session.update("UserMapper.update",user1); List<User> list = session.selectList("UserMapper.selectAll"); list.forEach(System.out::println); session.delete("UserMapper.delete",1); session.commit(); session.close(); } catch (Exception e) { e.printStackTrace(); } } }
主要流程如下:
讀取配置文件:根據(jù)org.apache.ibatis.io.Resources
讀取配置文件mybatis-config.xml
,請(qǐng)注意配置文件的位置正確,這里的配置文件都放在resources
下,mybatis-config.xml
放在其中的config
下
構(gòu)建Session
:根據(jù)配置文件構(gòu)建SqlSessionFactory
后,通過openSession
創(chuàng)建Session
業(yè)務(wù)操作:通過session
的selectOne/insert/update
等進(jìn)行業(yè)務(wù)操作,這類操作帶兩個(gè)參數(shù),第一個(gè)參數(shù)是String
,表示配置文件中的SQL
語句,采用namespace.id
的形式,比如這里的UserMapper.xml
中聲明namespace
為UserMapper
,其中帶有一條id
為selectById
的select
語句,因此調(diào)用時(shí)使用UserMapper.selectById
的形式,第二個(gè)參數(shù)是一個(gè)Object
,表示要傳遞的參數(shù),也就是綁定到配置文件中對(duì)應(yīng)占位符的值
提交與關(guān)閉:業(yè)務(wù)操作完成后提交事務(wù)并關(guān)閉session
示例測試結(jié)果:
Spring
整合示例上面的例子只是為了演示MyBatis
的基本使用,沒有整合Spring
,這里的例子是把Spring
整合進(jìn)來,流程也大概差不多,項(xiàng)目結(jié)構(gòu)如下:
分為5類JAR
:
MyBatis
需要的JAR
Spring
需要的JAR
MyBatis
與Spring
整合的中間JAR
數(shù)據(jù)庫驅(qū)動(dòng)JAR
數(shù)據(jù)源JAR
完整依賴如下:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.2.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.2.9.RELEASE</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.9.RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.2.9.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.5</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.8.0</version> </dependency>
Gradle
:
compile group: 'org.springframework', name: 'spring-beans', version: '5.2.9.RELEASE' compile group: 'org.springframework', name: 'spring-context', version: '5.2.9.RELEASE' compile group: 'org.springframework', name: 'spring-core', version: '5.2.9.RELEASE' compile group: 'org.springframework', name: 'spring-tx', version: '5.2.9.RELEASE' compile group: 'org.springframework', name: 'spring-jdbc', version: '5.2.9.RELEASE' compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.21' compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.8.0' compile group: 'org.mybatis', name: 'mybatis', version: '3.5.5' compile group: 'org.mybatis', name: 'mybatis-spring', version: '2.0.5'
配置文件分為三類:
MyBatis
映射文件:編寫mapper
的地方,也就是業(yè)務(wù)需要的SQL
語句
MyBatis
全局配置文件:由于整合了Spring
,數(shù)據(jù)源的配置放在了Spring
的配置文件中,而只需要保留mapper
的查找位置
Spring
配置文件:配置數(shù)據(jù)源+事務(wù)管理+MyBaits
的sqlSssionFactory
+組件掃描
MyBatis
映射文件與上面的例子差不多,只是修改了namespace
為包名.類名
的形式:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="pers.dao.UserDao"> <select id="selectById" parameterType="Integer" resultType="pers.entity.User"> select * from user where id=#{id} </select> <select id="selectAll" resultType="pers.entity.User"> select * from user </select> <insert id="insert" parameterType="pers.entity.User"> INSERT INTO `user` (`id`,`name`) VALUES (#{id},#{name}) </insert> <update id="update" parameterType="pers.entity.User"> UPDATE `user` set `name`=#{name} where id=#{id} </update> <delete id="delete" parameterType="Integer"> DELETE FROM `user` WHERE `id` = #{id} </delete> </mapper>
namespace
需要與對(duì)應(yīng)包名的帶有@Mapper
的類配置一致。
MyBatis
配置文件<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <mappers> <mapper resource="mapper/UserMapper.xml" /> </mappers> </configuration>
Spring
配置文件<?xml version="1.0" encoding="utf-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd" > <context:component-scan base-package="pers.dao"/> <context:component-scan base-package="pers.service"/> <!--數(shù)據(jù)源--> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="test"/> <property name="password" value="test"/> <!--最大連接數(shù)+最大空閑數(shù)+初始連接數(shù)--> <property name="maxTotal" value="30"/> <property name="maxIdle" value="10"/> <property name="initialSize" value="5"/> </bean> <!--事務(wù)管理--> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--開啟事務(wù)注解--> <tx:annotation-driven transaction-manager="txManager" /> <!--創(chuàng)建SqlSessionFactory Bean--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:config/mybatis-config.xml"/> </bean> <!--注解掃描,主要用于@Mapper,會(huì)掃描basePackge下的@Mapper注解的接口并自動(dòng)裝配為MyBatis的映射接口--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="pers.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> </beans>
需要加上@Mapper
注解,表示自動(dòng)裝配為MyBatis
的映射接口,注意:
映射文件中的namespace
需要與包名.類名
對(duì)應(yīng),比如這里的包為pers.dao
,類名為UserDao
,那么映射文件中的namespace
為pers.dao.UserDao
id
需要與方法名對(duì)應(yīng),比如映射文件中的有一條select
語句的id
為selectById
,那么方法就需要命名為selectById
,且參數(shù)類型需要對(duì)應(yīng)一致
@Repository @Mapper public interface UserDao { User selectById(Integer id); List<User> selectAll(); int insert(User user); int update(User user); int delete(Integer id); }
@Service @Transactional @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MyBatisService { private final UserDao dao; public void test(){ User user = dao.selectById(13); System.out.println(user); dao.insert(User.builder().name("333").build()); dao.update(User.builder().name("88888").id(13).build()); dao.selectAll().forEach(System.out::println); dao.delete(12); dao.selectAll().forEach(System.out::println); } }
注入UserDao
后進(jìn)行簡單的測試,結(jié)果如下:
相信很多程序員也討厭寫又長又麻煩的XML
配置文件,因此,MyBatis
也提供了一個(gè)生成器插件,可以直接從表中生成實(shí)體類、dao
接口以及映射文件,可以省去很多操作。
步驟如下:
導(dǎo)入依賴
編寫Generator
配置文件
生成代碼
其實(shí)就是加入一個(gè)插件:
<build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.4.0</version> <configuration> <!-- 在控制臺(tái)打印執(zhí)行日志 --> <verbose>true</verbose> <!-- 重復(fù)生成時(shí)會(huì)覆蓋之前的文件--> <overwrite>true</overwrite> <configurationFile>src/main/resources/generatorConfig.xml</configurationFile> </configuration> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> </dependencies> </plugin> </plugins> </build>
數(shù)據(jù)庫驅(qū)動(dòng)請(qǐng)對(duì)應(yīng)修改。
至于Gradle
版請(qǐng)看Kotlin
版源碼。
這里是參考別人的配置文件,修改數(shù)據(jù)庫連接、表名、包名即可:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!-- context 是逆向工程的主要配置信息 --> <!-- id:起個(gè)名字 --> <!-- targetRuntime:設(shè)置生成的文件適用于那個(gè) mybatis 版本 --> <context id="default" targetRuntime="MyBatis3"> <!--optional,指在創(chuàng)建class時(shí),對(duì)注釋進(jìn)行控制--> <commentGenerator> <property name="suppressDate" value="true"/> <!-- 是否去除自動(dòng)生成的注釋 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--jdbc的數(shù)據(jù)庫連接 wg_insert 為數(shù)據(jù)庫名字--> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test" userId="test" password="test" /> <!--非必須,類型處理器,在數(shù)據(jù)庫類型和java類型之間的轉(zhuǎn)換控制--> <javaTypeResolver> <!-- 默認(rèn)情況下數(shù)據(jù)庫中的 decimal,bigInt 在 Java 對(duì)應(yīng)是 sql 下的 BigDecimal 類 --> <!-- 不是 double 和 long 類型 --> <!-- 使用常用的基本類型代替 sql 包下的引用類型 --> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- targetPackage:生成的實(shí)體類所在的包 --> <!-- targetProject:生成的實(shí)體類所在的硬盤位置 --> <javaModelGenerator targetPackage="pers.entity" targetProject="src/main/java"> <!-- 是否允許子包 --> <property name="enableSubPackages" value="false"/> <!-- 是否對(duì)modal添加構(gòu)造函數(shù) --> <property name="constructorBased" value="true"/> <!-- 是否清理從數(shù)據(jù)庫中查詢出的字符串左右兩邊的空白字符 --> <property name="trimStrings" value="true"/> <!-- 建立modal對(duì)象是否不可改變 即生成的modal對(duì)象不會(huì)有setter方法,只有構(gòu)造方法 --> <property name="immutable" value="false"/> </javaModelGenerator> <!-- targetPackage 和 targetProject:生成的 mapper 文件的包和位置 --> <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"> <!-- 針對(duì)數(shù)據(jù)庫的一個(gè)配置,是否把 schema 作為字包名 --> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!-- targetPackage 和 targetProject:生成的 interface 文件的包和位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="pers.dao" targetProject="src/main/java"> </javaClientGenerator> <!-- tableName是數(shù)據(jù)庫中的表名,domainObjectName是生成的JAVA模型名,后面的參數(shù)不用改,要生成更多的表就在下面繼續(xù)加table標(biāo)簽 --> <table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" /> </context> </generatorConfiguration>
雙擊生成即可:
生成了實(shí)體類、dao
接口以及mapper
文件。
到此,關(guān)于“MyBatis集成方法是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
網(wǎng)站題目:MyBatis集成方法是什么
文章出自:http://aaarwkj.com/article4/jeepie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、網(wǎng)站排名、網(wǎng)站改版、微信公眾號(hào)、定制開發(fā)、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容