Spring JDBC使用简单,代码简洁明了,非常适合快速开发的小型项目。下面对开发中常用的增删改查等方法逐一示例说明使用方法

1 环境准备

启动MySQL, 创建一个名为test的数据库

创建Maven项目,依赖如下:

	<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency>
</dependencies>

如果不使用maven可以自行添加jar包

代码目录结构

Car.java,一个普通的java bean,充当数据库表的实体对象

public class Car {

	public Car() {}

	public Car(int id, String name, float price) {
super();
this.id = id;
this.name = name;
this.price = price;
} private int id;
private String name;
private float price;
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 float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}

CarDao.java,暂时只设置了一个JdbcTemplate属性,这是Spring JDBC的核心,取得它的实例后就可以随心所欲了

public class CarDao {

	private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}

appllicationContext.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.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/test?useUnicode=true&characterEncoding=UTF8" />
<property name="username" value="root" />
<property name="password" value="root123456" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="carDao" class="examples.jdbc.CarDao">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
</beans>

下面是测试代码,运行后如果没有报错,说明环境搭建成功

	public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
CarDao dao = (CarDao)context.getBean("carDao");
}

2 示例

下面开始给CarDao逐个添加常用方法

2.1 删除表

	public void dropTable() {
String sql = "drop table if exists t_car";
jdbcTemplate.execute(sql);
}

2.2 建表

	public void createTable() {
String sql = "create table t_car(car_id int not null AUTO_INCREMENT,car_name varchar(50),car_price float,PRIMARY KEY(car_id)) default charset=utf8";
jdbcTemplate.execute(sql);
}

2.3 插入一条记录

	public void addCar(Car car) {
String sql = "insert into t_car(car_name,car_price) values(?, ?)";
jdbcTemplate.update(sql, new Object[] { car.getName(), car.getPrice() }, new int[] { Types.VARCHAR, Types.FLOAT });
}

测试

dao.addCar(new Car(0, "buick", 150000));

修改和删除操作除了SQL不一样,其他代码和插入记录的写法相同

注意这个表使用了自增主键,有时候插入记录后我们需要获得主键用于后续操作

2.4 获取自增主键

	public int addCarAndGetKey(Car car) {
String sql = "insert into t_car(car_name,car_price) values(?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection conn)
throws SQLException {
PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, car.getName());
ps.setFloat(2, car.getPrice());
return ps;
}
}, keyHolder);
return keyHolder.getKey().intValue();
}

2.5 批量插入

	public void batchAddCar() {
String sql = "insert into t_car(car_name,car_price) values(?, ?)";
Car[] cars = new Car[] {
new Car(1, "audi", 300000f),
new Car(2, "benz", 310000f),
new Car(3, "bmw", 320000f)
};
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public int getBatchSize() {
return cars.length;
} @Override
public void setValues(PreparedStatement ps, int index)
throws SQLException {
ps.setString(1, cars[index].getName());
ps.setFloat(2, cars[index].getPrice());
}
});
}

2.6 查询

	public Car getCarById(final int carId) {
String sql = "select * from t_car where car_id=?";
final Car car = new Car();
jdbcTemplate.query(sql, new Object[]{ carId }, new int[]{ Types.INTEGER }, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
car.setId(carId);
car.setName(rs.getString("car_name"));
car.setPrice(rs.getFloat("car_price"));
}
});
return car;
}

2.7 匹配多条记录查询(使用RowCallbackHandler)

	public List<Car> queryForList(final int fromId, final int toId) {
String sql = "select * from t_car where car_id between ? and ?";
final List<Car> cars = new ArrayList<>();
jdbcTemplate.query(sql, new Object[]{ fromId, toId }, new int[]{ Types.INTEGER, Types.INTEGER }, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
Car car = new Car();
car.setId(rs.getInt("car_id"));
car.setName(rs.getString("car_name"));
car.setPrice(rs.getFloat("car_price"));
cars.add(car);
}
});
return cars;
}

