Spring中的JDBC模块

2023-11-09

什么是Spring JDBC

Spring是一个一站式框架,提供了对JDBC的管理封装
Spring自身也提供了控制层的SpringMVC 和持久层的Spring JdbcTemplate。
提供用于执行sql的方法
JDBC模块对事务进行管理

在这时,大多都采用MyBatis对数据库进行操作。

Mybatis框架概述和搭建详解

Spring JDBC的开发步骤

下载 Spring JdbcTemplate 的jar包

        <!-- spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

Spring数据链接不直接参与数据库的连接,所以就要使用第三方的组件来连接数据库。(DBCP、c3p0、阿里druid(德鲁伊))称为数据库连接组件
与数据库做连接,我们再加一个阿里的数据源,它还带有数据库连接池的计数。还有着sql监控作用

阿里druid数据库连接包含有三大功能:

  1. 基本的数据库连接 封装了jdbc。
  2. 数据库连接池 (频繁的连接数据库、创建销毁连接对象开销较大。所以就出现了创建一个连接对象的池子,与数据库交互时,可以先从连接池中获取连接对象,用完后不进行销毁,只是还回到连接池中,这样就减少了创建销毁时的开销。就是提前创建好连接对象,有数据请求时直接用就行了)
        <!-- 阿里数据源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

顺便加上一个mysql的驱动包,做到与mysql数据库的连接

        <!-- mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>

导入属性文件

因为我将数据库密码账户等信息提取到一个 .properties属性文件中去了。

我也将对数据库的连接的配置文件也与总的Spring分离出来了。
在这里插入图片描述
在总的Spring配置文件中导入对数据库的配置文件的内容。

    <import resource="db.xml"></import>
    <!--导入db.xml的配置文件-->

在这里插入图片描述

config.properties文件里的内容

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
ume=root
pwd=wasd
initialSize=5
maxActive=15

然后在数据库连接的配置文件中导入属性文件

<context:property-placeholder location="config.properties"></context:property-placeholder>

Spring读取到自己建的文件属性

管理数据源对象

spring 管理与数据库链接 (数据源)

 <!--配置Druid的数据库连接对象-->
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${driverClassName}"></property>
        <property name="url" value="${url}"></property>
        <property name="username" value="${ume}"></property>
        <property name="password" value="${pwd}"></property>
        <property name="initialSize" value="${initialSize}"></property>
        <!--initialSize初始化几个-->
        <property name="maxActive" value="${maxActive}"></property>
        <!--maxActive最大创建几个连接池-->
    </bean>

在配置文件中创建JdbcTemplate对象

    <!--Spring提供的JdbcTemplate封装类-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="druidDataSource"></property>
        <!--将德鲁伊Druid注入到Spring提供的JdbcTemplate中去-->
    </bean>

JdbcTemplate 中常用的方法

execute:无返回值,可执行 ddl,增删改语句 ;

update:执行新增、修改、删除语句;

queryForXXX:执行查询相关语句;

测试

在所需要的类中获得JdbcTemplate这个在bean中通过bean创建的对象

    @Autowired//注入JdbcTemplate作为对数据库的连接
    JdbcTemplate jdbcTemplate;

UserDao文件是向数据库发送数据库信息的

update执行数的增、删、改

  1. 添加信息
package com.demo.spring.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository(value = "userDao")
public class UserDao {

    @Autowired//注入JdbcTemplate作为对数据库的连接
    JdbcTemplate jdbcTemplate;

    public void save() {
        //使用Spring对jdbc的封装类,发送sql,默认是自动提交事务的
        jdbcTemplate.update("insert into admin(account,password,sex) values (?,?,?)","jim","111","男");
    }
}
package com.demo.spring.service;

import com.demo.spring.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service(value = "userService")
public class UserService {

    @Autowired
    private UserDao userDao;

    //在这里通过在Spring的注入将UserDao赋给UserService中的userDao属性
    // 然后在UserService中的直接使用
    public void saveUser() {
        System.out.println("这是UserService中的saveUser中的方法");
        userDao.save();
    }
}

测试代码:

package com.demo.spring.test;

import com.alibaba.druid.pool.DruidDataSource;
import com.demo.spring.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test2 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");

        UserService userService = applicationContext.getBean("userService", UserService.class);

        //调用UserService中的saveUser方法
        userService.saveUser();
    }
}

测试结果:
在这里插入图片描述
在这里插入图片描述

jdbcTemplate.update的结果是有返回值的的,返回值是一个int型的,意为在数据库中有几行收到了改变

package com.demo.spring.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository(value = "userDao")
public class UserDao {

