数据库概述 6-JDBCTemplate

内容介绍

1 JDBCTemplate工具类(重点)
2 模拟JDBCTemplate的功能--数据库的元数据(了解)
3 三层架构(重点)

JDBCTemplate

概念

是Spring框架提供的子工具 是对jdbc操作数据库的封装

出现的目的

java代码操作数据库数据的时候,使用的必须是JDBC 
JDBC缺点:
1 代码量太多太繁琐
2 创建连接和销毁连接的耗时太长

jdbc+连接池:解决了创建连接和销毁连接的耗时问题,但是代码量更多了

jdbcTemplate(最终版) 封装了jdbc+连接池,是代码开发操作数据库更加的简单

作用

 1 大大简化了jdbc操作数据库的代码量
 2 把从数据库查询出来的数据自动封装(map,对象,集合...)

JDBCTemplate的使用

JdbcTemplate使用的快速入门:
1 导包 5个包
2 调用API
	1 核心类 JdbcTemplate 作用:用来操作sql语句的
	2 方法:
		execute() --- 操作DDL语句 建库建表的  了解
		update()  --- 操作DML语句 数据的增删改
		queryxxx()--- 操作DQL语句 数据的查询  查询出来的数据自动封装容器中
public class Demo1 {

    @Test   //在db4数据库下创建一张product表(id pname price)   execute()  ddl语句
    public void test1() throws Exception {

            //1 导5个包
            //2 创建核心对象  jdbcTemplate
        // 会自动从传递的连接池中获取连接 创建语句执行着  会自动释放资源 归还连接
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            // 3 执行sql语句
        jdbcTemplate.execute("CREATE TABLE product(id INT PRIMARY KEY AUTO_INCREMENT,pname VARCHAR(20),price DOUBLE)");
    }
}

JdbcTemplate查询数据的封装方法(必须会)

queryForObject(String sql,Class requiredType,Object...args);   单行单列(指定返回类型)

---map
queryForMap(String sql,Object..args);  单行多列(map)
queryForList(String sql,Object..args); 多行多列 (list<map>)

--对象(核心重点)
queryForObject(sql, new BeanPropertyRowMapper<>(类名.class), Object..args);  单行多列(对象)
query(sql, new BeanPropertyRowMapper<>(类名.class), Object..args); 多行多列 (list<对象>)
// jdbcTemplate操作数据库 dml语句
public class Demo2 {


    /*
    *  update(String sql,Object..args)   增删改
    *      sql:要执行的sql语句
    *      args:可变参数 占位符要赋的值
    *
    * */

    @Test   //增
    public void test1() throws Exception {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="insert into product values(?,?,?)";
        int count = jdbcTemplate.update(sql, null, "小米手机2", 1000);
        System.out.println(count);
    }

    @Test   //删
    public void test2() throws Exception {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="delete from product where id=?";
        Object[] obj={2};
        int count = jdbcTemplate.update(sql, obj);
        System.out.println(count);
    }

    @Test   //改
    public void test3() throws Exception {

        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="update product set pname=? where id=?";
        Object[] obj={"红米手机",1};
        int count = jdbcTemplate.update(sql, obj);
        System.out.println(count);



    }
}

元数据(了解)

元数据: 定义数据(表名 数据名 列名 列类型…)的数据就是元数据

结果集元数据:ResultSetMetaData

作用:通过ResultSetMetaData可以获取结果集数据中列的个数 列的类型 表名 数据库名
获取ResultSetMetaData的方式: ResultSetMetaData metaData = resultSet.getMetaData();
列的个数 metaData.getColumnCount()
当前列的名称 metaData.getColumnLabel(序号)
当前列的类型 metaData.getColumnTypeName(序号)
当前列来自于哪个表 metaData.getTableName(序号)
当前列来自于哪个库 metaData.getCatalogName(序号)

参数元数据:ParameterMetaData

