JdbcTemplate基本使用
Posted 晨港飞燕
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JdbcTemplate基本使用相关的知识,希望对你有一定的参考价值。
一.介绍
JDBC已经能够满足大部分用户最基本的需求,但是在使用JDBC时,必须自己来管理数据库资源如:获取PreparedStatement,设置SQL语句参数,关闭连接等步骤。
JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分。JdbcTemplate处理了资源的建立和释放。他帮助我们避免一些常见的错误,比如忘了总要关闭连接。他运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果。
Spring源码地址:https://github.com/spring-projects/spring-framework
在JdbcTemplate中执行SQL语句的方法大致分为3类:
- execute:可以执行所有SQL语句,一般用于执行DDL语句。
- update:用于执行INSERT、UPDATE、DELETE等DML语句。
- queryXxx:用于DQL数据查询语句。
- call方法:用于执行存储过程、函数相关语句。
二.集成
目的是把JdbcTemplate放入spring容器中管理
1.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 导入资源文件
读取db.properties文件中的数据 -->
<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>
<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>
<!-- 配置Spring的jdbcTemplate
并注入一个dataSource数据源-->
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
2.springboot形式
springboot框架是自动装配
## yml:
spring:
profiles: win
application:
name: cgfy-mybatis
datasource:
name: test
# 数据源类型
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/cgfy_web?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: 123456
# 初始化连接池大小
initial-size: 0
# 最大链接数
max-active: 20
# 最小链接间隔
min-idle: 1
# 最大等待时间,单位是毫秒
max-wait: 60000
## pom:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
3.注入
@Autowired
private JdbcTemplate jdbcTemplate;
三.增删改查等基本操作
@Component
public class JdbcTemplateDemo {
@Autowired
private static JdbcTemplate jdbcTemplate;
public static void test() throws Exception {
//使用execute-创建表的SQL语句
String sql0 = "CREATE TABLE product("
+ "pid INT PRIMARY KEY AUTO_INCREMENT,"
+ "pname VARCHAR(20),"
+ "price DOUBLE"
+ ");";
jdbcTemplate.execute(sql0);
//添加数据
String sql1 = "INSERT INTO product VALUES (NULL, ?, ?);";
jdbcTemplate.update(sql1, "iPhone3GS", 3333);
//修改数据
String sql2 = "UPDATE product SET pname=?, price=? WHERE pid=?;";
jdbcTemplate.update(sql2, "XVIII", 18888, 10);
//删除数据
String sql3 = "DELETE FROM product WHERE pid=?;";
jdbcTemplate.update(sql3, 7);
//查询数据-queryForObject返回String
String sql4 = "SELECT pid FROM product WHERE price=18888;";
String str = jdbcTemplate.queryForObject(sql4, String.class);
//查询数据-queryForMap返回一个Map集合
String sql5 = "SELECT * FROM product WHERE pid=?;";
Map<String, Object> map = jdbcTemplate.queryForMap(sql5, 6);
//查询数据-queryForList返回一个List集合
String sql6 = "SELECT * FROM product WHERE pid<?;";
List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql6, 8);
/**
* 查询数据-RowMapper返回自定义对象
* 使用JdbcTemplate对象的query方法,并传入RowMapper匿名内部类
* 在匿名内部类中将结果集中的一行记录转成一个Product对象
*/
String sql7 = "SELECT * FROM product WHERE pid=?;";
List<Product> beanList1 = jdbcTemplate.query(sql7, new RowMapper<Product>() {
@Override
public Product mapRow(ResultSet arg0, int arg1) throws SQLException {
Product p = new Product();
p.setPid(arg0.getInt("pid"));
p.setPname(arg0.getString("pname"));
p.setPrice(arg0.getDouble("price"));
return p;
}
},1);
String sql8 = "SELECT * FROM product WHERE pid=?;";
Product queryForObject1 = jdbcTemplate.queryForObject(sql8, new RowMapper<Product>() {
@Override
public Product mapRow(ResultSet arg0, int arg1) throws SQLException {
Product p = new Product();
p.setPid(arg0.getInt("pid"));
p.setPname(arg0.getString("pname"));
p.setPrice(arg0.getDouble("price"));
return p;
}
},1);
/**
* 查询数据-BeanPropertyRowMapper返回自定义对象
* BeanPropertyRowMapper实现RowMapper接口
*/
String sql9 = "SELECT * FROM product ;";
List<Product> beanList2 = jdbcTemplate.query(sql9, new BeanPropertyRowMapper<>(Product.class));
String sql10 = "select * from product where pid = ?";
Product queryForObject2 = jdbcTemplate.queryForObject(sql10, new BeanPropertyRowMapper<Product>(Product.class),5);
}
//使用RowMapper实现接口方式,覆盖mapRow方法
public Product getById(Integer id) {
String sql = "SELECT * FROM product WHERE pid = ?;";
Product product =jdbcTemplate.queryForObject(sql, new Product(), new Object[] { id });
return product;
}
public List findAll() {
String sql = "SELECT * FROM product;";
List products = jdbcTemplate.query(sql, new Product());
return products;
}
}
Product:
/**
* title:
* Description:使用RowMapper实现接口方式,覆盖mapRow方法
* Author: Administrator
* Date: 2021/5/20
*/
public class Product implements RowMapper<Product> {
private int pid;
private String pname;
private Double price;
//使用RowMapper实现接口方式,覆盖mapRow方法,实现复用
@Override
public Product mapRow(ResultSet rs, int rowNum) throws SQLException {
Product product = new Product();
product.setPid(rs.getInt("id"));
product.setPname(rs.getString("pname"));
product.setPrice(rs.getDouble("price"));
return product;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}
参考:
https://blog.csdn.net/weixin_40001125/article/details/88538576
https://blog.csdn.net/w_linux/article/details/80285491
https://www.cnblogs.com/gongxr/p/8053010.html
https://www.jb51.net/article/135009.htm
以上是关于JdbcTemplate基本使用的主要内容,如果未能解决你的问题,请参考以下文章
阶段3 2.Spring_09.JdbcTemplate的基本使用_3 JdbcTemplate在Dao中的使用
Spring -- Spring JdbcTemplate基本使用