    @Autowired//注入JdbcTemplate作为对数据库的连接
    JdbcTemplate jdbcTemplate;

    public void save() {
        //使用Spring对jdbc的封装类,发送sql,默认是自动提交事务的
        //update一般做的都是增、删、改的操作
        int a = jdbcTemplate.update("insert into admin(account,password,sex) values (?,?,?)","jim","111","男");
        //jdbcTemplate.update的结果是有返回值的的,返回值是一个int型的,意为有几行收到了改变
        System.out.println(a);
    }
}

再跑test文件可以得到结果:
在这里插入图片描述
添加了一条数据,所以在数据库中就只有一行数据得到了改变。

  1. 删除数据
    在这里插入图片描述
    删除id>17的数据,应该是删除两条的数据
package com.demo.spring.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository(value = "userDao")
public class UserDao {

    @Autowired//注入JdbcTemplate作为对数据库的连接
    JdbcTemplate jdbcTemplate;

    public void save() {
        //使用Spring对jdbc的封装类,发送sql,默认是自动提交事务的
        //update一般做的都是增、删、改的操作
        int a = jdbcTemplate.update("delete from admin where id > ?",17);
        //jdbcTemplate.update的结果是有返回值的的,返回值是一个int型的,意为有几行收到了改变
        System.out.println(a);
    }
}

这些test测试运行代码(和上面的都一样)

package com.demo.spring.test;

import com.alibaba.druid.pool.DruidDataSource;
import com.demo.spring.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test2 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");

        UserService userService = applicationContext.getBean("userService", UserService.class);

        //调用UserService中的saveUser方法
        userService.saveUser();
    }
}

控制台输出结果如下图:控制台也显示在数据控中改变了两行的数据。
在这里插入图片描述
在这里插入图片描述

修改和增、删也都大同小异

execute不返回值,可执行 ddl语句,也可以执行增删改语句

package com.demo.spring.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository(value = "userDao")
public class UserDao {

    @Autowired//注入JdbcTemplate作为对数据库的连接
    JdbcTemplate jdbcTemplate;

    public void save() {
        //使用Spring对jdbc的封装类,发送sql,默认是自动提交事务的
        //execute 没有返回值,执行的是ddl语句,当然也可以执行的增删改的语句
        jdbcTemplate.execute("create table test(id int)");
    }
}

运行测试代码

package com.demo.spring.test;

import com.alibaba.druid.pool.DruidDataSource;
import com.demo.spring.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test2 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");

        UserService userService = applicationContext.getBean("userService", UserService.class);

        //调用UserService中的saveUser方法
        userService.saveUser();
    }
}

在这里插入图片描述

在数据库中也添加了一个所加的数据库表在这里插入图片描述

queryForXXX:执行查询相关语句

返回一个简单类型的
package com.demo.spring.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository(value = "userDao")
public class UserDao {

    @Autowired//注入JdbcTemplate作为对数据库的连接
    JdbcTemplate jdbcTemplate;

    public void save() {
        //使用Spring对jdbc的封装类,发送sql,默认是自动提交事务的
			//通过jdbcTemplate.queryForObject来查询数据库的语言
        int a = jdbcTemplate.queryForObject("select count(*) from admin",Integer.class);
        System.out.println(a);
    }
}

还是通过Test来测试代码

package com.demo.spring.test;

import com.alibaba.druid.pool.DruidDataSource;
import com.demo.spring.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test2 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");

        UserService userService = applicationContext.getBean("userService", UserService.class);

        //调用UserService中的saveUser方法
        userService.saveUser();
    }
}

查询总共有几条数据,查询结果应该为3条,控制台输出也是3格。

在这里插入图片描述

数据库表中的数据
在这里插入图片描述

返回一个对象的数据
package com.demo.spring.dao;

import com.demo.spring.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import java.sql.ResultSet;
import java.sql.SQLException;

@Repository(value = "userDao")
public class UserDao {

    @Autowired//注入JdbcTemplate作为对数据库的连接
    JdbcTemplate jdbcTemplate;

    public void save() {
        //使用Spring对jdbc的封装类,发送sql,默认是自动提交事务的


//        这里就需要创建一个匿名的内部类的方式来接受数据库传来的数据,第二个参数必须为数组,数组里面的为传递进去的值
//        当然用Spring写向数据库中传输的方式远没有用Mybatis方便的,所以这里也就不再用Spring向数据库传输数据
        Admin admin = jdbcTemplate.queryForObject("select * from admin where id = ?", new Object[]{15},
                new RowMapper<Admin>() {
                    @Override
                    public Admin mapRow(ResultSet resultSet, int i) throws SQLException {
                        Admin admin1 = new Admin();
                        admin1.setId(resultSet.getInt("id"));
                        admin1.setAccount(resultSet.getString("account"));
                        admin1.setPassword(resultSet.getString("password"));
                        admin1.setSex(resultSet.getString("sex"));
                        return admin1;
                    }
                });
        System.out.println(admin);
    }
}

