搞懂JDBC这一篇就够了!!!(三)

简介: 搞懂JDBC这一篇就够了!!!(三)

四、Spring JDBC



概念

Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发


什么是jar包?


学了这么久要是不知道什么是jar包那就尴尬了啊


jar包就是别人已经写好的一些类,然后将这些类进行打包,你可以将这些jar包引入你的项目中,然后就可以直接使用这些jar包中的类和属性以及方法。 so ga!!!


步骤


1.导入jar包


2.创建JdbcTemplate对象。


它依赖于数据源DataSource


JdbcTemplate template = new JdbcTemplate(ds);


3.调用JdbcTemplate的方法来完成CRUD的操作


update():执行DML语句


queryforMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value,将这条记录封装为一个map集合


注意:这个方法查询的结果集长度只能是1**


queryforList():查询结果将结果集封装为list集合


注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中


query():查询结果,将结果封装为JavaBean对象


query的参数:RowMapper


一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装

new BeanPropertyRowiMapper<类型>(类型.class)


queryForObject:查询结果,将结果封装为对象


一般用于聚合函数的查询


实例


package com.caq.datasource.jdbctemplate;
import com.caq.datasource.utils.JDBCUtils;
import org.springframework.jdbc.core.JdbcTemplate;
public class JdbctemplateDemo01 {
    public static void main(String[] args) {
        //1.导入jar包
        //2.创建jdbctemplate对象
        JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
        //3.调用方法
        String sql = "update account set balance = 5000 where id = ?";
        int count = template.update(sql, 3);
        System.out.println(count);
    }
}


注意这个方法的使用,第一个参数是sql语句,第二个是经过preparedstatement封装后的sql语句中的?的值


image.png


查看数据库数据


image.png


DML练习

需求:


修改1号数据的salary 为1000


添加一条记录


删除刚才添加的记录


查询id为1的记录,将其封装为Map集合


查询所有记录,将其封装为List


查询所有记录,将其封装为Emp对象的List集合


查询总记录数


代码


package com.caq.datasource.jdbctemplate;
import com.caq.datasource.utils.JDBCUtils;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
public class JdbctemplateDemo02 {
   //Junit单元测试,可以让方法独立执行
   //1.获取JDBCTemplate对象
   private  JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    /**
     * 1.修改1号数据的salary为10000
     */
    @Test
    public void test1(){
        //2.定义sql
        String sql = "update emp set salary = 10000 where id = 1001";
        //3.执行sql
        int count = template.update(sql);
        System.out.println(count);
    }
    /**
     * 添加一条记录
     */
    @Test
    public void test2(){
        String sql = "insert into emp(id,ename,dept_id) values(?,?,?)";//双引只能嵌套单引
        int count = template.update(sql, 1015, "gj", 10);
        System.out.println(count);
    }
    /**
     * 删除刚才添加的记录
     */
    @Test
    public void test3(){
        String sql = "delete from emp where id = ?";
        int count = template.update(sql, 1015);
        System.out.println(count);
    }
}

分别对三个单元进行测试


结果如下:


image.png


DQL练习

JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。 特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性


RowMapper的使用实例

1.RowMapper的基本使用

从数据库查询出来的记录全都被保存在ResultSet结果集中,我们需要将结果集中的数据一条条地获取并设置到具体的实体类上,如此,该实体类才能在接下来的程序中使用。然而问题是,每次都要这么操作实在是太麻烦了,Spring就不应该提供什么功能来替我们做这些事情吗?RowMapper就是实现这个功能的


1.1 BeanPropertyRowMapper

当查询数据库返回的是多列数据,且你需要将这些多列数据映射到某个具体的实体类上


代码如下

 

@Override
    public Student getStudentByName2(String name) {
        String sql = "select name, gender from test_student where name = ?";
        return this.jdbcTemplate.queryForObject(sql, new Object[]{name},
                new BeanPropertyRowMapper<>(Student.class));
    }
    @Override
    public List<Student> getStudentsByName2(String name) {
        String sql = "select name, gender from test_student where name = ?";
        return this.jdbcTemplate.query(sql, new Object[]{name},
                new BeanPropertyRowMapper<>(Student.class));
    }

