JDBCTemplate的好处:
1.可以实现将查询到的数据自动分装为实体类对象
2.可以不用在执行增删改以后释放prepareStatement 对象和connection对象了
项目的框架:
可以看到项目里面使用到了7个jar包这七个jar包缺一不可的,
1.和前面两个案例01,02一样我们使先试用druid这个jar包创建一了一个工具类,提供了得到Connection和Datasource对象的方法。
2.创建了一个user的实体类,后期可以使用JDBCTemplate直接将查询到的数据封装成为User对象。
用到的方法
/*
使用JDBCTemplate来实现对mysql数据库的操作
前提:结合前面的Druid来得到DateSource
使用JDBCtemplate的好处就是我们不用再自己去关闭数据库的连接了
1。将查询到的结果封装成为对象并且放到list集合里面
List
2.将查询到的每一条记录封装成为Map集合,并且将map集合放到一个list集合里面
List
实体类代码
注意:实体类的变量名 , 属性名 要和你的数据库里面的字段的名字一模一样,不然无法自动封装为User对象
package bean;
public class User {
private int id;
private String name ;
private int money;
public User() {
}
public User(int id, String name, int money) {
this.id = id;
this.name = name;
this.money = money;
}
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 int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}
测试类代码
package SpringTemplate;
import bean.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import utils.JDBCUtils;
import javax.sql.DataSource;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class JDBCTemplate {
/**
* 使用JDBCTemplate来实现对mysql数据库的操作
* 前提:结合前面的Druid来得到DateSource
*
* 使用JDBCtemplate的好处就是我们不用再自己去关闭数据库的连接了
*
* 1。将查询到的结果封装成为对象并且放到list集合里面
* List<User> userlist = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));
* 2.将查询到的每一条记录封装成为Map集合,并且将map集合放到一个list集合里面
* List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
* 3.将查询到的结果放到Map集合里面去,!!!! 只支持查询结果是一条记录的时候,亮条记录的时候就会报错
* Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql2,133);
*
* 这三种方法都可以先将sql语句里面的参数用占位符?? 代替,在执行的时候进行补全
*
*/
public static void main(String[] args) {
//得到JDBCtemplate的对象 注意导包的时候导的是org.springframework.jdbc.core.JdbcTemplate;
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "select * from luo ;";
List<User> userlist = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));
for (User user : userlist) {
System.out.println(user);
}
System.out.println("----------防止sql注入------------");
String sql3 = "select * from luo where id = ?;";
List<User> userlist2 = jdbcTemplate.query(sql3,new BeanPropertyRowMapper<User>(User.class), "133" );
for (User user : userlist2) {
System.out.println(user);
}
System.out.println("---------------------------");
//将查询到的结果封装成为一个list集合,集合里面是Map集合 一个map集合就是一条记录 键是字段名,值是值
List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
for (Map<String, Object> map : maps) {
System.out.println(map);
}
System.out.println("--------------------------");
//将查询到的结果放到一个map集合里面
// 注意 这种方法只是用于查询的结果集里面只有一条记录的查询,结果集里面如果有两条记录就会报错
String sql2 = "select * from luo where id = ? ;"; //使用占位符可以防止sql注入
Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql2,133); //填补空缺值,并执行sql
//遍历map集合
//1.得到键的集合
Set<String> set = stringObjectMap.keySet();
for (String s : set) {
System.out.println(s+"-----"+stringObjectMap.get(s));
}
}
}
扩展知识
Spring JDBC 提供了一个 JDBCTemplate对象
Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
步骤:
1. 导入jar包
2. 创建JdbcTemplate对象。依赖于数据源DataSource 这个DataSource对象我们可以使用刚才创建的DruidTools来得到
* JdbcTemplate template = new JdbcTemplate(ds);
3. 调用JdbcTemplate的方法来完成CRUD的操作<br /> ** * update():执行DML语句。增、删、改语句**<br />** * queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合**<br />** * 注意:这个方法查询的结果集长度只能是1**<br />** * queryForList():查询结果将结果集封装为list集合**<br />** * 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中**<br />** * query():查询结果,将结果封装为JavaBean对象**<br />** * query的参数:RowMapper**<br />** * 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装**<br />** * new BeanProp ertyRowMapper<类型>(类型.class)**<br />** **_*重点!!!! 为什么这个方法可以实现 自动封装为Person对象 是因为_<br />_ *他会把我们在Person里面定义的属性值id name money和数据库里面的字段进行匹配_<br />_*所以如果你想使用系统的BeanPropertyRowMapper方法 就要保证Person类的属性值和 数据库的字段一一对应_<br />** * queryForObject:查询结果,将结果封装为对象**<br />** * 一般用于聚合函数的查询**
使用JDBCtemplate的好处:
使用JDBCTemplate的有点就在于我们不需要再 创建数据库的连接 得到数据库连接池 归还连接 大大方便了
扩展案例
案例:
下面是使用Spring JDBC的 JDBCTemplate对象来实现7个案例,使用到了7个jar包 实现数据库操作更加的方便了
七个练习是:
练习一 修改id值为133的人的钱为333
* 练习二 我们添加一条记录 insert into luo values(166,”阿里巴”,777);
练习三 删除刚才添加的数据 delete from luo where id = ? ;
练习四 查询id为133的记录 并且将数据放到map集合里面 map 集合是一个双列集合里面是键值对
练习五 ; 查询所有的记录 将记录存放到list集合 list集合里面的每一个元素是一个map集合
练习六 ;查询所有的记录 将每一条记录封装为person对象 再把对象放到list集合里面
使用SpringJDBC 给的 JDBCTamplate的.query方法就可以实现 将查询到的结果封装为javabean对象
练习6plus 我们会发现自己实现一下 RowMap方法是可以的,但是比较麻烦 所以 我们来使用一下系统已经实现好的接口
系统重写好RowMaper接口的类是 BeanPropertyRowMaper();参数是一个字节码文件 就是你想封装成类的字节码文件
练习7 得到记录的总数 使用聚合函数
代码
import DruidUtils.DruidTools;
import org.junit.Test;
import org.omg.PortableInterceptor.ClientRequestInfo;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import javax.lang.model.type.ArrayType;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class JDBCTemplatePractice1 {
/**
* 我们在这里实现几个JDBCTemplate的练习
* 使用单元测试的方式 不需要主方法 让定义的方法可以独立运行
* 单元测试的方法返回值一般都是 void ,修饰符都是public
* 我们只需要添加一个注解@Test 然后点击注解左边的小灯泡 吧Junit4添加进去就可以实现单元测试了
*/
/**
* 练习一 修改id值为133的人的钱为333
*/
@Test
public void test1 (){
//获取JDBCTemplate对象 参数是dataSource我们可以使用自己创建的工具类得到
JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
//创建sql语句
String sql = "update luo set money = ? where id = 133";
//为sql设置参数 并执行sql
int res = jdbcTemplate.update(sql, 363);
if (res > 0){
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
}
/**
* 练习一 我们添加一条记录 insert into luo values(166,"阿里巴",777);
* 使用JDBCTemplate的update方法可以执行DML(增删改)语句 返回int 数据
*/
@Test
public void test2 (){
//获得JDBCTemplate对象 参数是DataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
String sql = "insert into luo values(?,?,?);";
//使用JDBCTemplate为sql赋值并执行sql语句
int res = jdbcTemplate.update(sql,155,"阿里巴",666);
if (res>0){
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
}
/**
* 练习三 删除刚才添加的数据 delete from luo where id = ? ;
* 使用JDBCTemplate的update方法执行sql语句 参数是 DataSource 我们使用自己的DruidTools工具类得到
*/
@Test
public void test3(){
JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
String sql = "delete from luo where id = ? ;";
int res = jdbcTemplate.update(sql,155);
if (res > 0){
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}
/**
* 练习四 查询id为133的记录 并且将数据放到map集合里面 map 集合是一个双列集合里面是键值对
* 使用JDBCTemp的queryformap方法返回的是一个map集合
* select * from luo where id = ? ;
* 使用JDBCTemplate的update方法执行sql语句 参数是 DataSource 我们使用自己的DruidTools工具类得到
*
* 注意:!! !这种方法只是用于查询的结果集里面只有一条记录的查询,结果集里面如果有两条记录就会报错
*/
@Test
public void test4(){
JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
String sql = "select * from luo where id = ? ;";
//map集合里面的数据就是 将字段名封装为键 字段的值 封装为值
Map<String,Object> map = jdbcTemplate.queryForMap(sql,133);
//我们再回忆一下遍历map集合的方法
//方法一 将键和值当做一个整体进行遍历
Set<Map.Entry<String,Object>> set= map.entrySet();
//set集合只能使用增强for遍历
for (Map.Entry<String,Object> entry : set){
System.out.println(entry.getKey()+"---"+entry.getValue());
}
}
/**
* 练习五 ; 查询所有的记录 将记录存放到list集合 list集合里面的每一个元素是一个map集合
* 事实上就是把查到的每一条记录封装为一个 map集合再把所有的集合放到 一个list集合里面
*/
@Test
public void test5(){
//得到JDBCTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
String sql = "select * from luo ;";
List<Map<String,Object>> list = jdbcTemplate.queryForList(sql);
for (Map<String, Object> stringObjectMap : list) {
System.out.println(stringObjectMap);
}
}
/**
* 练习六 ;查询所有的记录 将每一条记录封装为person对象 再把对象放到list集合里面
* 使用SpringJDBC 给的 JDBCTamplate的.query方法就可以实现 将查询到的结果封装为javabean对象
*/
@Test
public void test6(){
//得到Tamplate的对象 参数是DataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
String sql = "select * from luo ;";
//第二个参数是一个 接口我们可以自己实现接口 也可以使用系统已经实现好的类 这里我们自己实现一下接口
List<Person> list = jdbcTemplate.query(sql, new RowMapper<Person>() {
@Override
public Person mapRow(ResultSet resultSet, int i) throws SQLException {
//这里的resuleSet就是查询到的结果集 i 就是查询到的记录数
//我们可以使用ResultSet的getxxx方法得到指定的字段对应的值
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int money = resultSet.getInt("money");
//封装为对象
Person person = new Person(id , name , money);
return person;
}
});
//遍历一下list集合
for (Person person : list) {
System.out.println(person);
}
}
/**
* 我们会发现自己实现一下 RowMap方法是可以的,但是比较麻烦 所以 我们来使用一下系统已经实现好的接口
* 系统重写好RowMaper接口的类是 BeanPropertyRowMaper();参数是一个字节码文件 就是你想封装成类的字节码文件
*/
@Test
public void test6plus(){
//得到JDBCTemplate 对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
String sql = "select * from luo ;";
//使用系统已经实心好RowMaper接口的类 BeanPropertyRowMaper();
List<Person> list =jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(Person.class));
//注意这里在封装成为对象的时候 数据库里面记录有时候可能为空 这样你在给对象赋值的时候可能会出错
//比如 有一条记录的id为null 我们在给 Person对象的id赋值的时候 因为id值是int int不能为空 所以就会报错
//因为基本类型不可以为null 解决方法就是 在Person类里面使用基本数据类型的封装类 Integer double-- Double
/**
* 重点!!!! 为什么这个方法可以实现 自动封装为Person对象 是因为
* 他会把我们在Person里面定义的属性值 id name money 和数据库里面的字段进行匹配
* 所以如果你想使用系统的BeanPropertyRowMapper方法 就要保证Person类的属性值和 数据库的字段一一对应
*/
for (Person person : list) {
System.out.println(list);
}
}
/**
* 得到记录的总数 使用聚合函数
* select count(id) from luo ; () 里面一般放的是主键
* 使用的方法是 queryForObject()
*/
@Test
public void test7(){
JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidTools.getDataSource());
String sql = "select count(id) from luo ;";
//queryForObject()方法执行sql 前面用int接收后面第二个参数就要使用int的字节码文件 ,class
int i = jdbcTemplate.queryForObject(sql,Integer.class);
System.out.println(i);
}
}