同Mybatis都一样,也是需要创建一个对应的类来疯转保存数据

package com.demo.spring.model;

public class Admin {

    private Integer id;
    private String account;
    private String password;
    private String sex;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Admin{" +
                "id=" + id +
                ", account='" + account + '\'' +
                ", password='" + password + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}

执行运行的测试代码:

package com.demo.spring.test;

import com.alibaba.druid.pool.DruidDataSource;
import com.demo.spring.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test2 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");

        UserService userService = applicationContext.getBean("userService", UserService.class);

        //调用UserService中的saveUser方法
        userService.saveUser();
    }
}

运行结果如下:
在这里插入图片描述

返回多个对象的数据
package com.demo.spring.dao;

import com.demo.spring.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

@Repository(value = "userDao")
public class UserDao {

    @Autowired//注入JdbcTemplate作为对数据库的连接
    JdbcTemplate jdbcTemplate;

    public void save() {
        //使用Spring对jdbc的封装类,发送sql,默认是自动提交事务的
        
        List<Map<String,Object>> list = jdbcTemplate.queryForList("select * from admin ");
        System.out.println(list);
    }
}

在这个当中是用数据库中的列名作为键名的(但是不建议用,也没事,反正现在Spring对数据库数据的接受也就本身用的不多,都是用Mybatis来对数据库的操作)

运行测试代码结果如下:
在这里插入图片描述
使用另一种方式来拿数据

package com.demo.spring.dao;

import com.demo.spring.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

@Repository(value = "userDao")
public class UserDao {

    @Autowired//注入JdbcTemplate作为对数据库的连接
    JdbcTemplate jdbcTemplate;

    public void save() {
        //使用Spring对jdbc的封装类,发送sql,默认是自动提交事务的

        List<Admin> admins = jdbcTemplate.query("select * from admin ", new RowMapper<Admin>() {
            @Override
            public Admin mapRow(ResultSet resultSet, int i) throws SQLException {
                Admin admin1 = new Admin();
                admin1.setId(resultSet.getInt("id"));
                admin1.setAccount(resultSet.getString("account"));
                admin1.setPassword(resultSet.getString("password"));
                admin1.setSex(resultSet.getString("sex"));
                return admin1;
            }
        });

        System.out.println(admins);

    }
}

运行测试代码

输出结果:
在这里插入图片描述
上一篇:>>> Spring Bean的管理(IOC 依赖注入)
下一篇:>>> Spring中AOP的概述、搭建和实现

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring中的JDBC模块 的相关文章

