搞懂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


相关文章
|
5月前
|
Java 数据库连接
JDBC连接复习
JDBC连接复习
56 1
|
3月前
|
SQL Java 数据库连接
一文搞懂JDBC
一文搞懂JDBC
42 12
|
8月前
|
前端开发 Java 数据库连接
JDBC是什么,2024年前端笔试题总结
JDBC是什么,2024年前端笔试题总结
|
SQL Ubuntu Java
一文搞懂JDBC应该怎么用,附代码实例
说到Java的常见框架,JDBC一定是榜上有名。 虽然大多数人会使用Mybatis来做Java应用和MySQL之间的数据交互,但了解JDBC依然是一个Java工程师的基本功。 本篇文章,就来介绍一下JDBC这个框架,最后内会附上代码实例。
204 1
一文搞懂JDBC应该怎么用,附代码实例
|
SQL Oracle Java
JDBC 拾枝杂谈—入门篇(通俗易懂)
JDBC 第一节 拾枝杂谈 带你快速入门!
153 0
|
Java 数据库连接 数据库
JavaWeb第二章课后题 JDBC进阶
JavaWeb第二章课后题 JDBC进阶
85 0
|
druid Java 数据库连接
《JavaWeb篇》02.JDBC看这一篇就够了(三)
《JavaWeb篇》02.JDBC看这一篇就够了(三)
165 0
《JavaWeb篇》02.JDBC看这一篇就够了(三)
|
SQL 存储 安全
《JavaWeb篇》02.JDBC看这一篇就够了(二)
《JavaWeb篇》02.JDBC看这一篇就够了(二)
148 0
《JavaWeb篇》02.JDBC看这一篇就够了(二)
|
SQL Oracle Java
《JavaWeb篇》02.JDBC看这一篇就够了(一)
《JavaWeb篇》02.JDBC看这一篇就够了(一)
187 0
《JavaWeb篇》02.JDBC看这一篇就够了(一)
|
SQL druid Java
搞懂JDBC这一篇就够了!!!(二)
搞懂JDBC这一篇就够了!!!(二)
181 0
搞懂JDBC这一篇就够了!!!(二)