代码


package com.caq.datasource.jdbctemplate;
import com.caq.datasource.utils.JDBCUtils;
import com.caq.datasource.domain.Emp;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
import java.util.Map;
public class JdbctemplateDemo02 {
   //Junit单元测试,可以让方法独立执行
   //1.获取JDBCTemplate对象
   private  JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    /**
     * 1.修改1号数据的salary为10000
     */
    @Test
    public void test1(){
        //2.定义sql
        String sql = "update emp set salary = 10000 where id = 1001";
        //3.执行sql
        int count = template.update(sql);
        System.out.println(count);
    }
    /**
     * 添加一条记录
     */
    @Test
    public void test2(){
        String sql = "insert into emp(id,ename,dept_id) values(?,?,?)";//双引只能嵌套单引
        int count = template.update(sql, 1015, "gj", 10);
        System.out.println(count);
    }
    /**
     * 删除刚才添加的记录
     */
    @Test
    public void test3(){
        String sql = "delete from emp where id = ?";
        int count = template.update(sql, 1015);
        System.out.println(count);
    }
    /**
     * 4.查询id为1001的记录,将其封装为Map集合
     * 注意:这个方法查询的结果集长度只能是一
     */
    @Test
    public void test4(){
        String sql = "select * from emp where id = ?";
        Map<String, Object> map = template.queryForMap(sql, 1001);
        System.out.println(map);
        //{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20}
    }
    /**
     * 5.查询所有记录,将其封装为List
     */
    @Test
    public void test5(){
        String sql = "select * from emp";
        List<Map<String, Object>> list = template.queryForList(sql);
        //iter快捷键可快速生成循环
        for (Map<String, Object> stringObjectMap : list) {
            System.out.println(stringObjectMap);
        }
    }
    /**
     * 6.查询所有记录,将其封装为Emp对象的List集合
     */
    @Test
    public void test6(){
        String sql = "select * from emp";
        //可以自己实现接口,也可以用别人实现号的类BeanPropertyRowMapper
        List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
        for (Emp emp:list){
            System.out.println(emp);
        }
    }
    /**
     * 7.查询总记录数
     */
    @Test
    public void test7(){
        String sql = "select count(id) from emp";
        Long total = template.queryForObject(sql, Long.class);
        System.out.println(total);
        //14
    }
}

输出结果


com.caq.datasource.jdbctemplate.JdbctemplateDemo02,test6
十月 21, 2021 10:51:47 下午 com.alibaba.druid.pool.DruidAbstractDataSource error
严重: maxIdle is deprecated
十月 21, 2021 10:51:48 下午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
Emp{id=1001, ename='孙悟空', job_id=4, mgr=1004, joindate=2000-12-17 00:00:00.0, salary=10000.0, bounds=null, dept_id=20}
Emp{id=1002, ename='卢俊义', job_id=3, mgr=1006, joindate=2001-02-20 00:00:00.0, salary=16000.0, bounds=null, dept_id=30}
Emp{id=1003, ename='林冲', job_id=3, mgr=1006, joindate=2001-02-22 00:00:00.0, salary=12500.0, bounds=null, dept_id=30}
Emp{id=1004, ename='唐僧', job_id=2, mgr=1009, joindate=2001-04-02 00:00:00.0, salary=29750.0, bounds=null, dept_id=20}
Emp{id=1005, ename='李逵', job_id=4, mgr=1006, joindate=2001-09-28 00:00:00.0, salary=12500.0, bounds=null, dept_id=30}
Emp{id=1006, ename='宋江', job_id=2, mgr=1009, joindate=2001-05-01 00:00:00.0, salary=28500.0, bounds=null, dept_id=30}
Emp{id=1007, ename='刘备', job_id=2, mgr=1009, joindate=2001-09-01 00:00:00.0, salary=24500.0, bounds=null, dept_id=10}
Emp{id=1008, ename='猪八戒', job_id=4, mgr=1004, joindate=2007-04-19 00:00:00.0, salary=30000.0, bounds=null, dept_id=20}
Emp{id=1009, ename='罗贯中', job_id=1, mgr=null, joindate=2001-11-17 00:00:00.0, salary=50000.0, bounds=null, dept_id=10}
Emp{id=1010, ename='吴用', job_id=3, mgr=1006, joindate=2001-09-08 00:00:00.0, salary=15000.0, bounds=null, dept_id=30}
Emp{id=1011, ename='沙僧', job_id=4, mgr=1004, joindate=2007-05-23 00:00:00.0, salary=11000.0, bounds=null, dept_id=20}
Emp{id=1012, ename='李逵', job_id=4, mgr=1006, joindate=2001-12-03 00:00:00.0, salary=9500.0, bounds=null, dept_id=30}
Emp{id=1013, ename='小白龙', job_id=4, mgr=1004, joindate=2001-12-03 00:00:00.0, salary=30000.0, bounds=null, dept_id=20}
Emp{id=1014, ename='关羽', job_id=4, mgr=1007, joindate=2002-01-23 00:00:00.0, salary=13000.0, bounds=null, dept_id=10}
Process finished with exit code 0


