一、Mybatis整合spring
步骤:
- 导入相关jar包
- junit
- mybatis
- mysql数据库
- spring-webmvc
- aop织入
- mybatis-spring
- spring-jdbc(spring的事务管理器,也可以用druid等的代替)
- 编写配置文件
- 测试
1.1 回忆mybatis
- 编写实体类
- 编写核心配置文件
- 编写接口
- 编写Mapper.xml
- 测试
1.2 整合方式一
注意版本限制:
-
dataSource(这里配置使用Spring的数据源替换Mybatis的配置)
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/dailyClick-test?useSSL=false&useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="1111"/> <property name="password" value="1111"/> </bean>
注:Mybatis有默认的数据源(连接池),但是是可以替换的
-
sqlSessionFactory配置
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 绑定配置文件地址和mapper地址--> <property name="configLocation" value="classpath:mybatis-config.xml"/> <property name="mapperLocations" value="classpath:com/guan/dao/*.xml"/> </bean>
注意:
- 需要配置数据源
- 需要绑定配置文件地址和mapper地址,注意这里的路径使用classpath路径
- 由于mapper等信息被转移到
<bean>
中,不能重复配置(如:<mapper>
),否则会报错;mybatis-config.xml配置文件通常留<typeAlias>
和<settings>
-
与在原来的mybatis不同,整合后需要有一个接口的实现类,且接口的方法需要通过sqlSessionTemplate实现(有利于bean的注册和管理,这个sqlSessioinTemplate是线程安全的)
sqlSessionTemplate配置
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean>
注:由于sqlSessionTemplate没有set方法,只有构造函数,所以通过
<constructor>
标签注入 -
实现类:与mybatis元素代码不同,接口类需要实现且接口的方法通过sqlSessionTemplate实现
public class UserMapperImpl implements UserMapper { SqlSessionTemplate sqlSession; public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } public List<UserBean> getUserList() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); return mapper.getUserList(); } }
<bean id="userMapper" class="com.guan.dao.UserMapperImpl"> <property name="sqlSession" ref="sqlSession"/> </bean>
-
测试
public class MyTest { public static void main(String[] args) throws IOException { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserMapperImpl userMapperImpl = context.getBean("userMapper", UserMapperImpl.class); List<UserBean> userList = userMapperImpl.getUserList(); for (UserBean userBean : userList) { System.out.println(userBean); } } }
注:
(1).mybatis的配置文件(指的是和spring注册的那一部分),最好通过import引入ApplicationiContext中,这样spring配置文件的结构可以区分开
(2).xxxTemplate是spring特有的模板类
1.3 整合方式二
注:SqlSessionDaoSupport:抽象类,可以通过SqlSessionFactory获得一个SqlSessionTemplate.所以该方法相对于第一种方法增加了一个抽象类,减少了一个配置SqlSessionTemplate的步骤
-
环境搭建:
接口:
public interface UserMapper1 { List<UserBean> getUserList(); }
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.guan.dao.UserMapper1"> <select id="getUserList" resultType="userBean"> SELECT * FROM user; </select> </mapper>
实体类:
public class UserMapper1Impl extends SqlSessionDaoSupport implements UserMapper1{ public List<UserBean> getUserList() { return getSqlSession().getMapper(UserMapper1.class).getUserList(); } }
-
xml配置(在上文的前文的基础上配置)
<bean id="userMapper1" class="com.guan.dao.UserMapper1Impl"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
-
测试:
public static void main(String[] args) throws IOException { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserMapper1Impl userMapperImpl = context.getBean("userMapper1", UserMapper1Impl.class); List<UserBean> userList = userMapperImpl.getUserList(); for (UserBean userBean : userList) { System.out.println(userBean); } }
二、spring中的事物管理
-
编程式事务:将事务管理代码嵌到业务方法中控制事务的提交和回滚
缺点:使业务逻辑中包含额外的事务管理代码
-
声明式事物:使用AOP
(1).搭建环境:
接口
public interface UserMapper1 { List<UserBean> getUserList(); void insert(UserBean user); void delete(String UId); }
mapper:
<insert id="insert" parameterType="userBean"> INSERT INTO user(UId,UName,USet,UAuth,UPassword,UState) VALUES(#{UId},#{UName},#{USet},#{UAuth},#{UPassword},#{UState}); </insert> <delete id="delete" parameterType="string"> DELETEs FROM user WHERE UId = #{UId}; </delete>
注:可以看到我这里的"DELETEs"是错误的写法
编写实体类:
public class UserMapper1Impl extends SqlSessionDaoSupport implements UserMapper1{ public List<UserBean> getUserList() { insert(new UserBean("6666666666","淀真嗣",1,0,"123456",1)); delete("3180421016"); return getSqlSession().getMapper(UserMapper1.class).getUserList(); } public void insert(UserBean user) { getSqlSession().getMapper(UserMapper1.class).insert(user); } public void delete(String UId) { getSqlSession().getMapper(UserMapper1.class).delete(UId); } }
注:getUserList中添加了insert和delete方法,且delete方法是错误的.如果没有事务,则插入可以完成;如果有事务,则插入无法完成
(2).导入事务相关的xml头文件约束,创建
DataSourceTransaction
对象以开启事务,配置事务通知,结合AOP实现事务的织入<?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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://47.100.90.132:3306/dailyClick-test?useSSL=false&useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="aguan123"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- bind mybatis-config.xml and userMapper.xml--> <property name="configLocation" value="classpath:mybatis-config.xml"/> <property name="mapperLocations" value="classpath:com/guan/dao/*.xml"/> </bean> <bean id="userMapper1" class="com.guan.dao.UserMapper1Impl"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> <!-- 配置声明式事务--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 配置事务通知--> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="getUserList" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!-- 结合AOP织入事务--> <aop:config> <aop:pointcut id="point" expression="execution(* com.guan.dao.*.*(..))"/> <!-- <aop:advisor advice-ref="txAdvice" pointcut-ref="point"/>--> </aop:config> </beans>
注:
<tx:method name="getUserList" propagation="REQUIRED"/>
的propagation属性表示对这些方法怎样使用事务,如:REQUIRED表示支持当前事务,如果当前没有事务,就新建一个事务 (Default)(3).测试
public class MyTest { public static void main(String[] args) throws IOException { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserMapper1 userMapperImpl = context.getBean("userMapper1", UserMapper1.class); List<UserBean> userList = userMapperImpl.getUserList(); for (UserBean userBean : userList) { System.out.println(userBean); } } }
注意:由于使用了AOP,这里
UserMapper1 userMapperImpl = context.getBean("userMapper1", UserMapper1.class)
的返回类型必须为interface类型,而不是实体类型