内容介绍
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 收集完用户名和密码实现注册功能