Spring JDBC 框架

本文摘抄至实验楼教程:https://www.shiyanlou.com/courses/578/learning/?id=1941

 Spring 框架的核心思想就是建立一个Java对象的大工厂,用户只需要给工程一个指令,工厂就能将用户需要的对象根据配置文件组装好返还给yonghu用户。用户需要做的许多工作则可以写成简单的配置文件。
 传统的使用JDBC的方法,有时候需要结合复杂的SQL语句,还需要去拼装,稍微不注意就有可能出错。Spring JDBC Template正是简化了上述的麻烦而设计出来的。它是对Java原生JDBC的封装,抽象我们常用的一些方法。

 Spring JDBC Template使用Spring的注入功能,可以把DataSource注册到JdbcTemplate之中,其全限定命名为org.springframework.jdbc.core.JdbcTemplate;还需要使用一个Spring的spring-tx包,这个包含了事务管理和异常控制。

 JdbcTemplate主要提供以下五类方法:

  1. execute方法 —— 可以用于执行任何SQL语句,一般执行DDL语句(CREATE TABLE/VIEW/INDEX/SYN/CLUSTER)
  2. update —— update方法用于执行新增、更新、删除等操作,即DML语句(INSERT/UPDATE/DELETE)
  3. batchUpdate方法 —— batchUpdate方法用于执行批处理相关语句。
  4. queryqueryForXXX方法 —— 用于执行查询相关语句,DQL语句。
  5. call方法 —— 用于执行存储过程、函数相关语句。

下面学习如何使用Spring JdbcTemplate实现对数据库的增删改查。

1、数据库准备

本文需要使用数据库,选择使用Mysql,安装教程略过请自行查询相关教程。
创建一个jdbc的数据库,下图:


mysql.png

创建学生表student并插入一条数据:

USE `jdbc`;

