您的位置:首页 > 编程语言 > Java开发

Spring JDBC学习笔记(1):查询数据库数据之JdbcTemplate的使用

2016-03-28 22:55 483 查看
今天搬代码的时候遇到一个需求,要获取数据库的表和列的元信息,包括数据类型、约束、索引等的信息,因为之前使用JDBC实现过,但是当前在一个spring管理的工程中,觉得直接用JDBC怪怪的(其实是感觉有点low......),spring一定提供了这方面的封装,不出我所料,找到了JdbcTemplate这个spring对JDBC提供支持的类。

一、准备工作

Spring封装了底层数据库的访问,它通过增加一个抽象层来使对数据库访问变得更加容易,所以我们首先需要一个数据源来管理与数据库的连接,这里选择c3p0数据源,另外JDBC驱动文件必不可少,还有其他spring的必须依赖库,看如下maven配置信息:
<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.demo</groupId>
<artifactId>SpringJdbc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>SpringJdbc</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.2.2.RELEASE</spring.version>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- database connection pool -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
</dependencies>
</project>
然后完成spring的配置文件,在这之前我们可以先把有关数据库的连接信息配置到一个jdbc.properties文件中。
jdbc.properties文件如下:
jdbc.url=jdbc:mysql://localhost:3306/springtutorial
jdbc.username=abc
jdbc.password=123
jdbc.drive_class=com.mysql.jdbc.Driver

initialPoolSize=10
maxPoolSize=15

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"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd"> 
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.drive_class}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>

<property name="initialPoolSize" value="${initialPoolSize}"></property>
<property name="maxPoolSize" value="${maxPoolSize}"></property>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
配置JdbcTemplate时,需要指定其中的dataSource属性,这样关于数据库连接和查询数据的所有前期准备都已经完成。下面我们就使用这个类来完成对数据库的操作。

二、 查询数据库数据

我们声明一个简单的实体类User作为被操作的对象:
package com.demo.SpringJdbc.entity;

public class User {
private String name;
private String address;
private Integer age;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", address=" + address + ", age=" + age + "]";
}

}

1、针对修改单条数据

针对单条数据的操作,可以使用update方法,这个方法是用来支持insert,update,delete操作的,实例如下:
jdbcTemplate.update("insert into user(username, address, age) values(?,?,?)", "abc", "hz", 21);
jdbcTemplate.update("update user set username = ? where age = ? ", "lmy", "21");
"?"为SQL语句中参数占位符,后面的参数与占位符是一一对应的。

2、针对修改多条数据

List<Object[]> args = new ArrayList<>();
Object[] arg1 = new Object[]{"lmw", "hz", "19"};
Object[] arg2 = new Object[]{"lmr", "hz", "16"};
args.add(arg1);
args.add(arg2);
jdbcTemplate.batchUpdate("insert into user(username, address, age) values(?, ?, ?)", args);
除了在传递参数的时候提供一个list,别的方面的使用方式和update的是相同的。

3、针对查询一个对象

让人感到奇怪的是,JdbcTemplate尽然还提供了简单的ORM的功能。使用实例如下:
RowMapper<User> mapper = new BeanPropertyRowMapper<>(User.class);
User user = jdbcTemplate.queryForObject("select username name, address, age from user where age = ?", mapper, 16);
对User这个实体类进行查询,它通过使用RowMapper来映射数据库中的一行数据和实体类的一个实例。注意上述API只能放回一个对象,如果结果有多个就会报错。在进行映射时,通过将实体类的字段名作为要查的数据库中的字段的别名来完成映射。
还有一个问题,就是它毕竟不是ORM框架,做不到那么智能,如果在User中出现一个自定义的类,再进行查询时也是不会成功返回值的,即不支持级联操作,所以如果使用这个,你只能忍受她的这种任性,感觉是个鸡肋啊!!

4、针对查询多个对象

RowMapper<User> mapper = new BeanPropertyRowMapper<>(User.class);
List<User> users = jdbcTemplate.query("select * from user where age = ?", mapper, 21);
使用方法同上,只不过是返回一个list。

5、针对其他类型数据的查询

List<Long> ages =  jdbcTemplate.queryForList("select age from user where username = ?", Long.class, "lmy");
Long count = jdbcTemplate.queryForObject("select count(*) from user ", Long.class);

针对其他类型数据的查询,使用queryForList()这个API来完成,其中需要你提供一个Class类型的参数来标明要查询的哪种类型的数据。

6. 针对任何操作

其中还有一个进行DDL操作的API,可以用来改变数据库的表的结构信息等。
execute(String sql)
这个就不举例了,直接将DDL语句传进去就好了。

三、 实际开发应用

在实际使用的时候可以在DAO层中使用该对象。
具体的使用方式如下:
建立一个XXXDao的类,如下
public class PersonDao {
<span style="white-space:pre">	</span>private JdbcTemplate jdbcTemplate;

}
然后在spring的配置文件中配置上述的Bean:
<bean id="personDao" class="com.demo.SpringJdbc.dao.PersonDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
然后即可使用该personDao提供的API去访问数据库了。其实spring还提供了一个JdbcDaoSupport的类用于支持Dao,只不过是约束太多,不常用罢了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息