2.8 匹配多条记录查询(使用RowMapper)

	public List<Car> queryForList(final float fromPrice) {
String sql = "select * from t_car where car_price>?";
return jdbcTemplate.query(sql, new Object[]{ fromPrice }, new int[]{ Types.FLOAT }, new RowMapper<Car>() { @Override
public Car mapRow(ResultSet rs, int index) throws SQLException {
Car car = new Car();
car.setId(rs.getInt("car_id"));
car.setName(rs.getString("car_name"));
car.setPrice(rs.getFloat("car_price"));
return car;
}
});
}

注意使用RowMapper无法控制返回的List大小,查询结果集会全部读入内存,如果结果集比较大会占用较多内存。

2.9 直接返回SqlRowSet对象

	public SqlRowSet queryForRowSet(final float fromPrice) {
String sql = "select * from t_car where car_price>?";
return jdbcTemplate.queryForRowSet(sql, new Object[]{ fromPrice }, new int[]{ Types.FLOAT });
}

2.10 拼接SQL

开发中有时候会用到一个方法匹配多种查询条件的方式,可以利用拼接查询SQL来实现

	public List<Car> findCars(int carId, String carName,
float fromPrice, float toPrice) {
List<Object> paramList = new ArrayList<>();
List<Integer> typesList = new ArrayList<>();
StringBuilder sql = new StringBuilder().append("SELECT * FROM t_car WHERE 1=1");
if(carId > 0) {
sql.append(" AND car_id=?");
paramList.add(carId);
typesList.add(Types.INTEGER);
}
if(StringUtils.isNotBlank(carName)) {
sql.append(" AND locate(?,car_name)>0");
paramList.add(carName);
typesList.add(Types.VARCHAR);
}
if(fromPrice > -1) {
sql.append(" AND car_price>=?");
paramList.add(fromPrice);
typesList.add(Types.FLOAT);
}
if(toPrice > -1) {
sql.append(" AND car_price<=?");
paramList.add(toPrice);
typesList.add(Types.FLOAT);
}
int[] types = ArrayUtils.toPrimitive(typesList.toArray(new Integer[0]));
final List<Car> cars = new ArrayList<>();
jdbcTemplate.query(sql.toString(), paramList.toArray(), types, new RowCallbackHandler() { @Override
public void processRow(ResultSet rs) throws SQLException {
Car car = new Car();
car.setId(rs.getInt("car_id"));
car.setName(rs.getString("car_name"));
car.setPrice(rs.getFloat("car_price"));
cars.add(car);
}
});
return cars;
}

2.11 调用存储过程

创建一个测试存储过程