CREATE TABLE `student`(`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(16),
`age` INT) ;

INSERT INTO `student` VALUES(1,"weihouye",23);



查询结果:

查询结果.png

2、新增项目

首先创建一个maven工程SpringJdbc,对应pom.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.shiyanlou.jdbc</groupId>
  <artifactId>SpringJdbc</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>SpringJdbc</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring.version>5.1.1.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.46</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>



现在src/main路径下新建目录resources,可以在里面新建Spring bean的配置文件,创建SpringBeans.xml,配置bean如下:

<?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: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/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:23306/jdbc"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

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


3、Spring JdbcTemplate 增

最后在src/shiyanlou/jdbc创建App.java

package com.shiyanlou.jdbc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * Hello world!
 *
 */
public class App 
{
    private static ApplicationContext context;
    public static void main( String[] args )
    {
        context = new ClassPathXmlApplicationContext("SpringBeans.xml");

        JdbcTemplate jt = (JdbcTemplate) context.getBean("jdbcTemplate");
        String sql = "insert into student value(?,?,?)";
        int count = jt.update(sql, 2,"yangzhan",23);
        System.out.println(count);
    }
}

运行结果返回:1 ;数据库中student表中的数据:

image.png


4、Spring JdbcTemplate 删

JdbcTemplate删除数据还是可以通过update()方法实现,修改App.java如下:

package com.shiyanlou.jdbc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * Hello world!
 *
 */
public class App 
{
    private static ApplicationContext context;
    public static void main( String[] args )
    {
        context = new ClassPathXmlApplicationContext("SpringBeans.xml");

        JdbcTemplate jt = (JdbcTemplate) context.getBean("jdbcTemplate");
//        String sql = "insert into student value(?,?,?)";   //增
        String sql = "Delete from `student` where id = ?";
        int count = jt.update(sql,2);
        System.out.println(count);
    }
}

运行打印:1;查看数据库发现,id=2 的数据被删除了:


image.png


5、Spring JdbcTemplate 改

JdbcTemplate 修改数据还是通过update()方法实现的,如下:

package com.shiyanlou.jdbc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * Hello world!
 *
 */
public class App 
{
    private static ApplicationContext context;
    public static void main( String[] args )
    {
        context = new ClassPathXmlApplicationContext("SpringBeans.xml");

        JdbcTemplate jt = (JdbcTemplate) context.getBean("jdbcTemplate");
//        String sql = "insert into student value(?,?,?)";   //增
//        String sql = "Delete from `student` where id = ?";  //删
        String sql = "update `student` set name = ? ,age = ? where id = ?";
        int count = jt.update(sql,"weihouye2",24,1);
        System.out.println(count);
    }
}

运行返回:1 ;查看数据库:id=1 的数据已经被修改。


image.png


6、Spring JdbcTemplate 查

JdbcTemplate查询数据可以通过queryForObject和query来实现,前者用来查询单条数据,后者用来查询多条数据。

 6.1、查询单条数据

首先定义一个Student.java类,用于映射数据库对象,如下:

package com.shiyanlou.jdbc;

/**
 * Created by Administrator on 2019/11/3.
 */
public class Student {
    private int id;
    private String name;
    private int age;

    public Student() {
    }

    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

修改App.java代码如下:

package com.shiyanlou.jdbc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

/**
 * Hello world!
 *
 */
public class App 
{
    private static ApplicationContext context;
    public static void main( String[] args )
    {
        context = new ClassPathXmlApplicationContext("SpringBeans.xml");

        JdbcTemplate jt = (JdbcTemplate) context.getBean("jdbcTemplate");
//        String sql = "insert into student value(?,?,?)";   //增
//        String sql = "Delete from `student` where id = ?";  //删
//        String sql = "update `student` set name = ? ,age = ? where id = ?"; //改

        String sql = "select * from student";

        RowMapper<Student> rowMapper = new BeanPropertyRowMapper<>(Student.class);
        Student stu = jt.queryForObject(sql,rowMapper);
        System.out.println(stu);
    }
}

运行结果,打印如下:

Student{id=1, name='weihouye2', age=24}

注意sql查询的返回结果一定要是一条数据,否则会抛异常:
没有数据时:

Exception in thread "main" org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
    at org.springframework.dao.support.DataAccessUtils.nullableSingleResult(DataAccessUtils.java:97)
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:474)
    at com.shiyanlou.jdbc.App.main(App.java:28)

大于一条数据时:

Exception in thread "main" org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 2
    at org.springframework.dao.support.DataAccessUtils.nullableSingleResult(DataAccessUtils.java:100)
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:474)
    at com.shiyanlou.jdbc.App.main(App.java:28)
 6.2、查询多条数据

首先在数据库多添加几条数据:

insert into student values(3,"wangwu",45),(4,"lisi",30);
image.png

修改App.java中的代码,如下:

package com.shiyanlou.jdbc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import java.util.List;

/**
 * Hello world!
 *
 */
public class App 
{
    private static ApplicationContext context;
    public static void main( String[] args )
    {
        context = new ClassPathXmlApplicationContext("SpringBeans.xml");

        JdbcTemplate jt = (JdbcTemplate) context.getBean("jdbcTemplate");
//        String sql = "insert into student value(?,?,?)";   //增
//        String sql = "Delete from `student` where id = ?";  //删
//        String sql = "update `student` set name = ? ,age = ? where id = ?"; //改

        String sql = "select * from student";

        RowMapper<Student> rowMapper = new BeanPropertyRowMapper<>(Student.class);
        List<Student> stus = jt.query(sql,rowMapper);
        for (Student stu:stus
             ) {
            System.out.println(stu);
        }
    }
}

运行查看控制台结果:

Student{id=1, name='weihouye2', age=24}
Student{id=2, name='wei', age=22}
Student{id=3, name='wangwu', age=45}
Student{id=4, name='lisi', age=30}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • Spring JDBC简介 先来看看一个JDBC的例子。我们可以看到为了执行一条SQL语句,我们需要创建连接,创建...
    乐百川阅读 1,747评论 2 11
  • 慢慢来比较快,虚心学技术 数据访问操作:初始化数据访问框架、打开连接、处理各种异常和关闭连接,任何一步出现异常都有...
    廖小明的赖胖子阅读 509评论 0 3
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,502评论 0 4
  • 11. 事务管理 11.1 Spring Framework事务管理介绍 广泛的事务支持是Spring Frame...
    此鱼不得水阅读 623评论 0 0
  • 凄凄乱草宿寒鹑,落叶如麻掩垢尘。 一夜凉风知我意,几枝墨菊透幽醇。 独居西蜀无良伴,每处长亭忆远亲。 最怕开窗皆寂...
    巴清河阅读 314评论 4 18