
前情回顧
到本文,我們已經學習了 SSM 框架中的 MyBatis 和 Spring 兩大核心內容,本文介紹如何將兩者結合起來在項目中使用,這也是實際開發中常用的操作,必須掌握,下面開始擼碼~
集成步驟第一步:創建數據庫、數據表數據庫各位跟隨自己愛好建就行,數據表我這裡是 programmer,字段有這幾個:
新建基於 maven 的 Java項目,完成如下配置:
pom.xml 文件中主要是依賴:
<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.javafirst</groupId><artifactId>spring-mybatis</artifactId><version>1.0-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency><!--MySQL驅動--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version></dependency><!--MyBatis依賴--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><!--Spring依賴--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.14</version></dependency><!--MyBatis集成Spring--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.3</version></dependency><!--Spring事務--><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.3.14</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>1.2.6</version></dependency><!--阿里數據庫連接池druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency></dependencies><build><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources></build></project>以上配置基本是固定的,用到什麼依賴就在這裡配置即可。
第三步:創建實體類這個和我們之前學習過,就是創建和表中字段對應Java實體類對象,代碼如下:
packagecom.javafirst.daomain;/***desc:數據表對應的實體類*<p>*author:推薦學java*<p>*weChat:studyingJava*/publicclassProgrammer{privateIntegerid;privateStringname;privateIntegerage;publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicIntegergetAge(){returnage;}publicvoidsetAge(Integerage){this.age=age;}@OverridepublicStringtoString(){return"Programmer信息:{"+"id="+id+",name='"+name+'\''+",age="+age+'}';}}第四步:創建dao接口和mapper文件這一步其實還屬於 MyBatis 的配置,需要注意的是我這裡將接口和對應的 mapper 文件沒有放在同一個目錄(package)下,這裡不同會引起MyBatis 配置文件中給JavaBean對象起別名的配置有區別,看個人習慣,我習慣將class和xml分開。
ProgrammerDao.java 代碼如下:
/***desc:MyBatis對應的dao層,操作SQL使用*<p>*author:推薦學java*<p>*weChat:studyingJava*/publicinterfaceProgrammerDao{intaddProgrammer(Programmerprogrammer);List<Programmer>selectAllProgrammer();}這個應該不陌生,使我們學習 MyBatis 的時候用到的,這裡定義的接口,實際會映射到去執行 Mapper 中的 SQL 語句。
ProgrammerMapper.xml 代碼如下:
<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.javafirst.dao.ProgrammerDao"><insertid="addProgrammer">insertintoprogrammer(`name`,age)values(#{name},#{age})</insert><selectid="selectAllProgrammer"resultType="com.javafirst.daomain.Programmer">select*fromprogrammer</select></mapper>該類在 resource 目錄下的 mapper 文件夾下。
第五步:完成MyBatis主配置文件這個文件的位置在 resource 目錄下,名為 mybatis-config.xml ,其代碼如下:
<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--日誌--><settings><settingname="logImpl"value="STDOUT_LOGGING"/></settings><typeAliases><typeAliastype="com.javafirst.daomain.Programmer"alias="programmerDao"/><!--要求dao接口和mapper文件在同一文件夾下--><!--<packagename="com.javafirst.daomain"/>--></typeAliases><mappers><mapperresource="mapper/ProgrammerMapper.xml"/></mappers></configuration>第四步中提到的不同之處就在這裡的 <typeAliases> 標籤裡面的內容了,各位看注釋或者看往期文章就明白了。
接下來的操作就和 Spring 相關了,可能細心的同學已經有疑惑了,我們的數據源去哪了,也就是連接數據庫的配置去哪了?能想到這一點,說明我們對學過的內容記憶的很好,其實,MyBatis 和 Spring 結合使用的時候,數據源是交給 Spring容器來處理的,相對我們單獨使用 MyBatis 更簡單輕鬆了,快往下看:
第六步:創建 Service 接口和實現類定義 ProgrammerService 接口代碼如下:
publicinterfaceProgrammerService{intinsertProgrammer(Programmerprogrammer);List<Programmer>queryProgrammers();}這步操作其實就是我們學習 Spring 的流程,會動態創建 Java 對象,然後通過相關設置方式來賦值。
實現類代碼:
/***desc:*author:推薦學java*<p>*weChat:studyingJava*/publicclassProgrammerServiceImplimplementsProgrammerService{privateProgrammerDaoprogrammerDao;publicvoidsetProgrammerDao(ProgrammerDaoprogrammerDao){this.programmerDao=programmerDao;}@OverridepublicintinsertProgrammer(Programmerprogrammer){returnprogrammerDao.addProgrammer(programmer);}@OverridepublicList<Programmer>queryProgrammers(){returnprogrammerDao.selectAllProgrammer();}}這裡可以理解為代理對象的作用。
第七步:創建 Spring 的配置文件這個應該很熟悉了,名為 applicationContext.xml 在 resource 目錄下,不同前面我們使用的是,這裡的內容有所變化:
<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--使用屬性文件配置數據源中數據庫鏈接信息--><context:property-placeholderlocation="jdbc.properties"/><!--聲明數據源--><beanid="myDataSource"class="com.alibaba.druid.pool.DruidDataSource"init-method="init"destroy-method="close"><!--<propertyname="driver"value="com.mysql.jdbc.Driver"/>--><propertyname="url"value="${jdbc.url}"/><propertyname="username"value="${jdbc.username}"/><propertyname="password"value="${jdbc.password}"/></bean><!--聲明SQLSessionFactoryBean--><beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"><propertyname="dataSource"ref="myDataSource"/><propertyname="configLocation"value="classpath:mybatis-config.xml"/></bean><!--聲明MapperScannerConfigurer--><beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer"><propertyname="sqlSessionFactoryBeanName"value="sqlSessionFactory"/><!--指定包名,包名是dao接口所在的包名MapperScannerConfigurer會掃描basePackage給定包中的所有接口,把每個接口都執行一次getMapper()方法,得到每個接口的dao對象創建好的dao對象放入到spring的容器中 dao默認對象的名稱:是接口名字的首字母小寫--><propertyname="basePackage"value="com.javafirst.dao"/><!--多個包下有實體,使用,分割--><!--<propertyname="basePackage"value="com.javafirst.dao,com.javafirst.dao2"/>--></bean><!--註冊自定義Service--><beanid="programmerService"class="com.javafirst.service.impl.ProgrammerServiceImpl"><propertyname="programmerDao"ref="programmerDao"/></bean></beans>這裡其實主要有四小步工作,且這四步基本都是固定模式,我們在理解的基礎上把流程記下來就行,後面用就知道為什麼這麼寫了。
為了方便,我這裡將數據庫相關的配置信息放在了外部文件 jdbc.properties 中,這和我們前面學習 MyBatis 的時候引用外部配置文件是一樣的用法,該文件在 resource 目錄下,Spring配置文件中引用就是這裡的第一句代碼。
jdbc.properties 文件內容如下:
jdbc.url=jdbc:mysql://localhost:3306/spring_demojdbc.username=rootjdbc.password=root下面說這四小步都代表什麼意思:
到這裡其實有兩種測試可以進行,一種是測試Dao層是否能訪問數據庫,並進行相關操作,不經過我們的業務層。
@Testpublicvoidtest_addProgrammer(){Stringconfig="applicationContext.xml";ApplicationContextcontext=newClassPathXmlApplicationContext(config);ProgrammerDaoprogrammerDao=(ProgrammerDao)context.getBean("programmerDao");Programmerprogrammer=newProgrammer();programmer.setName("王重陽");programmer.setAge(102);programmerDao.addProgrammer(programmer);}這一步測試不需要我們前面配置中的自定義Service 即可進行。需要注意的是Spring中添加記錄,已經不需要我們手動commit() 了。
第二種測試,就是我們 Spring 和 MyBatis 集成後的測試,代碼如下:
@Testpublicvoidtest_addProgrammer_spring(){Stringconfig="applicationContext.xml";ApplicationContextcontext=newClassPathXmlApplicationContext(config);ProgrammerServiceprogrammerService=(ProgrammerService)context.getBean("programmerService");Programmerprogrammer=newProgrammer();programmer.setName("周伯通");programmer.setAge(112);introw=programmerService.insertProgrammer(programmer);System.out.println("插入結果:"+row);}結果大家自行驗證,看下數據表中這裡插入的值:

我們還定義了一個查詢功能,測試代碼如下:
/***Spring方式查詢記錄*/@Testpublicvoidtest_selectProgrammers_spring(){Stringconfig="applicationContext.xml";ApplicationContextcontext=newClassPathXmlApplicationContext(config);ProgrammerServiceprogrammerService=(ProgrammerService)context.getBean("programmerService");List<Programmer>programmers=programmerService.queryProgrammers();System.out.println("查詢結果:"+programmers);}結果各位自己驗證哈,一般前面流程跑通,到這裡不會有問題。
最後,再看下我的項目結構:

本文將前面學習的 MyBatis 和 Spring 結合起來使用,掌握其流程和原理很重要,其實思考一下,結合起來反倒簡單多了,可能第一次接觸的時候,被各種流程性的東西搞的有點懵,但這並不妨礙我們後面的順利上手。
學編程,推薦首選Java語言,小編創建了一個專注Java的原創公眾號推薦學java,各位可以在微信搜索javaFirst 關注,一起開啟Java旅途!
推薦學java——Spring之AOP
推薦學java——Spring第一課
推薦學java——MyBatis高級
推薦學Java——第一個MyBatis程序