随机推荐

  • 【python】深入了解Selenium-PageObject

    1 PageObject 定义 Page Object 简称PO 模式 是Selenium实战中最为流行 并且是自动化测试中最为熟悉和推崇的一种设计模式 在设计自动化测试时 把页面元素和元素的操作方法按照页面抽象出来 分离成一定的对象 然后
  • Sophus使用记录

    sophus库是一个基于Eigen的C 李群李代数库 可以用来方便地进行李群李代数的运算 头文件 主要用到以下两个头文件 include
  • 基于水文规约SL651-2014的“定时报”解析

    一 概述 水文监测数据通信规约SL651 2014规定了水文监测系统中前端传感器与遥测终端以及中心站之间的数据通信协议 本文将以M21F系列RTU为例 详细描述符合SL651 2014数据通信规约标准的遥测站终端与中心站之间的 定时报 报文
  • Go开源库Excelize介绍,电子Excel表格操作强大的库

    Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库 基于 ECMA 376 ISO IEC 29500 国际标准 项目作者是续 日 现任阿里巴巴软件工程师 曾就职百度 奇虎360公司 前百度Go语言编程委员
  • 循环监测b站用户粉丝数、舰长数及增量 程序

    前言 开发语言 python 3 8 功能介绍 循环监测b站用户粉丝数 舰长数及增量 实时打印 并存入数据库中 使用说明 运行 双击运行 bat 输入用户UID 回车 再输入循环周期 回车 即可开始监测 ps 数据存储是sqlite 可以使
  • 如何处理地址不对齐指令?

    连续不断是处理器取指的另一个目标 如果处理器在每一个时钟周期都能取一条指令 就可以源源不断的为处理器提供后续指令流 而不会出现空闲的时钟周期 地址不对齐导致问题 不管是从指令缓存 还是从ITCM中取指令 若处理器遇到了一条地址不对齐的指令
  • H桥L298N两端输出电压不同的原因

    目录 1 问题的证明 2 L298N的原理 3 问题的解决 在做拉力车的时候 电机总是转速不同 起初以为是电机问题 但换成新电机后仍然存在这种问题 又怀疑是导线的问题 因为两电机的导线粗细不同 误以为PWM调速时会被影响 后来锁定问题 就是
  • Leetcode337:打家劫舍 III

    在上次打劫完一条街道之后和一圈房屋后 小偷又发现了一个新的可行窃的地区 这个地区只有一个入口 我们称之为 根 除了 根 之外 每栋房子有且只有一个 父 房子与之相连 一番侦察之后 聪明的小偷意识到 这个地方的所有房屋的排列类似于一棵二叉树
  • 2605. 从两个数字数组里生成最小数字

    文章目录 Tag 题目来源 题目解读 解题思路 方法一 枚举比较法 方法二 集合的位运算表示法 写在最后 Tag 贪心 位运算 数组 题目来源 2605 从两个数字数组里生成最小数字 题目解读 给定两个各自只包含数字 1 到 9 的两个数组
  • ImportError: No module named ‘seaborn‘

    在已经使用pip install seaborn 或者 conda install seaborn 之后 在虚拟环境下 启动jupyter 但是报出下面错误 1 需要去考虑一下你的内核是不是发生改变 或者建议重启一下内核 注意 一般情况之下
  • ​微众区块链×华南理工:连续四年深度合作,共育区块链+ESG复合型人才

    近日 在经历了六周的紧张学习后 来自华南理工大学软件学院的同学们完成了第四届 区块链实训课 的答辩 该实训课由微众区块链与华南理工大学共建 也是双方第四次合作的成果 令人耳目一新的是 本次实训课在往年成熟的课程体系之上 新增了一门叫做 开源
  • thinkphp 随笔——模型更新成功返回的数据

    thinkphp 随笔 模型更新成功返回的数据 先上图 这是我修改了一个表内的 value 字段 修改成功之后返回了这个字段的最新值 thinkphp 随笔 个人博客 http www sharekong xyz 欢迎访问
  • 关于《时间管理》

    01 为什么需要时间管理 我们 多数人不是富二代 也不是官二代 如何比得过白富美和高富帅 在万千的不公平中 还有这唯一公平的资源 时间 好好把你的时间加以管理 以弥补并创造出其他的资源 人的一生两个最大的财富是 你的才华和你的时间 才华越来
  • 机器学习——线性回归模型及python代码实现

    机器学习 公式推导与代码实践 鲁伟著读书笔记 在机器学习的学习过程中 相信大家首先要学习的就是线性模型 而线性模型中 线性回归 Linear Regression 是一种非常经典方法 现在我从线性回归的数学原理出发 手推数学公式 并结合py
  • winform相关问题收录

    一 WinForm 代码实现以管理员身份运行 from http www cnblogs com 08shiyan p 3267165 html MY http user qzone qq com 319636886 2 二 winfrom
  • java EasyExcel 的使用

    java 中 excel 的写入和导出使用的是 阿里巴巴的 EasyExcel
  • 解决ES6.6.0开启锁定内存后不能重新,报错“memory locking requested for elasticsearch process but

    错误原因就是我们在配置文件里开启了 bootstrap memory lock true 不需要次需求的话 改成false就好 如果需要开启 按照下面来 亲测可行 root localhost 234 grep Ev etc elastic
  • FreeSwitch学习笔记

    FreeSwitch FreeSwitch应用场景 在线计费 预付费功能 电话路由服务器 语音转码服务器 支持资源优先权和QoS的服务器 多点会议服务器 IVR 语音通知服务器 VoiceMail服务器 PBX应用和软交换 应用层网关 防火
  • 我眼中的全栈工程师

    前言 全栈工程师 一直以来都是软件行业热议的话题 只要提到全栈工程师大家就觉得很高大上 当然也有人直接说万金油而已 往好听说是全栈工程师 综合能力全 但是实际上就是什么都会哪都不精通 有人唾之以鼻 也有人称赞不已 对于许多创业公司来讲 全栈
  • Spring中的JDBC模块

    文章目录 什么是Spring JDBC Spring JDBC的开发步骤 下载 Spring JdbcTemplate 的jar包 导入属性文件 管理数据源对象 在配置文件中创建JdbcTemplate对象 JdbcTemplate 中常用