Spring 教程 (二)

本文详细介绍Spring框架如何集成数据库及Mybatis,包括Spring配置数据库连接、使用Druid连接池、事务管理及Mybatis集成等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

本文只做记录使用,参考了其他文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值