话不多说,开始整合框架Spring和框架MyBatis:
一、创建工程
二、引入依赖包
三、编写spring配置文件
四、编写Mybatis配置文件
五、编写Mapper及其他配置文件
六、编写Dao层
七、编写测试类
1.创建测试工程,并创建相关包和文件,如图所示:
mybatis包中存放mybatis的配置文件;
spring包中存放spring的配置文件;
sqlmap包中存放mapper的配置文件;
然后创建以下几个包:cn.com.dao、cn.com.mapper、cn.com.po、cn.com.test
2.引入依赖包:
引入以下依赖包:spring相关包、mybatis相关包、log4j测试包
首先我们使用Dao进行spring+mybatis进行合并,暂时不用mapper进行代理
3.编写spring配置文件:
- applicationContext.xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
">
<!--配置数据源-->
<context:property-placeholder location="db.properties"/>
<!--数据源,使用DBCP-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxActive" value="10"/>
<property name="maxIdle" value="5"/>
</bean>
<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
>
<!--Mybatis配置-->
<property name="configLocation" value="mybatis/SqlMapConfig.xml"/>
<!--数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--原始Dao接口-->
<bean id="UserDao" class="cn.com.dao.UserDaoImp">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
</beans>
4.编写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>
<!--setting-->
<settings>
<!--打开延迟加载开关-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--将积极加载改为消极加载-->
<setting name="aggressiveLazyLoading" value="false"/>
<!--打开二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
<!--别名定义-->
<typeAliases>
<package name="cn.com.po"/>
</typeAliases>
<!--加载映射文件-->
<mappers>
<!--单次加载resource-->
<mapper resource="sqlmap/UserMapper.xml"/>
<!--<!–批量加载mapper–>-->
<package name="cn.com.mapper"/>
</mappers>
</configuration>
5.编写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">
<mapper namespace="test">
<!--查询-->
<select id="findUserById" parameterType="int" resultType="cn.com.po.User">
select * from user where id= #{id}
</select>
<select id="findUser" resultType="cn.com.po.User">
select * from user
</select>
<select id="findUserByUsername" parameterType="java.lang.String"
resultType="cn.com.po.User">
select * from user where username like '%${value}%'
</select>
<!--插入-->
<insert id="insertUser" parameterType="cn.com.po.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user(username,password,gender,birthday,email,province,city)
value (#{username},#{password},#{gender},#{birthday,jdbcType=DATE},#{email},#{province},#{city})
</insert>
<!--删除-->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<!--修改-->
<update id="updateUser" parameterType="cn.com.po.User">
update user set username=#{username} where id=#{id}
</update>
<!--开启Mapper二级缓存-->
<cache/>
</mapper>
- db.properties文件内容:数据库相关配置文件
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybitas_test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
jdbc.username=root
jdbc.password=123456
- log4j.properties文件内容:
log4j.rootLogger = debug,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
- User.java文件内容:
package cn.com.po;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private int id;
private String username;
private String password;
private String gender;
private String email;
private String province;
private String city;
private Date birthday;
public User(){ }
public User(int id, String username, String password, String gender, String email, String province, String city, Date birthday) {
super();
this.id = id;
this.username = username;
this.password = password;
this.gender = gender;
this.email = email;
this.province = province;
this.city = city;
this.birthday = birthday;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
- UserDao接口文件内容:
package cn.com.dao;
import cn.com.po.User;
public interface UserDao {
public User findUserById(int id) throws Exception;
}
- UserDaoImp.java文件内容:
package cn.com.dao;
import cn.com.po.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;
public class UserDaoImp extends SqlSessionDaoSupport implements UserDao {
@Override
public User findUserById(int id) throws Exception {
SqlSession sqlSession=this.getSqlSession();
User user=sqlSession.selectOne("test.findUserById",id);
return user;
}
}
- UserServiceTest测试文件:
package cn.com.test;
import cn.com.dao.UserDao;
import cn.com.mapper.UserQueryMapper;
import cn.com.po.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;
//在执行Test前 先执行该函数
@Before
public void setApplicationContext() throws Exception{
applicationContext=
new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
}
//不使用Mapper代理
@Test
public void testFindUserById() throws Exception{
UserDao userDao=(UserDao) applicationContext.getBean("UserDao");
User user=userDao.findUserById(1);
System.out.println(user.getUsername()+","+user.getPassword());
}
}
一切配置完毕后,进行单元测试,正确的输出为:
6.使用mapper进行动态代理:
我们在使用非mapper动态代理的时候,使用了SqlMapConfig.xml批量加载mapper代理接口,但是Spring框架拥有自己的Mapper批量扫描器类,用于扫描Mapper代理接口。所以使用mapper进行动态代理的时候,我们无需再使用SqlMapConfig.xml进行批量加载mapper了。
mapper动态代理:
1.第一步:
在mapper包中新建:UserQueryMapper接口和UserQueryMapper.xml文件(注意:必须两个文件在一个包下,并且同名,我自己被坑了一下午 emmm)
文件内容如下:
package cn.com.mapper;
import cn.com.po.User;
public interface UserQueryMapper {
public User findUserById(int id) throws Exception;
}
<?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="cn.com.mapper.UserQueryMapper">
<select id="findUserById" parameterType="int" resultType="cn.com.po.User">
select * from user where id=#{id}
</select>
</mapper>
2.第二步:
在applicationContext.xml文件中添加以下内容:
<!--Mapper代理-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定扫描包名,如果扫描多个包,包之间使用半角逗号隔开-->
<property name="basePackage" value="cn.com.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
3.第三步:编写测试类:
//使用Mapper代理
@Test
public void test_mapper_FindUserById() throws Exception{
UserQueryMapper userQueryMapper=
(UserQueryMapper) applicationContext.getBean("userQueryMapper");
User user=userQueryMapper.findUserById(1);
System.out.println(user.getUsername()+","+user.getPassword());
}
得到结果和非动态代理相同,对于mapper动态代理,我们不需要自己再去实现接口函数,applicationContext.xml文件会自动找到该接口,会从mapper包中扫描出该接口,自动创建代理对象并且在spring容器中注入。