我們有一個用于User的域類和一個用于將User信息存儲在數據庫中的數據庫表。 在示例中,我們將使用xml配置模型來定義將執行CRUD操作的SQL命令。
我們的領域類
package com.raistudies.domain;import java.io.Serializable;public class User implements Serializable{private static final long serialVersionUID = 3647233284813657927L;private String id;private String name = null;private String standard = null;private String age;private String sex = null;//setter and getter have been omitted to make the code short@Overridepublic String toString() {return "User [name=" + name + ", standard=" + standard + ", age=" + age+ ", sex=" + sex + "]";}
}
我們的域類中有五個屬性,它們稱為User,它們必須為其提供數據庫服務。
我們的數據庫表
以下是我們的數據庫表:
CREATE TABLE `user` (`id` varchar(36) NOT NULL,`name` varchar(45) DEFAULT NULL,`standard` varchar(45) DEFAULT NULL,`age` varchar(45) DEFAULT NULL,`sex` varchar(45) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
創建CRUD操作的界面
為了使用MyBatis 3定義CRUD數據庫操作,我們必須指定將用于執行CRUD操作的方法。 以下是我們示例的界面:
package com.raistudies.persistence;import java.util.List;import com.raistudies.domain.User;public interface UserService {public void saveUser(User user);public void updateUser(User user);public void deleteUser(String id);public List<User> getAllUser();
}
我們這里有四種方法來執行創建,更新,刪除和從數據庫獲取操作。
UserService接口的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="com.raistudies.persistence.UserService"><resultMap id="result" type="user"><result property="id" column="id"/><result property="name" column="name"/><result property="standard" column="standard"/><result property="age" column="age"/><result property="sex" column="sex"/></resultMap><select id="getAllUser" parameterType="int" resultMap="result">SELECT id,name,standard,age,sexFROM user;</select><insert id="saveUser" parameterType="user">INSERT INTO user (id,name,standard,age,sex)VALUE (#{id},#{name},#{standard},#{age},#{sex})</insert><update id="updateUser" parameterType="user">UPDATE userSETname = #{name},standard = #{standard},age = #{age},sex = #{sex}where id = #{id}</update><delete id="deleteUser" parameterType="int">DELETE FROM userWHERE id = #{id}</delete>
</mapper>
您會在這里看到很多新東西:
映射文件將包含元素<mapper />來定義服務的SQL語句。 在這里,屬性“ 名稱空間 ”定義了已為其定義此映射文件的接口。
<insert />標記定義該操作為插入類型。 “ id ”屬性的值指定為其定義了SQL語句的函數名稱。 這里是“ saveUser ”。 屬性“ parameterType ”定義方法的參數是哪種類型。 我們在這里為User類使用了別名。 稍后將在MyBatis配置文件中配置別名。 然后,我們必須定義SQL語句。 #{id}定義將類User的屬性“ id ”作為參數傳遞給SQL查詢。
<resultMap />標記用于指定User類和用戶表之間的映射。 <resultMap />的id是映射定義的唯一名稱。 在此標簽下,我們定義了不同的屬性以及將哪個列綁定到哪個屬性。
<select />標記用于指定選擇SQL語句。 “ id ”屬性的值指定為其定義了SQL語句的函數名稱。
屬性resultMap用于將SQL語句的返回類型定義為一個集合。
MyBatis 3配置文件
以下是我們的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><!-- changes from the defaults --><setting name="lazyLoadingEnabled" value="false" /></settings><typeAliases><typeAlias type="com.raistudies.domain.User" alias="user"/></typeAliases>
</configuration>
您可以看到,我們尚未在此處定義一些非常重要的屬性:
- 數據庫連接屬性。
- 與交易相關的屬性。
- 并且也沒有定義映射器配置。
MyBatis 3是一個非常強大的SQL映射框架,它使用用戶定義的服務的代理實現自動生成數據庫訪問類。 如果您將MyBatis 3與Spring框架集成并使用這些代理實現,我們就會意識到這是真正的力量。 這將使我們的數據庫工作減少80%。 在下面,我們將看到如何將MyBatis 3與Spring 3框架集成在一起。 以前,我們使用MyBatis 3為User類創建了CRUD數據庫服務。現在,我們將使用MyBatis與Spring框架集成的數據服務進行集成。
使用的工具:
- c3p0-0.9.1.2.jar –用于提供池化數據庫連接。
- mybatis-spring-1.0.0.jar –用于將MyBatis與Spring集成(由MyBatis團隊提供)
- Spring JDBC和Core庫
要集成這兩個框架,我們必須遵循以下步驟:
步驟1:將數據源定義為Spring bean
由于我們將使用c3po數據源提供程序,因此我們必須在Spring中定義數據源bean。 以下是配置代碼段:
<!-- Declare a datasource that has pooling capabilities -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close" p:driverClass="${app.jdbc.driverClassName}"
p:jdbcUrl="${app.jdbc.url}" p:user="${app.jdbc.username}" p:password="${app.jdbc.password}"
p:acquireIncrement="10" p:idleConnectionTestPeriod="60" p:maxPoolSize="100"
p:maxStatements="50" p:minPoolSize="10" />
在這里,我們創建了一個帶有com.mchange.v2.c3p0.ComboPooledDataSource類的id dataSource的spring bean,它由c3p0庫提供用于合并數據源。
我們在bean中設置了一些屬性。 以下是在bean中定義的屬性的描述:
- driverClass :將用于連接數據庫的驅動程序類。
- jdbcUrl :jdbc定義數據庫連接字符串的URL。
- user :數據庫用戶的用戶名。
- password :數據庫用戶的密碼。
- acquisitionIncrement :在連接短缺的情況下,一次將創建多少個連接。
- idleConnectionTestPeriod :連接斷開多長時間后,如果不再使用它,它將被關閉。
- maxPoolSize :可以創建的最大連接數。
- maxStatements :連接上要執行的最大SQL語句數。
- minPoolSize :要創建的最小連接數。
我們已經使用Spring EL定義了許多屬性值,這些屬性值將從屬性文件中獲取。
在Spring定義交易管理器
我們將使用Spring JDBC框架提供的用戶事務管理器,為了定義事務級別,我們將使用注釋。 以下是事務管理器的配置:
<!-- Declare a transaction manager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource" /><!-- Enable annotation style of managing transactions -->
<tx:annotation-driven transaction-manager="transactionManager" />
定義MyBatis SqlSessionFactory和MapperScanner
<!-- define the SqlSessionFactory, notice that configLocation is not needed when you use MapperFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="configLocation" value="WEB-INF/mybatis/sqlmap-config.xml" />
</bean><!-- scan for mappers and let them be autowired -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="${MapperInterfacePackage}" />
</bean>
SqlSessionFactory bean將提供MyBatis的SessionFactory實例。 要配置SqlSessionFactory,我們需要定義兩個屬性。 首先,MyBatis將使用其創建連接數據庫的數據源和MyBatis配置文件名來配置MyBatis的環境。
MapperScannerConfigurer用于發布定義為MyBatis的數據服務接口,以配置為Spring Bean。 我們只需要提供定義接口及其映射XML文件的程序包即可。 我們可以使用通用分隔符或分號指定多個軟件包。 之后,我們將能夠使用@Autowired批注獲取UserService的實例。 我們不必實現該接口,因為MyBatis將為此提供代理實現。
Spring配置文件一起
這是我們的jdbc-context.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:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd"><context:property-placeholder location="/WEB-INF/jdbc.properties,/WEB-INF/mybatis/mybatis.properties" /><!-- Enable annotation style of managing transactions --><tx:annotation-driven transaction-manager="transactionManager" /><!-- Declare a datasource that has pooling capabilities --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close" p:driverClass="${app.jdbc.driverClassName}"p:jdbcUrl="${app.jdbc.url}" p:user="${app.jdbc.username}" p:password="${app.jdbc.password}"p:acquireIncrement="10" p:idleConnectionTestPeriod="60" p:maxPoolSize="100"p:maxStatements="50" p:minPoolSize="10" /><!-- Declare a transaction manager --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"p:dataSource-ref="dataSource" /><!-- define the SqlSessionFactory, notice that configLocation is not needed when you use MapperFactoryBean --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="configLocation" value="WEB-INF/mybatis/sqlmap-config.xml" /></bean><!-- scan for mappers and let them be autowired --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="${MapperInterfacePackage}" /></bean></beans>
jdbc.properties文件
# database properties
app.jdbc.driverClassName=com.mysql.jdbc.Driver
app.jdbc.url=jdbc:mysql://localhost/mybatis-example
app.jdbc.username=root
app.jdbc.password=password
mybatis.properties文件
MapperInterfacePackage=com.raistudies.persistence
參考: 使用我們的JCG合作伙伴 使用MyBatis 3映射框架創建CRUD服務-第1部分和集成MyBatis 3和Spring框架-第2部分 ? Rai Studies博客上的Rahul Mondal。
翻譯自: https://www.javacodegeeks.com/2012/02/mybatis-3-spring-integration-tutorial.html