目录
1,spring为什么要和持久层技术整合
javaee开发需要持久层进行数据库的访问操作。
jdbc或者是mybatis在进行开发时存在大量的代码冗余。
spring基本模板设计模式对持久层进行了封装。
2,可以与哪些进行整合呢?
jdbc jdbcplate
Hibernate -HibernateTemplate jpa
Mybatis -SqlSessionFactoryBean MapperScannerConfiguration。
mybatis开发步骤
1,实体类。2,实体类指定别名。3,数据库建表。4,创建dao接口。5,书写Mapper映射文件。6,注册Mapper文件。7,调用API。
导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.logback-extensions/logback-ext-spring -->
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>0.1.4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
spring配置文件编码
<!--配置连接池-->
<context:property-placeholder location="classpath:mysql.properties" />
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--创建sqlsessionFactoryBean-->
<!-- 这些内容都是mybatis主配置文件中的信息,所以我们可以把主配置文件的信息省略-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定数据源-->
<property name="dataSource" ref="dataSource"></property>
<!-- 指定别名包-->
<property name="typeAliasesPackage" value="org.entity"></property>
<!-- 指定Mapper文件的位置-->
<property name="mapperLocations">
<!-- 这是一个list数组-->
<list>
<value>classpath:org/dao/Mapper/*Mapper.xml</value>
</list>
</property>
</bean>
<!--spring工厂 存储 mybatis根据dao接口创建dao的实现类,id是接口名小驼峰。-->
<bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"></property>
<!-- dao接口所在包-->
<property name="basePackage" value="org.dao"></property>
</bean>
调用代码:
/**
* 用于测试,spring和mybatis的整合
* @throws IOException
*/
@org.junit.Test
public void test1() throws IOException {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
// 根据spring提供的MapperScannerConfigure
UserDao us =(UserDao)ctx.getBean("userDao");
List all= us.findAll();
for (Object o : all) {
System.out.println(o);
}
}
结果:
spring控制事务开发【基于mybatis】
jdbc:Connection的操作。con.setAutoCommit 、con.commit 、con.rollback;
mybatis:SqlSession的操作。factory.getSqlSession(AutoCommit)、session.commit 、session.rollback。
结论:控制事务的底层,都是connection对象。
spring控制事务的开发方式-----【aop】。
-----额外功能是事务。
我们来写事务
原始对象
XXXServiceImp类。dao作为service的成员变量,依赖注入的方法进行赋值
额外功能
MethodInterceptor
Public void invoke(MethodInvocation){
Try{
Connection.setAutoCommit=false;
Object ret = invocation.proceed()
Conn.commit
}catch{
Conn.rollback
}
}
spring来替我们写事务
该额外功能类位于org.springframework.jdbc.datasource.DataSourceTransactionManager;
为了提高效率,需要传入的不是连接(Connection),而是连接池(DataSource)。
<!-- 额外功能-事务-->
<!-- DataSourceTransationManager-->
<bean id="dataSourceTransationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
事务应用注解@Transactional
事务【额外功能能给哪些业务方法】。
该注解放在类上,全部方法加注解。该注解放在方法上,该方法加注解。
组装事务
<!-- 定义aop代理的方法,JDK false【default】 cglib true 可以验证,事务功能通过aop添加的-->
<tx:annotation-driven transaction-manager="dataSourceTransationManager" proxy-target-class="false"/>
@Transactional注解细节
业务涉及到数据库 【增删改】 @Transactional
业务涉及到数据库查询操作【查】@Transactional(propagation = progation.supports,readonly=true);
基于XML标签的事务配置方式【更好的理解原理】
aop:1,原始对象。2,额外功能。3,切入点。4,组装。
关键:额外功能
<tx:advice id="tx" transaction-manager="dataSourceTransationManager">
<tx:attributes>
//表示修改操作【增删改】
<tx:method name="modify*" />
// 表示除修改操作以外的操作【查询】
<tx:method name="*" propagation='supports' readonly = true/>
</tx:attributes>
</tx:advice>
组装切面
<aop:config>
<aop:pointcut id="pc" expression="within(com.project..service..*)"/>
<aop:advisor advice-ref="tx" pointcut-ref="pc"></aop:advisor>
</aop:config>