Spring 整合mybatis
1.创建java项目:
导入jar包(E:smjar)
2.创建属性文件:
src下创建两个属性文件,分别为:
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
注意:jdbc中原本的driver和username需要更改,【此处修改变量名为:driverClass ,user】。
因为配置文件里引用的时候, u s e r n a m e 和 {username} 和 username和{driver} 会引入系统文件!
3.在src下先创建mybatis的核心配置文件:
1.Mybatis核心配置文件中的jdbc.properties在前面已经配置过了
2.类型别名正常配置
3.环境变量交给Spring的核心配置文件处理
4.mapper加载映射文件 交给Spring的核心配置文件处理
<?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.在src下再创建Spring的核心配置文件:(重点)
创建ApplicationContext.xml
注意:下面核心配置文件中tx是用于配置事务通知的
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
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: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.配置SqlSessionFactory 对象-->
<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:aspectj-autoproxy/>
<!--7.声明事务管理的对象-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--8.配置事务的传播策略-->
<!--<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!–name:使用通配符 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>-->
<!--配置事务支持注解-->
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
xml中8 9 注释原因:在接口实现类中使用了注解
@Transactional(propagation= Propagation.REQUIRED)
5.创建实体类:
@Component /*平替<bean>标签*/
@Data /*自动生成get/set/toString*/
@AllArgsConstructor /*自动生成全参*/
@NoArgsConstructor /*自动生成无参*/
public class Dept {
private Integer deptno;
private String dname;
private String loc;
}
6.创建 mapper接口
public interface DeptMapper {
int insDept(Dept dept);
int deleDept(int deptno);
int updDept(Dept dept);
List<Dept> selectDepts();
}
7.创建mapper映射文件:
<?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="selectDepts" resultType="dept">
select * from dept
</select>
<insert id="insDept" parameterType="dept">
insert into dept(deptno,dname,loc) values(#{deptno},#{dname},#{loc})
</insert>
<update id="updDept" parameterType="dept">
update dept set dname=#{dname},loc=#{loc} where deptno=#{deptno}
</update>
<delete id="deleDept" parameterType="int">
delete from dept where deptno=#{deptno}
</delete>
</mapper>
8.创建service接口
public interface DeptService {
boolean addDept(Dept dept);
boolean updDept(Dept dept);
boolean removeDept(int deptno);
List<Dept> getAll();
}
9.创建serviceImpl接口实现类
接口实现类中应写3个注解
分别是@Service 专用于接口实现类
@Transactional 用于注解管理事务的实现
@Autowired 依赖注入
@Service
@Transactional(propagation= Propagation.REQUIRED) /*等价替换xml文件中8 9 */
public class DeptServiceImpl implements DeptService {
@Autowired /*byType 进行依赖注入*/
private DeptMapper deptMapper;
@Override
public boolean addDept(Dept dept) {
return deptMapper.insDept(dept)==1?true:false;
}
@Override
public boolean updDept(Dept dept) {
int i=0;
i = deptMapper.insDept(dept);
dept.setLoc("长春");
i += deptMapper.updDept(dept);
if (i==2){
return true;
}else {
return false;
}
// return deptMapper.updDept(dept)==1?true:false;
}
@Override
public boolean removeDept(int deptno) {
return deptMapper.deleDept(deptno)==1?true:false;
}
@Override
public List<Dept> getAll() {
return deptMapper.selectDepts();
}
}
10.创建切面类
将不属于业务层的代码提取出来,使业务层代码更纯粹
@Aspect 定义切面类
@Component
@Aspect
public class Advice {
@Before("execution(* com.jr.service.impl.DeptServiceImpl.*(..))")
public void check(){
System.out.println("权限检查");
}
@After("execution(* com.jr.service.impl.DeptServiceImpl.*(..))")
public void log(){
System.out.println("日志记录");
}
}
11.创建测试类
public class DeptTest {
@Test
public void selectTest(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("ApplicationContext.xml");
DeptService deptService=applicationContext.getBean("deptServiceImpl",DeptService.class);
List<Dept> list=deptService.getAll();
for (Dept d:list){
System.out.println(d);
}
}
}
12.注解补充
-
@Component 创建类对象,相当于配置
bean的ID默认为类名首字母小写,也可以指定ID,例如 @Component(“stu”) -
@Service 与@Component功能相同.
2.1 写在ServiceImpl类上. -
@Repository 与@Component功能相同.
3.1 写在数据访问层类上. -
@Controller 与@Component功能相同.
4.1 写在控制器类上. -
@Resource(不需要写对象的get/set)
5.1 java中的注解
5.2 默认按照 名称
注入,如果没有名称对象,按照byType注入
5.2.1 建议把对象名称和spring容器中对象名相同 -
@Autowired(不需要写对象的get/set)
6.1 spring的注解
6.2 默认按照byType注入. -
@Value() 获取properties文件中内容
-
@Pointcut() 定义切点
-
@Aspect() 定义切面类
-
@Before() 前置通知
-
@After 后置通知
-
@AfterReturning 后置通知,必须切点正确执行
-
@AfterThrowing 异常通知
-
@Around 环绕通知
使用注解,一定要在配置文件中声明注解扫描
<context:component-scan base-package="包名路径"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>