Spring中如何操作JDBC的实现

本篇文章介绍一下在Spring中如何使用JDBC,事实上,在Spring中使用JDBC和传统的JDBC或者一些JDBC框架,如:DBUtils的使用没有什么区别,所以Spring中使用JDBC是非常简单的。

获取数据库连接

在这之前,我们首先通过Spring获得对数据库的连接,创建一个Java项目,导入Spring、c3p0、数据库驱动的jar包即可,然后创建一个数据表做测试:

 create table user(
 id integer primary key auto_increment,
 name varchar(20),
 password varchar(20)
 );

接下来创建Spring的配置文件并作如下配置:

<?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-4.0.xsd">

 <!-- 导入资源文件 -->
 <context:property-placeholder
 location="classpath:db.properties" />

 <!-- 配置C3P0数据源 -->
 <bean id="dataSource"
 class="com.mchange.v2.c3p0.ComboPooledDataSource">
 <property name="user" value="${jdbc.user}"></property>
 <property name="password" value="${jdbc.password}"></property>
 <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
 <property name="driverClass" value="${jdbc.driverClass}"></property>
 </bean>

</beans>

测试数据库连接是否能够成功获取:

public class SpringJDBCTest {

 private ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

 @Test
 public void testConnection() throws SQLException {
 DataSource dataSource = ctx.getBean(DataSource.class);
 System.out.println(dataSource.getConnection());
 }
}

运行结果:

com.mchange.v2.c3p0.impl.NewProxyConnection@5d47c63f

能够成功获取到数据库连接。

对数据表进行更新操作

传统的JDBC用法相信大家都很熟悉,在Spring中并没有什么特别的,无非是将Bean的生命周期交给了IOC容器管理,而Spring框架独立出了一套API用于数据库操作(JDBCTemplate)。接下来分别测试一下常见的数据库操作,先将JDBCTemplate类放入容器:

 <!-- 将JDBCTemplate放入容器 -->
 <bean id="jdbcTemplate"
 class="org.springframework.jdbc.core.JdbcTemplate">
 <property name="dataSource" ref="dataSource"></property>
 </bean>

该类需要一个参数,参数值指向刚才配置的dataSource即可,这样我们就能够使用JDBCTemplate类了,先测试一下插入操作:

 @Test
 public void testInsert() {
 JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
 String sql = "insert into user(name,password) values(?,?)";
 Object[] args = {"zhangsan","12345"};
 jdbcTemplate.update(sql,args);
 }

执行代码,查询表结果,插入成功。

mysql> select * from user;
+----+----------+----------+
| id | name  | password |
+----+----------+----------+
| 1 | zhangsan | 12345 |
+----+----------+----------+
1 row in set (0.00 sec)

接着测试一下数据表的修改操作:

 @Test
 public void testUpdate() {
 JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
 String sql = "update user set password = ? where id = ?";
 Object[] args = {"admin","1"};
 jdbcTemplate.update(sql,args);
 }

执行代码,查询表结果,修改成功。

mysql> select * from user;
+----+----------+----------+
| id | name  | password |
+----+----------+----------+
| 1 | zhangsan | admin |
+----+----------+----------+
1 row in set (0.00 sec)

数据表的删除操作与其类似,不做重复测试,接下来我们测试一下批量操作:

 @Test
 public void testBatchInsert() {
 JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
 String sql = "insert into user(name,password) values(?,?)";
 List<Object[]> batchArgs = new ArrayList();
 batchArgs.add(new Object[]{"lisi","123"});
 batchArgs.add(new Object[]{"wangwu","1234"});
 batchArgs.add(new Object[]{"zhaoliu","12345"});
 jdbcTemplate.batchUpdate(sql, batchArgs);
 }

此时的一个对象数组即为一条记录,批量操作则需要泛型为Object数组的集合。

执行代码,查询表结果,批量插入成功。

