今天主要学习JdbcTemplate,DBUtils
思维导图:
一.JdbcTemplate
1.概念:
JdbcTemplate是spring框架对JDBC进行简便操作所提供一个模板类吗,这个类core包下面进行提供的JdbcTemplate可以在JDBC的基础进行一些简单的CRUD(增删改查)操作,同时还大量的使用了预编译操作,所以在性能和安全上都可以达到一个非常优秀的地步。
2. 如何去使用JdbcTemplate:
(1)需要导入jar包(因为这是一个第三方工具)
所提供的JdbcTemplate目录下的lib下面的所有包(5个)
(2)创建JdbcTemplate对象
JdbcTemplate template = new JdbcTemplate(JdbcUtils.getDataSource());
注意:这里的构造方法需要一个DataSource()的具体对象(其实要的就是连接池,因为JdbcTemplate不具备连接功能,所以需要连接池来驱动它)
(3)调用我们的 JdbcTemplate的各种方法实现对DML和DQL的操作
int update(String sql):适用于没有修改条件的增删改(不存在预参数参与)
delete from account;
int update(String sql,Object...):适用于带有操作条件的增删改(存在预编译参数)
delete from account where id = ?;
注意:这个Object...是一个可变参数
3.查询的结果有哪些?
(1)返回的结果只有单行(查询之后只能存在一条结果的操作)
Map<String, Object> queryForMap(String var1):适用于没有预编译参数的sql
Map<String, Object> queryForMap(String var1, Object... var2):适合存在预编译参数的sql
注意:
queryForMap只适用于一条结果的查询,如果是是多条结果则会产生异常,查询后的结果列会存储到一个Map集合当中,其中Map的键用于存储列名,Map值则存储列的数据
(2)返回的结果是全部或者多行(查询全表数据或者查询结果存在多条)
List<Map<String, Object>> queryForList(String var1):适用于没有预编译参数的sql
List<Map<String, Object>> queryForList(String var1,Object... var2):适合存在预编译参数的sql
注意:queryForMap适用于多条结果的查询,如果确保是一条结果则不建议使用它,因为操作比较复杂其查询的每一行数据会先存在Map集合当中,然后在将Map集合存储在List集合当当中在正常的开发逻辑当中,我们的每一个数据应该是一个对象的属性,所有的操作应该以对象作为中心JdbcTemplate为了更加的符合面向对象思想,也给我们提供了一个将查询结果封装到对象的方法
方式一:手写转换处理
List<T> query(String var1, RowMapper<T> var2):
var1:需要操作的SQL
var2:这是一个接口,里面需要依赖重写后的mapRow方法,因为所有查询的结果全部存在这个方法的ResultSet当中。
方式二:自动转换处理
template.query(sql,new BeanPropertyRowMapper<UserVO>(UserVO.class));
(3)返回的结果是一个数据(聚合函数的SUM/AVG/COUNT)
queryForObject(String sql, Class<T> requiredType);
sql:需要查询的SQL语句
requiredType:返回结果和接收结果的数据类型,通过反射加载 一般只能是Double.class和Long.class
例子:
package com.jdbctemlate;
import com.util.JdbcUtils;
import com.vo.UserVO;
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;
import java.util.Map;
import java.util.Set;
public class Demo01 {
public static void main(String[] args) {
select05();
}
//一个结果的查询
public static void select05() {
JdbcTemplate template = new JdbcTemplate(JdbcUtils.getDataSource());
String sql = "select count(id) from ask_users";
Long l = template.queryForObject(sql,Long.class);
System.out.println(l);
}
//自动将查询结果转化为JavaBean
public static void select04() {
JdbcTemplate template = new JdbcTemplate(JdbcUtils.getDataSource());
String sql = "select * from ask_users";
List<UserVO> list = template.query(sql,new BeanPropertyRowMapper<UserVO>(UserVO.class));
for (UserVO userVO : list) {
System.out.println(userVO.getUsername());
System.out.println(userVO.getPassword());
System.out.println(userVO.getEmail());
System.out.println(userVO.getStatus());
System.out.println(userVO.getJob());
System.out.println(userVO.getGender());
System.out.println("--------------------");
}
}
//手动将查询结果转化为JavaBean
public static void select03() {
JdbcTemplate template = new JdbcTemplate(JdbcUtils.getDataSource());
String sql = "select * from ask_users";
//通过子类实现RowMapper,并mapRow方法
//List<UserVO> u = template.query(sql,new MyRowMapper());
//直接使用匿名内部类
// List<UserVO> u = template.query(sql, new RowMapper<UserVO>() {
// @Override
// public UserVO mapRow(ResultSet rs, int i) throws SQLException {
// //创建一个实体对