Spring JDBC配置与讲解

目录

  • [一、Spring JDBC概述](#一、Spring JDBC概述)
  • [二、Spring JDBC的使用](#二、Spring JDBC的使用)
    • [1、Spring JDBC的增加操作](#1、Spring JDBC的增加操作)
    • [2、Spring JDBC的修改操作](#2、Spring JDBC的修改操作)
    • [3、Spring JDBC的删除操作](#3、Spring JDBC的删除操作)
    • [4、Spring JDBC的查询操作](#4、Spring JDBC的查询操作)
  • [三、Spring JDBC的事务](#三、Spring JDBC的事务)

一、Spring JDBC概述

Spring Data JDBC 是 Spring Data 项目的一部分,它提供了一种简化的数据访问方式,用于与关系型数据库进行交互。与传统的 ORM 框架相比,Spring Data JDBC 更加轻量级,并且更注重直接映射数据库表结构和 SQL 查询的控制。它基于 JDBC 驱动程序,提供了一套简洁的 API 和注解,使开发人员能够通过简单的 Java 对象来表示数据库表,并通过自动生成的 SQL 语句执行常见的 CRUD 操作。Spring Data JDBC 还支持复杂的关联关系、查询方法的定义和自定义 SQL 查询等功能,使开发人员能够更灵活地操作数据库。

1、Spring JDBC需要配置的依赖

我们创建好maven项目之后,需要对maven项目添加相对应的依赖,在本文章当中如果我们想要使用Spring JDBC的时候需要添加如下的依赖 :

xml 复制代码
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.3.21</version>
    </dependency>

    <!--mysql驱动包-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.6</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.30</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.12</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <!--AOP联盟-->
    <dependency>
      <groupId>aopalliance</groupId>
      <artifactId>aopalliance</artifactId>
      <version>1.0</version>
    </dependency>
    <!--Spring Aspects-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
    <!--aspectj-->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.3</version>
    </dependency>

其中使用jdbc的核心依赖是:

xml 复制代码
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.3.21</version>
    </dependency>

    <!--mysql驱动包-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.6</version>
    </dependency>

使用AOP的依赖是:

xml 复制代码
 <!--AOP联盟-->
    <dependency>
      <groupId>aopalliance</groupId>
      <artifactId>aopalliance</artifactId>
      <version>1.0</version>
    </dependency>
    <!--Spring Aspects-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
    <!--aspectj-->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.3</version>
    </dependency>

2、Spring配置项文件配置

我们使用Spring AOP、SpringIoC、Spring JDBC的情况下,我们需要在maven项目中的resources文件下创建Spring的配置项文件,并且进行配置。

Spring.xml的配置如下:

xml 复制代码
<?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:tx="http://www.springframework.org/schema/tx"
       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
           http://www.springframework.org/schema/aop/spring-aop.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
               <!-- 配置数据源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/springjdbc"/>
        <property name="username" value="root"/>
        <property name="password" value="12171032"/>
    </bean>

    <!-- 配置 JdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

其中: xmlns:tx="http://www.springframework.org/schema/tx"是为了防止事务爆红把必须添加的,不添加使用事务的时候会爆红。

需要在Spring配置自己的数据库,以及配置jdbcTemplate,需要将这两部分交给IoC容器管理。

二、Spring JDBC的使用

该项目的目录如下创建:

entity目录中查询返回来的结果。

dao层用来存放执行和数据库交互的文件的目录。

User类创建如下:

java 复制代码
package com.example.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

}

如果想要使用lombok的情况下,就得按照上面情况引入lombok依赖:

建立的数据库可执行代码如下(需要自己建立好数据库,这里只提供创建表的sql语句):

sql 复制代码
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性别',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'老王','2018-02-27
17:47:08','男','北京'),(2,'熊大','2018-03-02 15:09:37','女','上海'),(3,'熊二','2018-03-04
11:34:34','女','深圳'),(4,'光头强','2018-03-04 12:04:06','男','广州');

Test测试文件:

java 复制代码
public class Test1 {

    private ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring.xml");
    private JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean(JdbcTemplate.class);
    }

测试文件得利用DI将jdbcTemplate加载到当前文件当中

1、Spring JDBC的增加操作

jdbc中的新增操作:

java 复制代码
    @Test
    public void add(){
        String sql = "insert into user(username,sex,address) values('as','男','上海')";
        jdbcTemplate.execute(sql);
    }

2、Spring JDBC的修改操作

java 复制代码
    @Test
    public void update(){
        String sql = "update user set username ='刘纯亚' where id = 1";
        jdbcTemplate.update(sql);
    }

3、Spring JDBC的删除操作

java 复制代码
    @Test
    public void delete(){
        String sql = "delete from user where id = ?";
        jdbcTemplate.update(sql,1);
    }

4、Spring JDBC的查询操作

java 复制代码
    @Test
    public void searchAll(){
        String sql = "select * from user";
        List<User> userList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));
        for(User user:userList){
            System.out.println(user);
        }
    }

三、Spring JDBC的事务

案列A对B转账,A的钱少100,B的钱多100,两者具有原子性,要不同时成功,要不同时失败。数据库中的数据如下:

1、xml的形式进行事务

对Spring.xml进行修改:

xml 复制代码
    <bean id="txtManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <bean id="adaoImpl" class="com.example.dao.impl.AdaoImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>
    <tx:advice id="txAdvice" transaction-manager="txtManager">
        <tx:attributes>
            <tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:pointcut id="pc" expression="execution(* com.example.dao.impl.AdaoImpl.transfer(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
    </aop:config>
xml 复制代码
 <bean id="txtManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

用来加载DataSourceTransactionManager,上面的操作是通过AOP对原本的事务进行增强,而不是通过修改原本的代码。

AOP操作:

xml 复制代码
    <aop:config>
        <aop:pointcut id="pc" expression="execution(* com.example.dao.impl.AdaoImpl.transfer(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
    </aop:config>

Adao和Adaoimpl中的代码如下:

java 复制代码
package com.example.dao.impl;

import com.example.dao.Adao;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.jdbc.core.JdbcTemplate;
@NoArgsConstructor
@Data
@AllArgsConstructor
public class AdaoImpl implements Adao {
    private JdbcTemplate jdbcTemplate;
    @Override
    public void transfer(String A, String B, int money) {
        String sql1 = "update peoplemoney set money = money-? where id = ?";
        String sql2 = "update peoplemoney set money = money+? where id = ?";
        jdbcTemplate.update(sql1,money,A);
        jdbcTemplate.update(sql2,money,B);
    }
}
java 复制代码
package com.example.dao;

public interface Adao {
    public void transfer(String A,String B,int money);
}

测试类中的代码:

java 复制代码
    @Test
    public void  m1(){
        Adao adaoImpl = (Adao) applicationContext.getBean("adaoImpl");
        adaoImpl.transfer("1","2",100);
        System.out.println(adaoImpl);
    }

当事务没有回滚的时候,可以实现A减少100,B增加100。

自动添加错误之后;

测试结果:

数据库中的数据没有发生改变出现了事务回滚。

2、@Transactional注解

AdaoImpl中的代码修改如下:

java 复制代码
package com.example.dao.impl;

import com.example.dao.Adao;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@NoArgsConstructor
@Data
@AllArgsConstructor

public class AdaoImpl implements Adao {
    private JdbcTemplate jdbcTemplate;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void transfer(String A, String B, int money) {
        String sql1 = "update peoplemoney set money = money-? where id = ?";
        String sql2 = "update peoplemoney set money = money+? where id = ?";
        jdbcTemplate.update(sql1,money,A);
        System.out.println(1/0);
        jdbcTemplate.update(sql2,money,B);
    }
}

Spring.xml中的代码修改如下:

xml 复制代码
<!--    <tx:advice id="txAdvice" transaction-manager="txtManager">-->
<!--        <tx:attributes>-->
<!--            <tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>-->
<!--        </tx:attributes>-->
<!--    </tx:advice>-->
<!--    <aop:config>-->
<!--        <aop:pointcut id="pc" expression="execution(* com.example.dao.impl.AdaoImpl.transfer(..))"/>-->
<!--        <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>-->
<!--    </aop:config>-->
    <tx:annotation-driven transaction-manager="txtManager"></tx:annotation-driven>
    <context:component-scan base-package="com.example"></context:component-scan>

注释掉AOP等保留DataSourceTransactionManager,配合@Transactional使用就可以完成事务。

相关推荐
武子康17 分钟前
Java-74 深入浅出 RPC Dubbo Admin可视化管理 安装使用 源码编译、Docker启动
java·分布式·后端·spring·docker·rpc·dubbo
宇钶宇夕39 分钟前
S7-1200 数字量模块接线:从源型 / 漏型到信号板扩展全解析
运维·服务器·数据库·程序人生·自动化
Boop_wu40 分钟前
【Java SE】抽象类
java·开发语言
lemon3106241 小时前
Linux Java环境配置
java·开发语言
Brookty1 小时前
Java线程创建与运行全解析
java·开发语言·后端·学习·java-ee·线程
野生程序员y1 小时前
spring容器的bean是单例还是多例的?线程安全吗?
java·后端·spring
朝九晚五ฺ1 小时前
【MySQL基础】MySQL事务详解:原理、特性与实战应用
数据库·mysql
bing_1581 小时前
我写的 @Service 类就是一个 Bean 吗?
spring·bean·ioc
星辰大海的精灵2 小时前
Java 线程池的工作原理及实践
java·后端·架构
我命由我123452 小时前
Spring Boot - Spring Boot 集成 MyBatis 分页实现 手写 SQL 分页
java·spring boot·后端·sql·spring·java-ee·mybatis