本人剛剛接觸mybatis,今天把它和spring整合起來用了一個上午==。
一開始是通過配置文件來配置,后來嘗試用了一下注解,覺得mybatis的注解真的有點惡心。。。一大坨的,所以我還是建議使用配置文件吧!
1.首先配置spring配置文件
<!--數據源--> <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> <!--mybatis 的 sqlsessionFactoryNean--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="datasource"/> <property name="configLocation" value="classpath:conf.xml"/> <property name="mapperLocations" value="classpath:com/seven/dao/*.xml"/> <property name="typeAliasesPackage" value="com.seven.domain"/><!--指定實體類包,自動將實體類的簡單類名映射為別名--> </bean> <!--映射器接口,,,,有了 下面配置就不用了--> <!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> <property name="mapperInterface" value="com.seven.dao.UserMapper"/> </bean>--> <!--mybatis自動掃描加載sql映射文件:mapperScannerConfigurer--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.seven.dao"/><!--指定sql映射文件、接口所在的包--> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <!--事務管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="datasource"/> </bean> <!--聲明事務--> <tx:annotation-driven transaction-manager="transactionManager"/>
2.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> <settings> <!-- 全局映射器啟用緩存 --> <setting name="cacheEnabled" value="true" /> <!-- 查詢時,關閉關聯對象即時加載以提高性能 --> <setting name="lazyLoadingEnabled" value="true" /> <!-- 設置關聯對象加載的形態,此處為按需加載字段(加載字段由SQL指 定),不會加載關聯表的所有字段,以提高性能 --> <setting name="aggressiveLazyLoading" value="false" /> <!-- 對於未知的SQL查詢,允許返回不同的結果集以達到通用的效果 --> <setting name="multipleResultSetsEnabled" value="true" /> <!-- 允許使用列標簽代替列名 --> <setting name="useColumnLabel" value="true" /> <!-- 允許使用自定義的主鍵值(比如由程序生成的UUID 32位編碼作為鍵值),數據表的PK生成策略將被覆蓋 --> <setting name="useGeneratedKeys" value="true" /> <!-- 給予被嵌套的resultMap以字段-屬性的映射支持 --> <setting name="autoMappingBehavior" value="FULL" /> <!-- 對於批量更新操作緩存SQL以提高性能 --> <setting name="defaultExecutorType" value="BATCH" /> <!-- 數據庫超過25000秒仍未響應則超時 --> <setting name="defaultStatementTimeout" value="25000" /> </settings> <!-- 全局別名設置,在映射文件中只需寫別名,而不必寫出整個類路徑 --> <!-- <typeAliases> <typeAlias alias="TestBean" type="com.wotao.taotao.persist.test.dataobject.TestBean" /> </typeAliases>--> <!-- 非注解的sql映射文件配置,如果使用mybatis注解,該mapper無需配置,但是如果mybatis注解中包含@resultMap注解,則mapper必須配置,給resultMap注解使用,交給spring管理了 --> <!--<mappers> <mapper resource="persist/test/orm/test.xml" /> </mappers>--> </configuration>
3.實體,接口
package com.seven.domain; import java.util.Date; /** * Created by Seven on 2015/5/29. */ public class User { private int id; private String loginName; private String userName; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
package com.seven.dao; import com.seven.domain.User; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * Created by Seven on 2015/5/29. */ @Transactional public interface UserMapper { void save(User user); void update(User user); void delete(int id); User findById(int id); List<User> findAll(); }
4.接下就是比較重要的一步,寫接口的映射文件,這樣就實驗了dao
<?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必須是接口的全類名 --> <mapper namespace="com.seven.dao.UserMapper"> <resultMap id="userResult" type="User"> <result column="id" property="id"/> <result column="loginName" property="loginName"/> <result column="userName" property="userName"/> <result column="password" property="password"/> </resultMap> <!-- 取得插入數據后的id --> <insert id="save"> insert into tb_user(loginName,userName,password) values(#{loginName},#{userName},#{password}) </insert> <update id="update"> update tb_user set loginName = #{loginName}, userName = #{userName}, password = #{password} where id = #{id} </update> <delete id="delete"> delete from tb_user where id = #{id} </delete> <select id="findById" resultMap="userResult"> select * from tb_user where id = #{id} </select> <select id="findAll" resultMap="userResult"> select * from tb_user </select> </mapper>
5.測試,需要導入spring的測試包
package com.seven.test; import com.seven.dao.UserMapper; import com.seven.domain.User; 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 java.util.Date; /** * Created by Seven on 2015/5/29. */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/application.xml") public class MyTest { @Autowired private UserMapper userMapper; @Test public void testSave(){ System.out.println(userMapper); User user = new User(); user.setLoginName("seven"); user.setUserName("lin"); user.setPassword("123"); userMapper.save(user); } }
總結,通過這種配置可以實現不用sqlsession而實現crud,因為都交給sprin來實現了,但是這種方法在service層實現的時候代碼會比較冗余,但是這種方法思路比較清晰,有好有壞==。