涉及內(nèi)容:
- Spring 和 MyBatis 的整合
- Annotation的事務(wù)管理
- 響應(yīng)流程
需要的lib文件:
spring 版本:spring-framework-3.1.0.RELEASE
MyBatis 版本: mybatis-3.0.6
注意:請(qǐng)用這以上或是更高的版本,否則會(huì)出奇怪的錯(cuò)誤哦~
源代碼:
1. 新建Oracle數(shù)據(jù)表
- CREATE TABLE MYUSER
- (
- id VARCHAR2(10) PRIMARY KEY,
- pwd VARCHAR2(10) NOT NULL,
- NAME VARCHAR2(15) NOT NULL,
- birthday VARCHAR2(8) NOT NULL,
- salary NUMBER(10,2)
- );
2. 在com.entity包下新建UserEntity.class
- package com.entity;
-
- import java.io.Serializable;
-
- public class UserEntity implements Serializable{
- private static final long serialVersionUID = -458045724375300041L;
-
- private String userID;
- private String userPWD;
- private String userName;
- private String userBirthday;
- private String userSalary;
-
-
- public String getUserID() {
- return userID;
- }
- public void setUserID(String userID) {
- this.userID = userID;
- }
- public String getUserPWD() {
- return userPWD;
- }
- public void setUserPWD(String userPWD) {
- this.userPWD = userPWD;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getUserBirthday() {
- return userBirthday;
- }
- public void setUserBirthday(String userBirthday) {
- this.userBirthday = userBirthday;
- }
- public String getUserSalary() {
- return userSalary;
- }
- public void setUserSalary(String userSalary) {
- this.userSalary = userSalary;
- }
- }
3. 在com.dao包下新建IUserDao.java 的Interface
- package com.dao;
-
- import java.util.List;
-
- import org.springframework.stereotype.Repository;
- import org.springframework.transaction.annotation.Transactional;
-
- import com.entity.UserEntity;
-
- public interface IUserDao{
- //這里的函數(shù)名,參數(shù)與UserMapper.xml中的id相對(duì)應(yīng)。
- public UserEntity getUser(String userID);
- public List<UserEntity> getAllUser();
- public int insertUser(UserEntity user);
- public int updateUser(UserEntity user);
- public int deleteUser(String userID);
- }
4. 在com.service包下新建UserService.class
- package com.service;
-
- import java.util.List;
-
- import org.springframework.stereotype.Repository;
- import org.springframework.transaction.annotation.Transactional;
-
- import com.dao.IUserDao;
- import com.entity.UserEntity;
-
- //表明該文件需要事務(wù)
- @Transactional
- //表明該文件是一個(gè)Service
- @Service
- public class UserService{
-
- // 這個(gè)屬性由Spring幫我們注入。也就是說(shuō)我們無(wú)需寫(xiě)IUserDao userDao = new IUserDao();,Spring會(huì)幫我們new一個(gè)的
- // MyBatis幫我們管理xml與類(lèi)的映射及Dao,所以我們直接用@Autowired進(jìn)行注入就可以了
- @Autowired
- private IUserDao userDao;
-
- public IUserDao getUserDao() {
- return userDao;
- }
-
- public void setUserDao(IUserDao userDao) {
- this.userDao = userDao;
- }
-
- public UserEntity getUser(String userID) {
- return userDao.getUser(userID);
- }
-
- public List<UserEntity> getAllUser() {
- return userDao.getAllUser();
- }
-
- //表明該方法需要事務(wù)
- @Transactional
- public int insertUser(UserEntity user) {
-
- // 以下為驗(yàn)證事務(wù)而添加的
- // UserEntity user1 = new UserEntity();
- // user1.setUserID("10");
- // user1.setUserPWD("1");
- // user1.setUserName("asd");
- // user1.setUserBirthday("20120228");
- // user1.setUserSalary("15000.26");
- // userDao.insertUser(user1);
-
- return userDao.insertUser(user);
- }
-
- @Transactional
- public int updateUser(UserEntity user) {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Transactional
- public int deleteUser(String userID) {
- // TODO Auto-generated method stub
- return 0;
- }
- }
5. 在src下新建spring-configuration.xml
- <?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:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
-
- <!-- 使用apache的DBCP連接池 -->
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <!-- Connection Info -->
- <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
- <property name="url" value="jdbc:oracle:thin:@192.168.80.128:1521:ocp" />
- <property name="username" value="shenyang" />
- <property name="password" value="shenyang" />
-
- <!-- Connection Pooling DBCP -->
- <property name="initialSize" value="5" />
- <property name="maxActive" value="100" />
- <property name="maxIdle" value="30" />
- <property name="maxWait" value="1000" />
- <property name="poolPreparedStatements" value="true" />
- <property name="defaultAutoCommit" value="false" />
- </bean>
-
- <!-- 這里的dataSource要與sqlSessionFactory的dataSource一致,否則事務(wù)無(wú)效 -->
- <bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- </bean>
-
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="configLocation" value="classpath:mybatis-configuration.xml"></property>
- </bean>
-
- <!-- 注意!這里不要偷懶!。要把userMapper賦給別的.class文件里的一個(gè)屬性后再使用,否則事務(wù)無(wú)效。
- 也就是說(shuō)當(dāng)直接創(chuàng)建userMapper的一個(gè)class,然后使用IUserDao.insertUser方法的話(huà)也可以實(shí)現(xiàn),但是事務(wù)將無(wú)效。 -->
- <!-- 這里的mapperInterface需要接口類(lèi)型 -->
- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
- <property name="mapperInterface" value="com.dao.IUserDao" />
- <property name="sqlSessionFactory" ref="sqlSessionFactory" />
- </bean>
-
- <!-- 掃描包 -->
- <context:component-scan base-package="com.service" />
-
- <!-- 使用注解方式的事務(wù) -->
- <tx:annotation-driven transaction-manager="transactionManager" />
-
- </beans>
6. 在src下新建mybatis-configuration.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>
- <!-- 配置mybatis的緩存,延遲加載等等一系列屬性 -->
- <settings>
- <!-- 全局映射器啟用緩存 -->
- <setting name="cacheEnabled" value="true" />
- <!-- 查詢(xún)時(shí),關(guān)閉關(guān)聯(lián)對(duì)象即時(shí)加載以提高性能 -->
- <setting name="lazyLoadingEnabled" value="true" />
- <!-- 設(shè)置關(guān)聯(lián)對(duì)象加載的形態(tài),此處為按需加載字段(加載字段由SQL指 定),不會(huì)加載關(guān)聯(lián)表的所有字段,以提高性能 -->
- <setting name="aggressiveLazyLoading" value="false" />
- <!-- 對(duì)于未知的SQL查詢(xún),允許返回不同的結(jié)果集以達(dá)到通用的效果 -->
- <setting name="multipleResultSetsEnabled" value="true" />
- <!-- 允許使用列標(biāo)簽代替列名 -->
- <setting name="useColumnLabel" value="true" />
- <!-- 允許使用自定義的主鍵值(比如由程序生成的UUID 32位編碼作為鍵值),數(shù)據(jù)表的PK生成策略將被覆蓋 -->
- <!-- <setting name="useGeneratedKeys" value="true" /> -->
- <!-- 給予被嵌套的resultMap以字段-屬性的映射支持 -->
- <setting name="autoMappingBehavior" value="FULL" />
- <!-- 對(duì)于批量更新操作緩存SQL以提高性能 -->
- <setting name="defaultExecutorType" value="BATCH" />
- <!-- 數(shù)據(jù)庫(kù)超過(guò)25000秒仍未響應(yīng)則超時(shí) -->
- <setting name="defaultStatementTimeout" value="25000" />
- </settings>
- <!-- 全局別名設(shè)置,在映射文件中只需寫(xiě)別名,而不必寫(xiě)出整個(gè)類(lèi)路徑 -->
- <!-- <typeAliases>
- <typeAlias alias="TestBean"
- type="com.wotao.taotao.persist.test.dataobject.TestBean" />
- </typeAliases> -->
- <!-- 非注解的sql映射文件配置,如果使用mybatis注解,該mapper無(wú)需配置,但是如果mybatis注解中包含@resultMap注解,則mapper必須配置,給resultMap注解使用 -->
- <mappers>
- <mapper resource="com/mybatis/mapper/UserMapper.xml" />
- </mappers>
- </configuration>
7. 在com.mybatis.mapper包下新建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">
- <!-- 這里的namespace名字必須為執(zhí)行該sql的dao地址 -->
- <mapper namespace="com.dao.IUserDao">
-
- <resultMap type="com.entity.UserEntity" id="userResultMap">
- <id property="userID" column="id"/>
- <result property="userPWD" column="pwd"/>
- <result property="userName" column="name"/>
- <result property="userBirthday" column="birthday"/>
- <result property="userSalary" column="salary"/>
- </resultMap>
-
- <select id="getUser" parameterType="String" resultType="com.entity.UserEntity" resultMap="userResultMap">
- <![CDATA[
- SELECT * FROM MYUSER
- WHERE ID = #{userID}
- ]]>
- </select>
-
- <insert id="insertUser" parameterType="com.entity.UserEntity">
- INSERT INTO MYUSER(ID,PWD,NAME,BIRTHDAY,SALARY)
- VALUES(
- #{userID},
- #{userPWD},
- #{userName},
- #{userBirthday},
- #{userSalary}
- )
- </insert>
-
- </mapper>
測(cè)試:
隨便找個(gè)地方新建一個(gè)JUnitTest.class
- package com.junit.test;
-
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.test.context.ContextConfiguration;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
- import com.entity.UserEntity;
- import com.service.UserService;
-
- @RunWith(SpringJUnit4ClassRunner.class)
- //因?yàn)槲覀儧](méi)有啟動(dòng)web工程,所以無(wú)法通過(guò)web.xml執(zhí)行執(zhí)行spring-configuration.xml文件了,所以在這里要顯示的聲明執(zhí)行。
- @ContextConfiguration(locations = { "classpath:/spring-configuration.xml" })
- public class JUnitTest {
-
- // 還記得我們之前做了兩件事嗎?
- // 1. <context:component-scan base-package="com.service" />
- // 2. @Service
- // public class UserService
- // 第一告訴Spring掃描com.service下的所有類(lèi),第二告訴UserService是一個(gè)Service,讓Spring準(zhǔn)備處理
- // 所以這里用@Autowired注解的時(shí)候就可以將UserService注入進(jìn)來(lái)了。無(wú)需我們寫(xiě)UserService userService = new UserService()
- @Autowired
- UserService userService;
-
- @Test
- public void start(){
- //ApplicationContext ct =new ClassPathXmlApplicationContext("spring-configuration.xml");
- //UserService userService = (UserService)ct.getBean("userService");
- try{
- UserEntity user = new UserEntity();
- user.setUserID("10");
- user.setUserPWD("1");
- user.setUserName("asd");
- user.setUserBirthday("20120228");
- user.setUserSalary("15000.26");
-
- userService.insertUser(user);
- }catch(Exception e){
- e.printStackTrace();
- }
-
- }
- }
OK,現(xiàn)在打開(kāi)JUnitTest.class.然后鼠標(biāo)右鍵以JUnit方式運(yùn)行就可以測(cè)試了。
因?yàn)槭悄肑Unit測(cè)試,所以并沒(méi)有編寫(xiě)web.xml,在這里補(bǔ)上。
- <servlet>
- <servlet-name>spring-dispatcher</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>spring-configuration.xml</param-value>
- </init-param>
- </servlet>
-
- <servlet-mapping>
- <servlet-name>spring-dispatcher</servlet-name>
- <!-- 這里不能寫(xiě)"/*",這樣會(huì)攔截所有消息,連Index.jsp都被攔截而進(jìn)步了了 -->
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
其中第6行,可能會(huì)有點(diǎn)錯(cuò)誤,這個(gè)地方,我之后如果有時(shí)間的話(huà),會(huì)測(cè)試并改回來(lái)。
例行慣例,寫(xiě)一下響應(yīng)流程:
- 初始化spring-configration.xml中的userService文件。
- 通過(guò)spring-configuration.xml中的 53 行將userService文件中的userDao賦值為 <bean id="userMapper"> 的值。
- <bean id="userMapper"> 為com.dao.IUserDao文件加載sqlSessionFactory.openSession()產(chǎn)生的SqlSession屬性。(猜~)所以我們不用像MyBatis那樣自己生成SqlSession了。
- sqlSessionFactory加載 <bean id="sqlSessionFactory">。
- <bean id="userMapper">在spring-configuration.xml的 37 行加載了連接數(shù)據(jù)庫(kù)的dataSource 和mybatis-configuration.xml文件。
- mybatis-configuration.xml文件配置了緩存,延遲加載等等一系列屬性,加載了UserMapper.xml文件。
- UserMapper.xml文件中寫(xiě)了最關(guān)鍵的SQL語(yǔ)句。(暫時(shí)告一段落)
- 在UserService.class的 46 行中可以看出UserService.insertUser(UserEntity user) 調(diào)用了userDao.insertUser(user)。
- 而經(jīng)過(guò)第三步驟,userDao.insertUser(user)實(shí)際上就是調(diào)用了sqlSessionFactory.openSession().insert("userDao的包名.insertUser",user);不理解這語(yǔ)句的朋友請(qǐng)看《MyBatis 基礎(chǔ)筆記》。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。