mysql> select * from user;
+----+----------+----------+
| id | name  | password |
+----+----------+----------+
| 1 | zhangsan | admin |
| 2 | lisi  | 123  |
| 3 | wangwu | 1234  |
| 4 | zhaoliu | 12345 |
+----+----------+----------+
4 rows in set (0.00 sec)

最后是数据表的查询操作,首先创建数据表对应的User类:

package com.wwj.spring.jdbc;

public class User {

 private Integer id;
 private String name;
 private String password;

 public Integer getId() {
 return id;
 }

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

 public String getName() {
 return name;
 }

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

 public String getPassword() {
 return password;
 }

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

 @Override
 public String toString() {
 return "User [id=" + id + ", name=" + name + ", password=" + password + "]";
 }
}

编写测试代码:

 @Test
 public void testGet() {
 JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
 String sql = "select id,name,password from user where id = ?";
 RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
 User user = jdbcTemplate.queryForObject(sql, rowMapper,1);
 System.out.println(user);
 }

运行结果如下:

User [id=1, name=zhangsan, password=admin]

在Spring中,查询的结果是交给了RowMapper来处理的,RowMapper用来指定映射结果集行数据的方式,相对于传统的ResultSet来说,RowMapper省去了遍历结果集的重复操作,从而使查询变得更简单。

而查询多条数据的方式如下:

 @Test
 public void testGetMore() {
 JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
 String sql = "select id,name,password from user where id > ?";
 RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
 List<User> userList = jdbcTemplate.query(sql, rowMapper,2);
 System.out.println(userList);
 }

运行结果:

[User [id=3, name=wangwu, password=1234], User [id=4, name=zhaoliu, password=12345]]

有些同学可能会想当然地认为,查询多条数据要调用queryForList()方法,事实上,调用的是query()方法。需要注意的是,JDBCTemplate提供的API不支持级联属性。

获取数据表单列的值:

@Test
 public void testSingleValue() {
 JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
 String sql = "select name from user where id = ?";
 String name = jdbcTemplate.queryForObject(sql, String.class,1);
 System.out.println(name);
 }

运行结果如下:

zhangsan

整个增删改查的过程其实都没有任何难度,这和之前学的数据库操作API区别并不大,所以也没有特别需要讲解的地方,通过一些测试代码应该就能够理解了。

使用具名参数

在经典的JDBC用法中,sql参数是用占位符"?"表示,并且受到位置的限制,定位参数的问题在于,一旦改变参数的顺序,就必须改变参数的绑定方式。

为了解决这个问题,Spring为我们提供了另一种选择:使用具名参数。

使用具名参数后,sql将按名称而不是位置进行指定,具名参数更易于后期维护,也提升了代码的可读性,具名参数只在NamedParameterJdbcTemplate类中得到支持。

要想使用具名参数,首先将NamedParameterJdbcTemplate放入容器:

 <!-- 将namedParameterJdbcTemplate放入容器 -->
 <bean id="namedParameterJdbcTemplate"
 class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
 <constructor-arg ref="dataSource"></constructor-arg>
 </bean>

该类没有无参的构造器,通常使用参数为DataSource类型的构造器。

这里以插入数据举例具名参数的使用:

 @Test
 public void testNamedParameterJdbcTemplate() {
 NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate");
 String sql = "insert into user(name,password) values(:name,:psd)";
 Map<String, Object> map = new HashMap<String, Object>();
 map.put("name", "wangweijun");
 map.put("psd", "112233");
 namedParameterJdbcTemplate.update(sql,map);
 }

执行代码,查询表结果,插入成功。

mysql> select * from user;
+----+------------+----------+
| id | name  | password |
+----+------------+----------+
| 1 | zhangsan | admin |
| 2 | lisi  | 123  |
| 3 | wangwu  | 1234  |
| 4 | zhaoliu | 12345 |
| 5 | wangweijun | 112233 |
+----+------------+----------+
5 rows in set (0.00 sec)

