1.Spring 集成数据库
1.1 引入依赖
<!--Druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
1.2 项目结构图
【注意】: SpringConfiguration在上一篇文章Spring 教程(一)_阿肆努力学习中的博客-CSDN博客
1.3 druid.properties 数据库连接配置文件
【注意】:我使用的数据库是8.0的,请换成与自己数据库对应的
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/cs?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8&useUnicode=yes
jdbc.username=root
jdbc.password=root
1.4 application文件配置
【注意】:这里是通过xml配置文件的方式配置,在我们采用SpringConfiguration配置文件替代application.xml后我们采用下面1.5的配置方式
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--开启组件扫描-->
<context:component-scan base-package="cn.zb.spring"/>
<!--引入外部数据库配置文件-->
<context:property-placeholder location="classpath:druid.properties"/>
<!--配置数据库连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--注册JdbcTemplate对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
1.5 DruidConfig配置文件配置
package cn.zb.spring.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
@Configuration
@PropertySource(value = "classpath:druid.properties") //引入druid配置文件
public class DruidConfig {
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DruidDataSource getDDruidDataSource(){
DruidDataSource dataSource=new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
// 不通过配置文件获取,直接传属性
// @Bean
// public DruidDataSource getDDruidDataSource(){
// DruidDataSource dataSource=new DruidDataSource();
// dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
// dataSource.setUrl("jdbc:mysql://localhost:3306/cs?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8&useUnicode=yes");
// dataSource.setUsername("root");
// dataSource.setPassword("root");
// return dataSource;
// }
//创建JdbcTemplate对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource){
JdbcTemplate jdbcTemplate=new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
}
1.6 编写dao接口(不提供),以及dao的实现类,entity实体类对应数据表的字段(不提供)
package cn.zb.spring.dao.impl;
import cn.zb.spring.dao.UsersDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.Map;
@Repository
public class UsersDaoImpl implements UsersDao {
// DruidConfig 类中已经注册bean jdbcTemplate,所以这里直接获取
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void getByUserId(Long userId) {
//编写sql语句,?代表参数,所以jdbcTemplate调用方法传参时要传参数
String sql="select * from users where user_id=?";
Map<String, Object> map = jdbcTemplate.queryForList(sql,userId).get(0);
System.out.println(map.toString());
}
}
2.Spring 中的事务管理
2.1 application.xml配置文件开启事务
<!--注册事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--开启事务的注解-->
<tx:annotation-driven/>
2.2 注解开启事务
1)编写事务配置类TransactionConfig
package cn.zb.spring.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
@Configuration
public class TransactionConfig {
@Bean(name = "transactionManager")
public PlatformTransactionManager CreateTransactionManager(DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
}
2)在SpringConfiguration配置中心添加注解@EnableTransactionManagement 开启事务
3)下面是一个测试的案例,@Transcationl 声明这个方法的操作受到事务相关监管
2.3 事务的基本要素 ACID
1)原子性(Atomicity): 事务开始后的所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节,事务执行过程中出错,会回滚到事务开始前的状态,所有操作就想没有发生一样。
2)一致性(Consisteny): 事务开始前和结束后,数据库的完整性约束没有被破坏
3)隔离性(loslation):同一时间,只允许一个事务请求同一个数据,不同的事务之间彼此没有任何干扰
4)持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚
2.4 事务的传播行为
1)REQUIRED:如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行
2)REQUIRED_NEW:当前的方法必须启动新事务,并在它自己的事务内运行,如果有事务在运行,应该将它挂起
3)SUPPORTS:如果有事务在运行,当前的方法就在这个事务内运行,否则它可以不运行在事务中
4)NOT_SUPPORTED:当前的方法不应该运行在事务中,如果有运行的事务,将他挂起
5)MANDATORY:当前的方法必须运行在事务内部,如果有运行的事务,就抛出异常
6)NEVER:当前的方法不应该运行在事务中,如果有运行的事务,就抛出异常
7)NESTED:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就启动一个新的事务,并在它自己的事务内运行
2.5 事务的隔离级别
【注意】:事务的隔离级别越高,性能就越低
脏读:一个事务读取到了另外一个事务没有提交的数据
不可重复读:在同一事务中,两次读取同一数据,得到的内容不同
幻读:同一事务中,用同样的操作读取两次,得到的记录数不相同
1)DEFAULT:使用底层数据库的默认隔离级别,对于大多数数据库来说,默认隔离级别都是READ_COMMITED,或者数据库设置了什么我们就用什么
2
)READ_UNCOMMITTED:允许事务读取未被其他事务提交的变更,脏读,不可重复读和幻读的问题都会出现
3)READ_COMMITED:只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍可能出现
4)REPEATABLE_READ:确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题仍然存在5)
5)SERIALIZABLE:确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作,所有并发问题都可以避免,但性能十分低下3.Spring 集成Mybatis
本文只做记录使用,参考了其他文献