作用:通过ParameterMetaData可以获取sql语句占位符的个数和参数类型
获取ParameterMetaData的方式:
ParameterMetaData parameterMetaData = preparedStatement.getParameterMetaData();
获取sql语句占位符的个数:parameterMetaData.getParameterCount();
获取占位对应列的参数类型:parameterMetaData.getParameterType(占位符的序号); mysql不支持 oracle支持

需求:刚才使用JdbcTemplate的update方法 发现可以对数据进行增删改

使用元数据模拟JdbcTemplate的update方法,也能实现数据的增删改

实现:JdbcTemplate的update方法的底层
update方法特点:第一个参数会接受一个String类型sql  第二个会接受一个Object类型数组
// jdbcTemplate操作数据库 dql语句
public class Demo3 {
    @Test   //单行单列的数据查询封装
    //#方法: queryForObject(String sql, Class requiredType,Object...args)
    // sql:要执行的sql语句
    //requiredType:返回值的Class类型
    //args:sql语句占位符需要的可变参数 如果么有可以省略不写
    public void test1() throws Exception {
        /*JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="select count(*) from product";
        int count = jdbcTemplate.queryForObject(sql, int.class);
        System.out.println(count);*/
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());;
        String sql="select pname from product";
        String value = jdbcTemplate.queryForObject(sql, String.class);
        System.out.println(value);
    }

    @Test //单行多列的数据查询封装
    //方法:queryForMap(String sql,Object...args)  map
    // sql:要执行的sql语句
    // args:sql语句占位符需要的可变参数 如果么有可以省略不写
    public void test2() throws Exception {

        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="select * from product where id=?";
        Map<String, Object> map = jdbcTemplate.queryForMap(sql, 1);
        System.out.println(map);

    }

    @Test //多行多列的数据查询封装
    //方法:queryForList(String sql,Object...args) list<map>
    // sql:要执行的sql语句
    // args:sql语句占位符需要的可变参数 如果么有可以省略不写
    public void test3() throws Exception {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="select * from product";
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
        for (Map<String, Object> map : list) {
            System.out.println(map);
        }
    }


    @Test //单行多列的数据查询封装
    //方法:queryForObject(String sql,new BeanPropertyRowMapper<>(类名.class),Object...args) 对象
    // sql:要执行的sql语句
    // BeanPropertyRowMapper:jdbctemplate提供的实现类,可以实现表字段和属性的映射 如果映射成立会就将表字段的值赋值给对象的属性
    // args:sql语句占位符需要的可变参数 如果么有可以省略不写
    public void test4() throws Exception {

        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="select * from product where id=?";
        // 建议:表名和类名相同  字段名和属性名相同
        Product product = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Product>(Product.class), 3);
        System.out.println(product);

        // 细节1:数据封装的时候和对象的属性无关,和set后面的属性有关
        // 细节2:建议属性使用包装类型

    }

    @Test //多行多列的数据查询封装
    //方法:query(String sql,new BeanPropertyRowMapper<>(类名.class),Object...args) 对象
    // sql:要执行的sql语句
    // BeanPropertyRowMapper:jdbctemplate提供的实现类,可以实现表字段和属性的映射 如果映射成立会就将表字段的值赋值给对象的属性
    // args:sql语句占位符需要的可变参数 如果么有可以省略不写
    public void test5(){
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="select * from product";
        List<Product> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Product>(Product.class));
        for (Product product : list) {
            System.out.println(product);
        }
    }
}

三层架构

我们之前的登录案例是将用户输入,数据库的操作,逻辑处理放在了同一个方法中,这样虽然非常直观,

但是等项目做大的时候非常不好维护代码

注册(三层架构)

数据来源于控制台 将用户写入控制台的账号和密码进行注册(User表)

1 当用户输入用户名的时候,先做用户名的校验(是否存在)

存在:给提示信息,结束程序

不存在:继续获取用户输入的密码

2 收集完用户名和密码实现注册功能

发布了96 篇原创文章 · 获赞 21 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 精致技术 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览