虽然具名参数有很多好处,但无形中也增加了很多代码,可以说比之前的方式更加复杂。

当然,它还有更简单的实现方式:

 @Test
 public void testSimpleNamedParameterJdbcTemplate() {
 NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate");
 String sql = "insert into user(name,password) values(:name,:password)";
 User user = new User();
 user.setName("zhaoliu");
 user.setPassword("223344");
 SqlParameterSource paramSource = new BeanPropertySqlParameterSource(user);
 namedParameterJdbcTemplate.update(sql, paramSource);
 }

执行代码,查询表结果,插入成功。

mysql> select * from user;
+----+------------+----------+
| id | name  | password |
+----+------------+----------+
| 1 | zhangsan | admin |
| 2 | lisi  | 123  |
| 3 | wangwu  | 1234  |
| 4 | zhaoliu | 12345 |
| 5 | wangweijun | 112233 |
| 6 | zhaoliu | 223344 |
+----+------------+----------+
6 rows in set (0.00 sec)

这种方式实现了通过对象自动匹配具名参数,前提是具名参数的参数名要和类中的属性名相同,该方式相对于第一种方式要更合理一些,因为从前台传递过来的就是对象,这样就可以直接通过对象进行处理而无需其它操作。

项目源码
https://github.com/blizzawang/spring_jdbc

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解spring与jdbc整合操作

    先上一段简单示例 public class MyTemplate { private DataSource dataSource; public DataSource getDataSource() { return dataSource; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public void insert(String sql) throws SQLExc

  • SpringBoot JdbcTemplate批量操作的示例代码

    前言 在我们做后端服务Dao层开发,特别是大数据批量插入的时候,这时候普通的ORM框架(Mybatis.hibernate.JPA)就无法满足程序对性能的要求了.当然我们又不可能使用原生的JDBC进行操作,那样尽管效率会高,但是复杂度会上升. 综合考虑我们使用Spring中的JdbcTemplate和具名参数namedParameterJdbcTemplate来进行批量操作. 改造前 在开始讲解之前,我们首先来看下之前的JPA是如何批量操作的. 实体类User: public class App

  • Spring Boot中使用jdbctemplate 操作MYSQL数据库实例

    最近在学习使用Spring Boot连接数据库,今天学习了使用jdbctemplate 操作MYSQL数据库,下面就留个笔记 不废话,先来代码 pom文件: <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

  • Spring jdbc中数据库操作对象化模型的实例详解

    Spring jdbc中数据库操作对象化模型的实例详解 Spring Jdbc数据库操作对象化 使用面向对象方式表示关系数据库的操作,实现一个线程安全可复用的对象模型,其顶级父类接口RdbmsOperation. SqlOperation继承该接口,实现数据库的select, update, call等操作. 1.查询接口:SqlQuery 1) GenericSqlQuery, UpdatableSqlQuery, MappingSqlQueryWithParameter 2) SqlUpda

  • SpringBoot使用JdbcTemplate操作数据库

    前言 本文是对SpringBoot使用JdbcTemplate操作数据库的一个介绍,提供一个小的Demo供大家参考. 操作数据库的方式有很多,本文介绍使用SpringBoot结合JdbcTemplate. 新建项目 新建一个项目.pom文件中加入Jdbc依赖,完整pom如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM

  • 详解spring开发_JDBC操作MySQL数据库

    本文介绍spring开发_JDBC操作MySQL数据库,具体如下: 项目结构: 数据库表: /spring_1100_spring+jdbc/src/com/b510/bean/Person.java package com.b510.bean; /** * 普通的javaBean类Person * * @author Hongten * */ public class Person { /** * id号 */ private int id; /** * 姓名 */ private Strin

  • Spring中如何操作JDBC的实现

    本篇文章介绍一下在Spring中如何使用JDBC,事实上,在Spring中使用JDBC和传统的JDBC或者一些JDBC框架,如:DBUtils的使用没有什么区别,所以Spring中使用JDBC是非常简单的. 获取数据库连接 在这之前,我们首先通过Spring获得对数据库的连接,创建一个Java项目,导入Spring.c3p0.数据库驱动的jar包即可,然后创建一个数据表做测试: create table user( id integer primary key auto_increment, n

  • spring中JdbcTemplate操作oracle的存储过程实例代码

    目录 场景: 功能: 1.JdbcTemplate调用存储过程(Procedure)不带返回值 1.1存储过程 1.2代码 2.JdbcTemplate调用存储过程(Procedure)带返回值但值不是集合类型 2.1存储过程 2.2代码 3.JdbcTemplate调用存储过程(Procedure)带返回值且值集合类型 3.1存储过程 3.2代码 4.附本例使用建表语句 5.附本例使用完整测试代码 总结 场景: 使用java代码调用oracle的存储过程,本例使用JdbcTemplate模板类

  • Spring中的事务操作、注解及XML配置详解

    事务 事务全称叫数据库事务,是数据库并发控制时的基本单位,它是一个操作集合,这些操作要么不执行,要么都执行,不可分割.例如我们的转账这个业务,就需要进行数据库事务的处理. 转账中至少会涉及到两条 SQL 语句: update Acoount set balance = balance - money where id = 'A'; update Acoount set balance = balance + money where id = 'B' 上面这两条 SQL 就可以要看成是一个事务,必

  • 在Spring中使用JDBC和JDBC模板的讲解

    spring dao层中对jdbc进行了封装,使用模板模式的设计模式,通过ioc被动注入的方式将jdbcTemplate这个模板类注入到数据对象中,进行数据库操作. 我们要在一个类中进行CRUD操作(crud主要被用在描述软件系统中数据库或者持久层的基本操作功能.),首先要将jdbcTemplate这个模板类注入到数据对象类中,然后将DataSource这个类注入到jdbcTemplate,获取数据源. 这样数据对象类就可以通过jdbcTemplate类中的方法进行数据库操作了. 注意:这里需要

  • 详解在spring中使用JdbcTemplate操作数据库的几种方式

    使用JdbcTemplate的步骤 1.设置spring-jdbc和spring-tx的坐标(也就是导入依赖) <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.7.RELEASE</version> </dependency> <dependency&

  • SpringBoot在自定义类中调用service层等Spring其他层操作

    背景: 做了一个TCP服务器来接入智能设备,然后需要将设备实时发送的定位等关键信息存储到数据库. 为了考虑将来可能对外提供rest接口,采用将TCP服务器集成到SpringBoot框架,当然,也是为了能最快利用mybatis框架实现数据访问,然后依次解决了如何启动,如何注销等各种问题,然后在TCP服务器消息处理时,需要写数据库,直接调用DAO层,编译报错. 改为调用Service层,编译正常,运行到调用的地方,报空指针异常,跟踪到异常位置,发现service为空,也就是按照之前controlle

  • 在Spring 中使用@Aspect 控制自定义注解的操作

    Spring 中使用@Aspect 控制自定义注解 看这篇介绍@Aspect 1.定义系统日志注解类 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SysLog { String value() default ""; } 2.定义切面处理类 package com.kxs.common.aspect; import com.google.gso

  • Spring的连接数据库以及JDBC模板(实例讲解)

    前言 今天介绍的是关于Spring的数据库连接以及Jdbc模板的相关API方法,虽然在学习了hibernate之后,会知道实现数据库连接一般都是使用hibernate等持久化框架来实现的.但是,很多时候一些涉及到事务的东西使用这些框架并不能够实现,所以我们还需要结合spring来实现相关的需要. 一.创建工程.导包 要想使用Spring的jdbc模板前,还需要导入相关的jar包: 二.进行相关的bean的创建以及工具类的编写 2.1在数据库中创建了两张表,使用spring的jdbcTemplat

随机推荐