MyBatis―Spring 項目
目前大部分的Java 互聯網項目,都是用Spring MVC + Spring + MyBatis 搭建平台的。
使用Spring IoC 可以有效的管理各類的Java 資源,達到即插即拔的功能;通過Spring AOP 框架,數據庫事務可以委託給Spring 管理,消除很大一部分的事務代碼,配合MyBatis 的高靈活、可配置、可優化SQL 等特性,完全可以構建高性能的大型網站。
毫無疑問,MyBatis 和Spring 兩大框架已經成了Java 互聯網技術主流框架組合,它們經受住了大數據量和大批量請求的考驗,在互聯網系統中得到了廣泛的應用。使用MyBatis-Spring 使得業務層和模型層得到了更好的分離,與此同時,在Spring 環境中使用MyBatis 也更加簡單,節省了不少代碼,甚至可以不用SqlSessionFactory、 SqlSession 等對象,因為MyBatis-Spring 為我們封裝了它們。
摘自:《Java EE 互聯網輕量級框架整合開發》
第一步:創建測試工程
第一步,首先在IDEA 中新建一個名為【MybatisAndSpring】的WebProject 工程:
然後在【src】中創建4 個空包:
接著新建源文件夾【config】,用於放置各種資源配置文件:
再在【web】文件夾下新建一個【WEB-INF】默認安全文件夾,並在其下創建一個【classes】和【lib】,並將項目的輸出位置,改在【classes】下:
工程的完整初始結構如下:
第二步:引入依賴jar 包
第二步,就是要準備項目的依賴jar 包:
在【WEB-INF】文件夾下的【lib】文件夾中放置上面列舉的jar 包,然後添加依賴。
第三步:編寫Spring 配置文件
第三步,編寫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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 加載配置文件--> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置數據源--> <bean id="dataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- sqlSessionFactory --> <bean id="sqlSessionFactory"> <!-- 加載MyBatis 的配置文件--> <property name="configLocation" value="mybatis/SqlMapConfig.xml"/> <!-- 數據源--> <property name="dataSource" ref="dataSource"/> </bean></beans>第四步:編寫MyBatis 配置文件
第四步,在【mybatis】包下編寫MyBatis 的全局配置文件SqlMapConfig.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> <!-- settings --> <settings> <!-- 打開延遲加載的開關--> <setting name="lazyLoadingEnabled" value="true"/> <!-- 將積極加載改為消極加載(即按需加載) --> <setting name="aggressiveLazyLoading" value="false"/> <!-- 打開全局緩存開關(二級緩存)默認值就是true --> <setting name="cacheEnabled" value="true"/> </settings> <!-- 別名定義--> <typeAliases> <package name="cn.wmyskxz.pojo"/> </typeAliases> <!-- 加載映射文件--> <mappers> <!-- 通過resource 方法一次加載一個映射文件--> <mapper resource="sqlmap/UserMapper.xml"/> <!-- 批量加載mapper --> <package name="cn.wmyskxz.mapper"/> </mappers></configuration>
在該配置文件中:
第五步:編寫Mapper 以及其他配置文件
第五步,編寫Mapper 映射文件,這裡依然定義Mapper 映射文件的名字為“UserMapper.xml” (與SqlMapConfig.xml 中配置一致),為了測試效果,只配置了一個查詢類SQL 映射:
<?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="test"> <select id="findUserById" parameterType="_int" resultType="user"> SELECT * FROM USER WHERE id = #{id}</select></mapper>在該配置中,輸出參數的映射為“user” ,這是因為之前在SqlMapConfig.xml 中配置了“cn.wmyskxz.pojo” 包下的實體類使用別名(即首字母小寫的類名),所以這裡只需在“cn.wmyskxz.pojo” 包下,創建“finduserById” 對應的Java 實體類User:
package cn.wmyskxz.pojo;import java.io.Serializable;public class User implements Serializable { private int id; private String username; /* getter and setter */}實現Serializable 接口是為之後使用Mapper 動態代理做準備,這裡沒有使用動態代理。
在數據庫資源“db.properties” 中配置了數據庫的連接信息,以“key=value” 的形式配置,String 正是使用“${}” 獲取其中key 對應的value 配置的:
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8jdbc.username=rootjdbc.password=root
另外日誌配置和之前的配置一樣,我就直接黏貼了:
# Global logging configuration# 在開發環境下日誌級別要設置成DEBUG ,生產環境設為INFO 或ERRORlog4j.rootLogger=DEBUG, stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
第六步:編寫DAO 層
第六步,進行數據庫交互(Data Access Object)層的編寫。
由於該項目只對User 用戶查詢,所以DAO 層就只有一個類,在“cn.wmyskxz” 包下創建DAO 層的interface 接口,其中定義了findUserById 方法,參數為用戶的id 值(int 類型):
package cn.wmyskxz.dao;import cn.wmyskxz.pojo.User;public interface UserDAO { // 根據id 查詢用戶信息public User findUserById(int id) throws Exception;}然後在同一個包下創建UserDAO 接口的實現類UserDAOImpl:
package cn.wmyskxz.dao;import cn.wmyskxz.pojo.User;import org.apache.ibatis.session.SqlSession;import org.mybatis.spring.support.SqlSessionDaoSupport;public class UserDAOImpl extends SqlSessionDaoSupport implements UserDAO { @Override public User findUserById(int id) throws Exception { // 繼承SqlSessionDaoSupport 類,通過this.getSqlSession() 得到sqlSession SqlSession sqlSession = this.getSqlSession(); User user = sqlSession.selectOne("test.findUserById", id); return user; }}有幾點解釋:
<!-- 原始DAO 接口--><bean id="userDAO"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/></bean>
注意: DAO 實現類繼承了SqlSessionDaoSupport 父類後,就無須自己定義獲取SqlSession 會話實例類方法了,該父類會默認加載數據源信息並提供獲取SqlSession 類的方法。
第七步:編寫Service 測試類
在“cn.wmyskxz.test” 包下創建【UserServiceTest】測試類:
package cn.wmyskxz.test;import cn.wmyskxz.dao.UserDAO;import cn.wmyskxz.pojo.User;import org.junit.Before;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserServiceTest { private ApplicationContext applicationContext; // 在執行測試方法之前首先獲取Spring 配置文件對象// 註解@Before在執行本類所有測試方法之前先調用這個方法@Before public void setup() throws Exception { applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); } @Test public void testFindUserById() throws Exception { // 通過配置資源對象獲取userDAO 對象UserDAO userDAO = (UserDAO) applicationContext.getBean("userDAO"); // 調用UserDAO 的方法User user = userDAO.findUserById(1); // 輸出用戶信息System.out.println(user.getId() + ":" + user.getUsername()); }}運行測試方法,輸出結果如下:
動態代理+ 註解實現
上面的實例程序並沒有使用Mapper 動態代理和註解來完成,下面我們就來試試如何用動態代理和註解:
第一步:編寫UserQueryMapper
在【mapper】下新建一個【UserQueryMapper】代理接口,並使用註解:
package cn.wmyskxz.mapper;import cn.wmyskxz.pojo.User;import org.apache.ibatis.annotations.Select;public interface UserQueryMapper { @Select("SELECT * FROM USER WHERE id = #{id}") public User findUserById(int id) throws Exception;}注意: 在默認情況下,該bean 的名字為userQueryMapper(即首字母小寫)
現在有了代理類,我們需要通知Spring 在這裡來掃描到該類,Mapper 掃描配置對象需要用專門的掃描器:
<!-- Mapper 掃描器--><bean> <!-- 掃描cn.wmyskxz.mapper 包下的組件--> <property name="basePackage" value="cn.wmyskxz.mapper"/></bean>
第二步:編寫測試類
這一次我們獲取的不再是userDAO 對象,而是定義的Mapper 代理對象userQueryMapper:
package cn.wmyskxz.test;import cn.wmyskxz.mapper.UserQueryMapper;import cn.wmyskxz.pojo.User;import org.junit.Before;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserServiceTest { private ApplicationContext applicationContext; // 在執行測試方法之前首先獲取Spring 配置文件對象// 註解@Before在執行本類所有測試方法之前先調用這個方法@Before public void setup() throws Exception { applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); } @Test public void testFindUserById() throws Exception { // 通過配置資源對象獲取userDAO 對象UserQueryMapper userQueryMapper = (UserQueryMapper) applicationContext.getBean("userQueryMapper"); // 調用UserDAO 的方法User user = userQueryMapper.findUserById(1); // 輸出用戶信息System.out.println(user.getId() + ":" + user.getUsername()); }}運行測試方法,得到正確結果:
可以看到,查詢結果和之前非Mapper 代理的查詢結果一樣。
總結
以上所述是小編給大家介紹的MyBatis 與Spring 的完美整合方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!