Spring整合Mybatis
1.创建java项目,导入对应jar包
创建java项目,导入对应jar包(mysql驱动jar包,mybatis相关的jar包,spring的mybatis的jar包,spring的jdbc的jar包,lo4j的jar包,spring的aop的jar包,spring的ioc的jar包)
2.创建属性文件-log4j.properties,jdbc.properties
创建属性文件:log4j.properties,jdbc.properties放在src下
修改变量名为driverClass,user,防止driver和username的变量名与系统文件变量名冲突
log4j.properties文件内容:
# Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
jdbc.properties文件内容:
driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/studz10b?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
user=root
password=root
3.创建mybatis的核心配置文件
在src下,先创建mybatis的核心配置文件
里面只配置一个别名
<!--配置类型别名-->
<typeAliases>
<package name="com.jr.entity"/>
<package name="com.jr.vo"/>
</typeAliases>
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>
<!--配置类型别名-->
<typeAliases>
<package name="com.jr.entity"/>
<package name="com.jr.vo"/>
</typeAliases>
</configuration>
4.配置Spring核心配置文件–重点
在src下,配置Spring核心配置文件()重点
1.加载外部属性文件,获得连接数据库的四要素 (需要添加一个context空间
2.配置数据源:数据库连接池
3.配置sqlSession对象
4.配置Mapper映射文件的扫描器对象
5.配置注解扫描路径
6.配置自动创建aop代理类 (需要添加一个aop空间)
如果要进行添加事务管理可以接着配置以下内容:
7.配置声明式事务管理对象
8.配置事物的传播策略 规范:传播策略都是配置在service层(需要导入tx空间)
9.配置xml方式的声明式事务
如果要使用注解的方式进行管理事务:
先把8和9的配置注释,加一个事务支持注解驱动的配置
<!--注释8和9后,配置 事务支持注解驱动-->
<tx:annotation-driven transaction-manager="txManager"/>
applicationContext.xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd ">
<!--1.加载外部属性文件,获得连接数据库的四要素 (需要添加一个context空间)-->
<context:property-placeholder location="classpath*:jdbc.properties"/>
<!--2.配置数据源:数据库连接池-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</bean>
<!--3.配置sqlSession对象-->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:SqlMapConfig.xml"/>
</bean>
<!--4.配置Mapper映射文件的扫描器对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.jr.mapper"/>
<property name="sqlSessionFactoryBeanName" value="factory"/>
</bean>
<!--5.配置注解扫描路径-->
<context:component-scan base-package="com.jr"/>
<!--6.配置自动创建aop代理类 (需要添加一个aop空间)-->
<aop:aspectj-autoproxy/>
<!--7.配置声明式事务管理对象-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--8.配置事物的传播策略 规范:传播策略都是配置在service层-->
<!--
需要再导入一个命名空间 tx
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!--
name : 一般使用通配符
propagation:传播策略
REQUIRED:有事务加入,没事务就开启
SUPPORTS:有事务就在事务里运行,没事务就在非事务状态下执行
-->
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="upd*" propagation="REQUIRED"/>
<tx:method name="remove*" propagation="REQUIRED"/>
<tx:method name="get*" propagation="SUPPORTS"/>
</tx:attributes>
</tx:advice>
<!--9.配置xml方式的声明式事务-->
<aop:config>
<aop:pointcut id="txpointcut" expression="execution(* com.jr.service.impl.DeptServiceImpl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txpointcut"/>
</aop:config>
</beans>
5.创建实体类
Dept实体类文件内容:
package com.jr.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;
@Component/*等价bean标签*/
@Data/*自动生成get、set、toString*/
@AllArgsConstructor/*自动全参构造器*/
@NoArgsConstructor/*自动无参构造器*/
public class Dept {
private Integer deptno;
private String dname;
private String loc;
}
6.创建mapper接口
DeptMapper 接口文件内容:
package com.jr.mapper;
import com.jr.entity.Dept;
import java.util.List;
public interface DeptMapper {
int insertDept(Dept dept);
int deleteDept(int deptno);
int updateDept(Dept dept);
List<Dept> selectAll();
}
7.创建mapper.xml映射文件
创建mapper.xml映射文件(mapper映射文件放在与mapper接口相同的包下,并且文件名相同)
DeptMapper.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.jr.mapper.DeptMapper">
<select id="selectAll" resultType="dept">
select * from dept
</select>
<insert id="insertDept" parameterType="dept">
insert into dept(deptno,dname,loc) values(#{deptno},#{dname},#{loc})
</insert>
<update id="updateDept" parameterType="dept">
update dept set dname=#{dname},loc=#{loc} where deptno=#{deptno}
</update>
<delete id="deleteDept" parameterType="int">
delete from dept where deptno=#{deptno}
</delete>
</mapper>
8.创建service接口
DeptService接口文件内容:
package com.jr.service;
import com.jr.entity.Dept;
import java.util.List;
public interface DeptService {
boolean addDept(Dept dept);
boolean updDept(Dept dept);
boolean removeDept(int deptno);
List<Dept> getAll();
}
9.创建ServiceImpl实现类
DeptServiceImpl实现类文件内容:
package com.jr.service.impl;
import com.jr.entity.Dept;
import com.jr.mapper.DeptMapper;
import com.jr.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional(propagation= Propagation.REQUIRED)/*当前实现类的策略都用 REQUIRED 等价替换为applicationContext.xml中的第8,9个配置*/
public class DeptServiceImpl implements DeptService {
@Autowired /*通过byType进行依赖注入*/
private DeptMapper deptMapper;
@Override
public boolean addDept(Dept dept) {
return deptMapper.insertDept(dept)==1?true:false;
}
@Override
public boolean updDept(Dept dept) {
int i = 0;
i = deptMapper.insertDept(dept);
dept.setLoc("长春");
i +=deptMapper.updateDept(dept);
if(i==2){
return true;
}else {
return false;
}
}
@Override
public boolean removeDept(int deptno) {
return deptMapper.deleteDept(deptno)==1?true:false;
}
@Override
public List<Dept> getAll() {
return deptMapper.selectAll();
}
}
10.创建切面类-Advice
创建切面类(单独放在util包下,命名带上Advice)
Advice切面类文件内容:
package com.jr.util;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component/*添加该文件到bean*/
@Aspect/*设置该类为切面类*/
public class Advice {
@Before("execution(* com.jr.service.impl.DeptServiceImpl.*Dept(..))")
public void check(){
System.out.println("权限检查。。。");
}
@After("execution(* com.jr.service.impl.DeptServiceImpl.*Dept(..))")
public void log(){
System.out.println("日志记录。。。");
}
}
11.创建测试类
测试类内容:
public class DeptTest {
@Test
public void test01(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
DeptService deptService = context.getBean("deptServiceImpl",DeptService.class);
List<Dept> list = deptService.getAll();
for(Dept d: list){
System.out.println(d);
}
}