相关文章
|
12月前
|
SQL druid Java
JDBC BasicDAO详解(通俗易懂)
JDBC 第七节 详解BasicDAO 通俗易懂!
99 0
|
SQL Ubuntu Java
一文搞懂JDBC应该怎么用,附代码实例
说到Java的常见框架,JDBC一定是榜上有名。 虽然大多数人会使用Mybatis来做Java应用和MySQL之间的数据交互,但了解JDBC依然是一个Java工程师的基本功。 本篇文章,就来介绍一下JDBC这个框架,最后内会附上代码实例。
147 1
一文搞懂JDBC应该怎么用,附代码实例
|
存储 开发者
彻底搞懂函数,读这篇文章就够了
如果你之前使用过任何一门编程语言,那么对于你来讲想必已经知道什么是函数,以及如何使用函数了,那你大可不必往下读了。这篇文章是写给新手看的,也就是说我假设你对于函数没有任何的概念。 我们就先从什么是函数来说起吧!
88 0
|
存储 弹性计算 人工智能
关于 ByteHouse 你想知道的一切,看这一篇就够了
关于 ByteHouse 你想知道的一切,看这一篇就够了
|
SQL Java 关系型数据库
JDBC面试核心必考知识点
JDBC核心知识点 如有编辑错误联系作者 如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 王恒杰 男、95后 现居天津 是一名学习java的菜鸟 是万千程序猿中的一只 喜欢编程,喜欢探索新技术,大学生活迷茫过,失落过,还好没有放弃 希望看到这里的你也不要轻易地放弃 这条路上的你并不是孤军奋战,有千千万万的猿在陪你前行
129 0
JDBC面试核心必考知识点
|
SQL 存储 安全
《JavaWeb篇》02.JDBC看这一篇就够了(二)
《JavaWeb篇》02.JDBC看这一篇就够了(二)
135 0
《JavaWeb篇》02.JDBC看这一篇就够了(二)
|
SQL Oracle Java
《JavaWeb篇》02.JDBC看这一篇就够了(一)
《JavaWeb篇》02.JDBC看这一篇就够了(一)
164 0
《JavaWeb篇》02.JDBC看这一篇就够了(一)
|
druid Java 数据库连接
《JavaWeb篇》02.JDBC看这一篇就够了(三)
《JavaWeb篇》02.JDBC看这一篇就够了(三)
150 0
《JavaWeb篇》02.JDBC看这一篇就够了(三)
|
SQL 缓存 Oracle
一个基础又很重要的知识点:JDBC原理(基本案例和面试知识点)
JDBC全称又叫做Java DataBase Connectivity,就是Java数据库连接,说白了就是用Java语言来操作数据库。这篇文章主要是对JDBC的原理进行讲解。不会专注于其使用。主要是理解其思想并对一些常见的面试题进行讲解。
254 0
一个基础又很重要的知识点:JDBC原理(基本案例和面试知识点)
|
SQL druid Java
搞懂JDBC这一篇就够了!!!(二)
搞懂JDBC这一篇就够了!!!(二)
157 0
搞懂JDBC这一篇就够了!!!(二)