目录
JdbcTemplate简单介绍
基本概念
JDBC已经能够满足大部分用户最基本的需求,但是在使用JDBC时,必须自己来管理数据库资源如:获取PreparedStatement,设置SQL语句参数,关闭连接等步骤。
JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分。JdbcTemplate处理了资源的建立和释放。他帮助我们避免一些常见的错误,比如忘了总要关闭连接。他运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果。
在JdbcTemplate中执行SQL语句的方法大致分为3类:
execute
:可以执行所有SQL语句,一般用于执行DDL语句。-
update
:用于执行INSERT
、UPDATE
、DELETE
等DML语句。 queryXxx
:用于DQL数据查询语句。
依赖jar包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
</dependencies>
JdbcTemplate基本使用
案例准备
- Account表:id(int,自增),name(String),money(float)
- 对应User类
代码实现(向表中添加一条信息)
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
/**
* @author iheanu_
*/
public class JdbcTemplateDemo1 {
public static void main(String[] args) {
//准备数据源:spring的内置数据源
DriverManagerDataSource ds=new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/yz?&useSSL=false&serverTimezone=UTC&characterEncoding=utf8&characterSetResults=utf8");
ds.setUsername("root");
ds.setPassword("root");
JdbcTemplate jdbcTemplate=new JdbcTemplate();
jdbcTemplate.setDataSource(ds);
jdbcTemplate.execute("insert into account(name,money) values('小王',1000)");
}
}
JdbcTemplate在Spring的ioc实现
bean.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置jdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="datasource"></property>
</bean>
<!--配置数据源-->
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/yz?&useSSL=false&serverTimezone=UTC&characterEncoding=utf8&characterSetResults=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
</beans>
实现代码:
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
/**
* @author iheanu_
*/
public class JdbcTemplateDemo2 {
public static void main(String[] args) {
//获取ioc容器
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//获取配置的Template对象
JdbcTemplate jdbcTemplate = ac.getBean("jdbcTemplate", JdbcTemplate.class);
//执行操作
jdbcTemplate.execute("insert into account(name,money) values('小红',2000)");
}
}
JdbcTemplate基于配置的CRUD操作
1.增删改
import com.yz.domain.Account;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
/**
* @author iheanu_
*/
public class JdbcTemplateDemo2 {
public static void main(String[] args) {
//获取ioc容器
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//获取配置的Template对象
JdbcTemplate jdbcTemplate = ac.getBean("jdbcTemplate", JdbcTemplate.class);
//执行操作
//增
jdbcTemplate.update("insert into account(name,money) values (?,?)", "小红", 5000f);
//删
jdbcTemplate.update("delete from account where id=?", 10);
//改
jdbcTemplate.update("update account set name=?,money=? where id=?","老王",10000f,10);
}
}
2.查询
对于返回结果的封装,我们有两种方式,这里以查询所有money>1000f为例:
1)用自己定义的封装机制
import com.yz.domain.Account;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
/**
* @author iheanu_
*/
public class JdbcTemplateDemo2 {
public static void main(String[] args) {
//获取ioc容器
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//获取配置的Template对象
JdbcTemplate jdbcTemplate = ac.getBean("jdbcTemplate", JdbcTemplate.class);
//执行操作
//查询所有
List<Account> accounts = jdbcTemplate.query("select * from account where money>?", new AccountRowMapper(), 1000f);
for (Account account : accounts) {
System.out.println(account);
}
}
}
/**
* 定义Account的封装策略
*/
class AccountRowMapper implements RowMapper<Account>{
/**
* 把结果集合中的数据封装到Account中,然后由Spring把每个Account加入集合中
* @param rs
* @param rowNum
* @return
* @throws SQLException
*/
@Override
public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
Account account=new Account();
account.setId(rs.getInt("id"));
account.setName(rs.getString("name"));
account.setMoney(rs.getFloat("money"));
return account;
}
}
2)用spring提供的封装方法
import com.yz.domain.Account;
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.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
/**
* @author iheanu_
*/
public class JdbcTemplateDemo2 {
public static void main(String[] args) {
//获取ioc容器
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//获取配置的Template对象
JdbcTemplate jdbcTemplate = ac.getBean("jdbcTemplate", JdbcTemplate.class);
//执行操作
//查
//1.查询所有
List<Account> accounts = jdbcTemplate.query("select * from account where money>?", new BeanPropertyRowMapper<Account>(Account.class), 1000f);
for (Account account : accounts) {
System.out.println(account);
}
}
}
3.查的补充
1)查询单条信息和查询返回一行一列
import com.yz.domain.Account;
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.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
/**
* @author iheanu_
*/
public class JdbcTemplateDemo2 {
public static void main(String[] args) {
//获取ioc容器
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//获取配置的Template对象
JdbcTemplate jdbcTemplate = ac.getBean("jdbcTemplate", JdbcTemplate.class);
//执行操作
//查
//1.查询一个
List<Account> account = jdbcTemplate.query("select * from account where id=?", new BeanPropertyRowMapper<Account>(Account.class), 11);
System.out.println(account.isEmpty()?"未找到结果":account.get(0));
System.out.println("------------------------------------------");
//2.查询返回一行一列
Long query = jdbcTemplate.queryForObject("select count(*) from account where money > ?", Long.class, 1000f);
System.out.println(query);
}
}