步骤一:导入Spring与Mybatis的依赖包
步骤二:创建Mybatis与Spring的配置文件,数据库连接配置文件database.properties,log4j.properties
步骤三:UserDaoImpl中声明SqlSessionTemplate对象,配置文件需要配置SqlSessionTemplate的bean,同时以构造注入的方式,注入SqlSessionFactory
使用模板方式一,具体配置如下:
1. UserDaoImpl代码段:
public class UserDaoIml extends SqlSessionDaoSupport implements UserDao {
//SqlSession的模板
SqlSessionTemplate sqlSession;
public SqlSessionTemplate getSqlSession() {
return sqlSession;
}
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
2.applicationContext.xml,配置如下:
<!--配置SqlSessionTemplate的bean,只能以构造注入方式-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSesssionFactory"></constructor-arg>
</bean>
<!--配置UserDao的bean.并注入SqlSessionTemplate,设值注入方式setter-->
<bean id="userDao" class="com.bdqn.spring.mybatis.dao.impl.UserDaoIml">
<property name="sqlSession" ref="sqlSession"></property>
</bean>
使用模板方式二,具体配置如下:
1.
public class UserDaoIml extends SqlSessionDaoSupport implements UserDao {
//查询所有用户信息
@Override
public List<User> getUserList() {
return this.getSqlSession().getMapper(UserDao.class).getUserList();
}
2. UserDao中直接注入sqlSesssionFactory
<bean id="userDao" class="com.bdqn.spring.mybatis.dao.impl.UserDaoIml">
<property name="sqlSessionFactory" ref="sqlSesssionFactory"></property>
</bean>
实现注入映射器(根据接口生成Dao实现类)方式一:
该种方式可以根据Dao接口自动生成实现类的bean,当接口较多的情况下,配置项也会随之增加,代码比较繁琐
<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.bdqn.spring.mybatis.dao.UserDao"></property>
<property name="sqlSessionFactory" ref="sqlSesssionFactory"></property>
</bean>
实现注入映射器(根据指定包中所有接口生成实现类),方式二(推荐使用):
该种方式只能通过注解方式,实现注入,默认生成实现类的名字为:接口首字母小写
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.bdqn.spring.mybatis.dao"></property>
</bean>
实现事务增强配置:
步骤一:配置事务管理器,配置如下:
<!--1.配置事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
步骤二:为指定的事务管理器配置事务规则,配置如下:
propagation="REQUIRED":该事务规则为:支持当前事务,如果没有事务会重新开启一个新的事务(推荐使用)
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"></tx:method>
<tx:method name="find*" propagation="REQUIRED"></tx:method>
<tx:method name="update*" propagation="REQUIRED"></tx:method>
</tx:attributes>
</tx:advice>
步骤三:织入事务增强,配置如下:
<aop:config>
<aop:pointcut id="pointcut" expression="execution(public int addUser(com.bdqn.spring.mybatis.entity.User))"></aop:pointcut>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"></aop:advisor>
</aop:config>
步骤四:测试代码:
@org.junit.Test
public void addUser() {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) context.getBean("userService");
User user=new User();
user.setUserName("新用户");
user.setUserCode("newuser");
user.setUserPassword("1111111");
user.setUserRole(1);
userService.addUser(user);
}
spring中配置数据源的方式:
- 使用数据库配置文件(推荐使用该种方法)
- 使用JNDI
- 在dataSource配置中,直接引用数据库连接信息
bean的作用域:scope属性:
- singleton该值表示当前的bean只创建一个实例,每次都会请求该实例。(单例模式,效率高,线程不安全)
- prototype:默认的值,每次请求都会创建新的bean实例。(多例模式,效率较低,安全性高)
spring中的自动装配:
- no:不进行自动装配,需要显示指定要注入的bean
- byType:按类型自动匹配
- byName:按名称自动装配
- constructor:按照构造方法中提供的参数进行注入
拆分spring配置文档:
- 但spring只配置文件中配置项较多复杂时,可以按照层进行拆分,拆分后需要在主配置文件中得到如子配置文件(没有springMVC框架时)
使用注解实现声明事务:
1、配置事务管理器:
<!--1.配置事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
2、<tx:advice id="txAdvice" transaction-manager="txManager">
3、在业务层(Service实现类上使用注解@Transational进行标注,表示该类下所有的方式使用注解)
备注:1、如果事务管理器的id是:自己命名的,必须设置transaction-manager属性的值为指定的名称
2、事务管理器的id为transactionManager时,<tx:annotation-driven/>可以省略“transaction-manager”
切入点表达式匹配的规则
- public * addNewUser(entity.User):“ * ”表示匹配指定方法所有类型的返回值。
- public void *(entity.User):“ * ”表示匹配所有方法名。
- public void addNewUser(.. ):“ .. ”表示匹配指定方法所有参数个数和类型。
- * com.service.*.*(..):匹配com.service包下所有类的所有方法,参数任意。
- * com.service..*.*(..):匹配com.service包及其子包下所有类的所有方法,参数任意。
- public voif addUser(entity.User):表示匹配具体的方法。
—— 不论身在何处,不论世事如何艰难,你都在向胜利出发。毋庸置疑。