一、dao接口+实现类的方式
1、先创建好整合工程结构
2、对于Spring和Mybatis 整合,我们先从数据库开始,即先创建一张简单的数据表,Sql如下
CREATE TABLE `t_user` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `username`
VARCHAR(100) DEFAULT NULL, `password` VARCHAR(100) DEFAULT NULL, `address`
VARCHAR(100) DEFAULT NULL, `sex` VARCHAR(10) DEFAULT NULL, PRIMARY KEY (`id`) )
ENGINE=INNODB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8
然后根据从上面的数据表创建对应的实体类
1 package cn.test.ssm.po; 2 3 import java.io.Serializable; 4 5 public
classUser implements Serializable { 6 private int id; 7 private String
username; 8 private String password; 9 private String address; 10 private
String sex;11 12 public int getId() { 13 return id; 14 } 15 16 public String
getUsername() {17 return username; 18 } 19 20 public String getPassword() { 21
return password; 22 } 23 24 public String getAddress() { 25 return address; 26
}27 28 public String getSex() { 29 return sex; 30 } 31 32 public void setId(
int id) { 33 this.id = id; 34 } 35 36 public void setUsername(String username)
{37 this.username = username; 38 } 39 40 public void setPassword(String
password) {41 this.password = password; 42 } 43 44 public void
setAddress(String address) {45 this.address = address; 46 } 47 48 public void
setSex(String sex) {49 this.sex = sex; 50 } 51 52 public User(String username,
String password, String address, String sex) {53 this.username = username; 54
this.password= password; 55 this.address = address; 56 this.sex = sex; 57 } 58
59 public User() { 60 } 61 62 @Override 63 public String toString() { 64 return
"User{" + 65 "id=" + id + 66 ", username='" + username + '\'' + 67 ", password=
'" + password + '\'' + 68 ", address='" + address + '\'' + 69 ", sex='" + sex +
'\'' + 70 '}'; 71 } 72 } User
3、然后我们开始配置Mybatis的相关配置文件,具体有Mybatis的核心配置文件SqlMapConfig.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4
"http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 7 <
typeAliases> 8 <!--批量别名定义:Mybatis在定义别名的时候会自动扫描包中的po类,自动的将别名定义为类名(首字母大写或者小写都可以)
--> 9 <package name="cn.test.ssm.po"></package> 10 </typeAliases> 11 12 <!--
配置一个SQL语句和映射的配置文件--> 13 <mappers> 14 <mapper resource="sqlmap/UserMapper.xml" />
15 </mappers> 16 17 </configuration>
然后就是配置UserMapper.xml映射文件,由于只是测试Spring和Mybatis的整合,所以可以只是实现相对简单的功能,这样的话,UserMapper配置文件也就比较简单
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC
"-//mybatis.org//DTD Mapper 3.0//EN" 4
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <!--
mapper为根元素,namespace指定了命名空间--> 6 <mapper namespace="test"> 7 8 <select id
="findUserById" parameterType="int" resultType="cn.test.ssm.po.User"> 9
SELECT * FROM t_user WHERE id = #{id}10 </select> 11 12 </mapper>
4、下来就是根据UserMapper中的statment实现的功能,写dao接口文件
1 package cn.test.ssm.dao; 2 3 import cn.test.ssm.po.User; 4 5 public interface
UserDao {6 7 public User findUserById(int id) throws Exception; 8 }
5、我们编写dao接口的实现类。在dao接口的实现类过程中,我们需要知道,由于Spring整合Mybatis的原因,Spring需要管理SqlSessionFactory,而实现类方法中需要得到这个SqlSessionFactory,这里我们可以继承SqlSessionDaoSupport这个类,我们看一下这个类中的方法
6、下来我们就具体的配置applicationContext配置文件,其中需要配置数据库信息,加载其他的配置文件,管理配置SqlSessionFactory(要加载Mybatis核心配置文件),然后我们管理UserDao接口的bean,同上面分析的,就需要配置SqlSessionFactory这个属性
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns
="http://www.springframework.org/schema/beans" 3 xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context
="http://www.springframework.org/schema/context" 5 xmlns:aop
="http://www.springframework.org/schema/aop" 6 xmlns:tx
="http://www.springframework.org/schema/tx" 7 xsi:schemaLocation=" 8
http://www.springframework.org/schema/beans 9
http://www.springframework.org/schema/beans/spring-beans.xsd10
http://www.springframework.org/schema/aop11
http://www.springframework.org/schema/aop/spring-aop.xsd12
http://www.springframework.org/schema/context13
http://www.springframework.org/schema/context/spring-context.xsd14
http://www.springframework.org/schema/tx15
http://www.springframework.org/schema/tx/spring-tx.xsd"> 16 17 18 <!--
加载数据库信息的配置文件--> 19 <context:property-placeholder location
="classpath:db.properties"></context:property-placeholder> 20 21 <!--配置数据源--> 22
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 23 <
propertyname="driverClass" value="${jdbc.driver}" /> 24 <property name="jdbcUrl"
value="${jdbc.url}" /> 25 <property name="user" value="${jdbc.username}" /> 26
<property name="password" value="${jdbc.password}" /> 27 </bean> 28 29 <!--
配置SqlSessionFactory--> 30 <bean id="sqlSessionFactory" class
="org.mybatis.spring.SqlSessionFactoryBean"> 31 <!--加载Mybatis的配置文件--> 32 <
propertyname="configLocation" value="mybatis/SqlMapConfig.xml"></property> 33
<!--配置数据源--> 34 <property name="dataSource" ref="dataSource"></property> 35 </
bean> 36 37 <!--配置Dao接口--> 38 <bean id="userDao" class
="cn.test.ssm.dao.UserDaoImpl"> 39 <property name="sqlSessionFactory" ref
="sqlSessionFactory"></property> 40 </bean> 41 </beans>
7、编写好applicationContext之后,就开始实现UserDao这个接口,也是如同上面的分析,实现SqlSessionDaoSupport这个抽象类,从而得到SqlSessionFactory,在方法体内获取SqlSession
1 package cn.test.ssm.dao; 2 3 import cn.test.ssm.po.User; 4 import
org.apache.ibatis.session.SqlSession; 5 import
org.mybatis.spring.support.SqlSessionDaoSupport; 6 7 public class UserDaoImpl
extends SqlSessionDaoSupport implements UserDao{ 8 9 //
SqlSessionDaoSupport中有 public void setSqlSessionFactory(SqlSessionFactory
sqlSessionFactory) 方法 10 11 @Override 12 public User findUserById(int id)
throws Exception { 13 SqlSession sqlSession = getSqlSession(); //
SqlSessionDaoSupport中有private SqlSession sqlSession;这个属性和方法 14 User user =
sqlSession.selectOne("test.findUserById",1); 15 //
使用spring来记性管理,在方法结束的时候就会自己关闭SqlSession 16 return user; 17 } 18 }
8、编写相应的Junit进行测试
1 package cn.test.ssm.dao; 2 3 import cn.test.ssm.po.User; 4 import
org.apache.ibatis.session.SqlSession; 5 import
org.mybatis.spring.support.SqlSessionDaoSupport; 6 7 public class UserDaoImpl
extends SqlSessionDaoSupport implements UserDao{ 8 9 //
SqlSessionDaoSupport中有 public void setSqlSessionFactory(SqlSessionFactory
sqlSessionFactory) 方法 10 11 @Override 12 public User findUserById(int id)
throws Exception { 13 SqlSession sqlSession = getSqlSession(); //
SqlSessionDaoSupport中有private SqlSession sqlSession;这个属性和方法 14 User user =
sqlSession.selectOne("test.findUserById",1); 15 //
使用spring来记性管理,在方法结束的时候就会自己关闭SqlSession 16 return user; 17 } 18 }
通过上面的测试程序得到结果
二、通过mapper代理方式
1、mapper代理的方式进行整合,其实跟第一篇 <https://www.cnblogs.com/fsmly/p/10324491.html>
中讲到的差不多,实际上比较重要的就是mapper接口和mapper配置文件在同一包下,且文件名相同即可,下面是使用mapper代理的方式的结构
2、然后我么来配置UserMapper配置文件,需要注意的就是这个配置文件中需要将namespace设置为Mapper接口的路径
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC
"-//mybatis.org//DTD Mapper 3.0//EN" 4
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <!--
mapper为根元素,namespace指定了命名空间--> 6 <mapper namespace
="cn.test.ssm.mapper.UserMapper"> 7 8 <select id="findUserById" parameterType
="int" resultType="cn.test.ssm.po.User"> 9 SELECT * FROM t_user WHERE id =
#{id}10 </select> 11 12 </mapper>
3、然后我们配置applicationContext配置文件,这里介绍两种配置,一种是单个Mapper的配置,一种的进行包扫描的配置
①单个Mapper的配置
a)其中需要配置的就是MapperInterface接口和SqlSessionFactory两个属性,MapperInterface作用就是扫描指定的Mapper接口文件
<!--配置mapper 通过MapperFactoryBean来进行配置,该类能够根据mapper接口生成代理对象 --> <bean id
="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <!--
配置mapper接口--> <property name="mapperInterface" value
="cn.test.ssm.mapper.UserMapper"></property> <!--配置SqlSessionFactory--> <
propertyname="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean>
b)使用测试程序进行测试
1 package test; 2 3 import cn.test.ssm.dao.UserDao; 4 import
cn.test.ssm.mapper.UserMapper; 5 import cn.test.ssm.po.User; 6 import
org.junit.Before; 7 import org.junit.Test; 8 import
org.springframework.context.ApplicationContext; 9 import
org.springframework.context.support.ClassPathXmlApplicationContext;10 11 import
static org.junit.Assert.*; 12 13 public class UserMapperTest { 14 private
ApplicationContext applicationContext;15 16 @Before 17 public void setUp()
throws Exception { 18 //得到spring的容器 19 applicationContext = new
ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); 20 }
21 22 @Test 23 public void findUserById() throws Exception{ 24 UserMapper
userMapper = (UserMapper) applicationContext.getBean("userMapper"); 25 26 User
user = userMapper.findUserById(1); 27 28 System.out.println(user); 29 } 30 }
c)通过观察日志分析结果如下:
②通过扫描mapper包的方式进行配置
a)其中basePackage就是设置扫描的包,当有多个包需要扫描的时候,使用逗号隔开
1 <!--通过配置扫描器的方式解决上面配置存在的不足:当我们的Mapper接口比较多的时候,上面单个配置Mapper显然会比较繁琐, 2
所以我们可以使用扫描器的方式进行配置,将mapper包下面的所有接口同时进行扫描配置,显然,mapper接口的文件名和Mapper3 配置文件的文件名应该相同
4 --> 5 <!--通过下面的这种配置:可以自动创建对象并且向spring容器中注入--> 6 <bean class
="org.mybatis.spring.mapper.MapperScannerConfigurer"> 7 <property name
="basePackage" value="cn.test.ssm.mapper"></property> 8 <property name
="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> 9 </bean>
b)测试程序和上面的测试程序相同,我们来运行测试程序,但是发现运行出了下面的异常
c)通过查询资料,发现是由于Spring版本和Jdk版本不支持的原因,因为本次测试使用的Spring版本是3.2.x,然后该版本不支持jdk1.8,所以就需要修改jdk版本为1.7,如下图所示
然后再次运行项目即可
热门工具 换一换