DELIMITER $$
USE `test`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_FindCar`(
$fromPrice float,
$toPrice float
)
begin
select * from t_car where car_price between $fromPrice and $toPrice;
end;$$
DELIMITER ;

调用示例

	public List<Car> queryByProcedure(final int fromId, final int toId) {
String sql = "{call proc_FindCar(?,?)}";
return jdbcTemplate.execute(sql, new CallableStatementCallback<List<Car>>() { @Override
public List<Car> doInCallableStatement(CallableStatement cs)
throws SQLException, DataAccessException {
cs.setFloat(1, fromId);
cs.setFloat(2, toId);
List<Car> cars = new ArrayList<>();
ResultSet rs = cs.executeQuery();
while(rs.next()) {
Car car = new Car();
car.setId(rs.getInt("car_id"));
car.setName(rs.getString("car_name"));
car.setPrice(rs.getFloat("car_price"));
cars.add(car);
}
return cars;
} });
}

Spring JDBC常用方法详细示例的更多相关文章

  1. Spring JDBC JdbcTemplate类示例

    org.springframework.jdbc.core.JdbcTemplate类是JDBC核心包中的中心类.它简化了JDBC的使用,并有助于避免常见的错误. 它执行核心JDBC工作流,留下应用程 ...

  2. Spring JDBC SqlUpdate类示例

    org.springframework.jdbc.object.SqlUpdate类提供了表示SQL更新的可重用操作对象. 使用到的 Student 表的结构如下 - CREATE TABLE Stu ...

  3. Spring JDBC StoredProcedure类示例

    org.springframework.jdbc.core.StoredProcedure类是RDBMS存储过程的对象抽象的超类.这个类是抽象的,目的是让子类将提供一个用于调用的类型化方法,该方法委托 ...

  4. Spring JDBC SqlQuery类示例

    org.springframework.jdbc.object.SqlQuery类提供了表示SQL查询的可重用操作对象. 使用到的 Student 表的结构如下 - CREATE TABLE Stud ...

  5. Spring JDBC SimpleJdbcCall类示例

    org.springframework.jdbc.core.SimpleJdbcCall类是表示对存储过程或存储函数的调用的多线程,可重用的对象. 它提供元数据处理以简化访问基本存储过程/函数所需的代 ...

  6. Spring JDBC SimpleJdbcInsert类示例

    org.springframework.jdbc.core.SimpleJdbcInsert类是一个多线程,可重用的对象,为将数据插入表提供了易用的功能.它提供元数据处理以简化构建基本insert语句 ...

  7. Spring JDBC RowMapper接口示例

    JdbcTemplate类使用org.springframework.jdbc.core.RowMapper <T>接口在每行的基础上映射ResultSet的行.该接口的实现执行将每行映射 ...

  8. Spring JDBC ResultSetExtractor接口示例

    org.springframework.jdbc.core.ResultSetExtractor接口是JdbcTemplate的查询方法使用的回调接口.此接口的实现执行从ResultSet提取结果的实 ...

  9. Spring JDBC PreparedStatementSetter接口示例

    org.springframework.jdbc.core.PreparedStatementSetter接口充当JdbcTemplate类使用的一般回调接口.该接口在JdbcTemplate类提供的 ...

随机推荐

  1. 路由器DHCP 动态主机配置

    进入ip设置:ip pool fw 添加网关gateway-list 192.168.1.1 添加网段network 192.168.1.0 mask 255.255.255.0 域名 dns-lis ...

  2. centos7 查询jdk安装路径

  3. HDU 1796 容斥原理

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  4. c++标准模板库algorithm头文件中accumulate算法的代码

    template <typename T>T algorithm(T* start, T* end, T total)//把[start, end)标记范围内所有元素累加到total中{  ...

  5. ASP.NET中数据邦定效率问题的一点看法 - 转载(自由的天空)

    在 做Asp.NET开发的时候经常用到DataList.Repeater等,用这些控件的时候经常用到数据邦定,很多程序员都是按照MS提供的方 法<%#DataBinder.Eval(Contai ...

  6. IT 相关期刊

    码农周刊查阅地址: http://weekly.manong.io/issues/ 快乐码农查阅地址: http://www.codeceo.com/article/category/weekly

  7. openfire

    wget http://download.igniterealtime.org/openfire/openfire-4.0.0-1.i386.rpm rpm -ivh openfire-4.0.0-1 ...

  8. spring mvc 4数据校验 validator

    注解式控制器的数据验证.类型转换及格式化——跟着开涛学SpringMVC http://jinnianshilongnian.iteye.com/blog/1733708Spring4新特性——集成B ...

  9. HTML 空格的表示符号 nbsp / ensp / emsp 的区别

    HTML 空格的表示符号 nbsp / ensp / emsp 的区别?     半角的不断行的空白格(推荐使用)    半角的空格    全角的空格

  10. [经验交流] 简单安装 centreon 3.2

    centreon 是一个自动化监控平台,监控数据存储在 mysql 中,监控配置在UI中操作,方便且功能强大. 1. centreon 监控引擎 centreon 可以与 nagios 结合,使用 n ...