day07-(JDBC)
回顾: sql sql分类: DDL: 对象:数据库和表 关键词:create alter drop truncate 创建数据库:create database day06; 删除数据库: drop database day06; 创建表:create table user( id int primark key auto_increment, username varchar(20) ); 修改表: alter table user rename to user10; alter table user add password varchar(20); alter table user change password pwd varchar(20); alter table user modify pwd int; alter table user drop pwd; 删除表: drop table user; 常用的命令: use day06; show tables; desc user; show create table user; DML: 对象:记录(行) 关键词:insert update delete 插入: insert into user values(字段值1,字段值2,...);-- 所有的字段 insert into user(字段1,字段2....) values(字段值1,字段值2);-- 插入指定的字段 更新: update user set 字段=字段值1,字段2=字段值2 where 条件; 删除: delete from user where 条件; 扩展: 以后开发中很少使用delete,数据无价,删除有物理和逻辑(常用), 逻辑删除一般会在表中添加一个字段(isdel:若值为1,代表删除了;若为0代表没有删除), 此时的删除操作变成了更新操作. DQL: select ... from 表名 where 条件 group by 分组字段 having 条件 order by 排序字段; 执行顺序: 1.确定数据来自那张表 from 2.是否需要筛选 where 3.是否需要分组 group by 4.分组后是否需要筛选 having 5.是否需要排序 order by 6.确定显示那些数据. select DCL:用户 权限 事务 //////////////////////// auto_increment 自增 truncate 干掉表,重新创建 和delete的区别 数据类型: int 和 varchar(size):可变长度 date time datetime timestamp //////////////////////////////////// 多表的操作: 表与表之间的关系: 一对多: 在多表的一方添加一个外键,外键的名称一般是主表名称_id,外键的类型和主表的主键的类型保持一致 为了保证数据的有效性和完整性, 需要在多表上添加外键约束 格式: alter table 多表 add [constraint [外键的名称]] foreign key(外键名称) references 主表名称(主键); 多对多: 添加一张中间表,存放两张表的主键,就可以将多对多拆分成两个一对多了 为了保证数据的有效性和完整性, 需要在中间表添加两个外键约束 一对一:(了解) 1.两个实体合二为一(字段比较少) 2.将一张表的主键添加外键约束即可 ///////////////////////////// 多表的查询: 内连接: 显式: select a.*,b.* from a join b on 条件; 隐式: select a.*,b.* from a,b where 条件; 外连接: 左外连接: select a.*,b.* from a left join b on 条件; 以a为主,展示所有数据,根据条件关联查询b表,满足条件则展示,不满足的话以null显示 子查询:: 一个查询依赖于另一个查询. ////////////////////////////////////// 案例1-通过jdbc完成单表的curd操作: 需求: 对分类表完成操作. 技术分析: jdbc /////////////////////// jdbc: java操作数据库.jdbc是oracle公司指定的一套规范(一套接口) 驱动:jdbc的实现类.由数据库厂商提供. 我们就可以通过一套规范操作不同的数据库了(多态) jdbc作用: 连接数据库 发送sql语句 处理结果 jdbc操作步骤:★ 1.数据库和表 2.创建一个项目 3.导入驱动jar包 4.编码: 注册驱动 获取连接 编写sql 创建预编译的语句执行者 设置参数 执行sql 处理结果 释放资源 初始化数据库和表: CREATE DATABASE day07; USE day07; create table category( cid varchar(20) primary key, cname varchar(20) ); insert into category values('c001','电器'); insert into category values('c002','服饰'); insert into category values('c003','化妆品'); insert into category values('c004','书籍'); IDE打开之后 1.修改字符集 utf-8 2.新建 java项目 3.使用的jdk为自己的jdk 不用使用内置 使用junit单元测试 要求: 1.方法是public void xxx(){} 2.在方法上添加 @Test 3.在@Test 按下 ctrl+1(快速锁定错误) 4.在方法上右键 run as -->junit 就可以执行方法了. jdbc-api详解: 所有的包 都是 java.sql 或者 javax.sql DriverManager:管理了一组jdbc的操作 类 常用方法: 了解:注册驱动 static void registerDriver(Driver driver) : 通过查看 com.mysql.jdbc.Driver的源码 有如下代码 static { try { java.sql.DriverManager.registerDriver(new Driver());//这段代码我们已经写过 } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } 驱动注册了两次.我们只需要将静态代码块执行一次,类被加载到内存中会执行静态代码块,并且只执行一次. 现在只需要将类加载到内存中即可: 方式1: ★Class.forName("全限定名");//包名+类名 com.mysql.jdbc.Driver 方式2: 类名.class; 方式3: 对象.getClass(); 掌握:获取连接 static Connection getConnection(String url, String user, String password) 参数1:告诉我们连接什么类型的数据库及连接那个数据库 协议:数据库类型:子协议 参数 mysql: jdbc:mysql://localhost:3306/数据库名称 oracle: jdbc:oracle:thin@localhost:1521@实例 参数2:账户名 root 参数3:密码 (了解)Driver:java.sql 接口 驱动 Connection:连接 接口 常用方法: 获取语句执行者: (了解)Statement createStatement() :获取普通的语句执行者 会出现sql注入问题 ★PreparedStatement prepareStatement(String sql) :获取预编译语句执行者 (了解)CallableStatement prepareCall(String sql):获取调用存储过程的语句执行者 了解: setAutoCommit(false) :手动开启事务 commit():提交事务 rollback():事务回滚 Statement:语句执行者 接口 PreparedStatement:预编译语句执行者 接口 常用方法: 设置参数: setXxx(int 第几个问号,Object 实际参数); 常见的方法: setInt setString setObject 执行sql: ResultSet executeQuery() :执行 r 语句 返回值:结果集 int executeUpdate() :执行cud 语句 返回值:影响的行数 ResultSet:结果集 接口 执行查询语句之后返回的结果 常用方法: boolean next():判断是否有下一条记录,若有返回true且将光标移到下一行,若没有呢则返回false 光标一开始处于第一条记录的上面 获取具体内容 getXxx(int|string) 若参数为int :第几列 若参数为string:列名(字段名) 例如: 获取cname的内容可以通过 getString(2) getString("cname") 常用方法: getInt getString 也可以获取int值 getObject 可以获取任意 /////////////////////// 常见的配置文件格式: 1.properties 里面内容的格式 key=value 2.xml ///////////////// 若我们的配置文件为properties,并且放在src目录下. 我们可以通过 ResourceBundle工具快速获取里面的配置信息 使用步骤: 1.获取ResourceBundle 对象: static ResourceBundle getBundle("文件名称不带后缀名") 2.通过ResourceBundle 对象获取配置信息 String getString(String key) :通过执行key获取指定的value ////////////////////// 案例2-通过连接池(数据源)优化我们的操作. 需求: 使用jdbc的时候,没操作一次都需要获取连接(创建)用完之后把连接释放掉了(销毁),通过连接池来优化curd操作. 技术分析: 连接池 //////////////////// 连接池概述: 管理数据库的连接, 作用: 提高项目的性能. 就是在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可. 所有的连接池必须实现一个接口 javax.sql.DataSource接口 获取连接方法: Connection getConnection() 归还连接的方法就是以前的释放资源的方法.调用connection.close(); 自定义一个连接池(理解思想) 常用连接池: DBCP C3P0 /////////////////// 增前方法 1.继承 2.装饰者模式(静态代理) 3.动态代理 ////////////// 装饰者模式:★★★ 使用步骤: 1.装饰者和被装饰者实现同一个接口或者继承同一个类 2.装饰者中要有被装饰者的引用 3.对需要增强的方法进行加强 4.对不需要加强的方法调用原来方法 //////////////////////////////////// 常用的连接池: DBCP:(理解) apache组织 使用步骤: 1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar) 2.使用api a.硬编码 //创建连接池 BasicDataSource ds = new BasicDataSource(); //配置信息 ds.setDriverClassName("com.mysql.jdbc.Driver"); ds.setUrl("jdbc:mysql:///day07"); ds.setUsername("root"); ds.setPassword("1234"); b.配置文件 实现编写一个properties文件 //存放配置文件 Properties prop = new Properties(); prop.load(new FileInputStream("src/dbcp.properties")); //设置 //prop.setProperty("driverClassName", "com.mysql.jdbc.Driver"); //创建连接池 DataSource ds = new BasicDataSourceFactory().createDataSource(prop); C3P0:(★) hibernate和spring使用 有自动回收空闲连接的功能. 使用步骤: 1.导入jar包(c3p0-0.9.1.2.jar) 2.使用api a.硬编码(不推荐) new ComboPooledDataSource() b.配置文件 配置文件的名称:c3p0.properties 或者 c3p0-config.xml 配置文件的路径:src下 编码只需要一句话 new ComboPooledDataSource()//使用默认的配置 new ComboPooledDataSource(String configName)//使用命名的配置 若配置的名字找不到,使用默认的配置 //////////////////////////// 案例3-使用dbutils完成curd操作 技术分析: dbutils dbutils: 是apache组织的一个工具类,jdbc的框架,更方便我们使用 使用步骤: 1.导入jar包(commons-dbutils-1.4.jar) 2.创建一个queryrunner类 queryrunner作用:操作sql语句 构造方法: new QueryRunner(Datasource ds); 3.编写sql 4.执行sql query(..):执行r操作 update(...):执行cud操作 //////////////////////////// 核心类或接口 QueryRunner:类名 作用:操作sql语句 构造器: new QueryRunner(Datasource ds); 注意: 底层帮我们创建连接,创建语句执行者 ,释放资源. 常用方法: query(..): update(..): DbUtils:释放资源,控制事务 类 closeQuietly(conn):内部处理了异常 commitAndClose(Connection conn):提交事务并释放连接 .... ResultSetHandler:封装结果集 接口 ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler (了解)ArrayHandler, 将查询结果的第一条记录封装成数组,返回 (了解)ArrayListHandler, 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回 ★★BeanHandler, 将查询结果的第一条记录封装成指定的bean对象,返回 ★★BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回. (了解)ColumnListHandler, 将查询结果的指定一列放入list中返回 (了解)MapHandler, 将查询结果的第一条记录封装成map,字段名作为key,值为value 返回 ★MapListHandler, 将查询结果的每一条记录封装map集合,将每一个map集合放入list中返回 ★ScalarHandler,针对于聚合函数 例如:count(*) 返回的是一个Long值 ////////////////////////////////// 上午回顾: jdbc: java语言操作数据库 jdbc是oracle公司指定的一套规范, 驱动:jdbc的实现类,由数据库厂商提供. jdbc操作步骤: 1.导入驱动jar包 2.注册驱动 3.获取连接 4.编写sql 5.获取语句执行者 PreparedStatement st=conn.prepareStatement(sql); 6.设置参数 st.setXxx(int 第几个问号,Object 实参); 7.执行sql ResultSet rs=st.executeQuery(); int i=st.executeUpdate(); 8.处理结果 若是resultset while(rs.next()){ rs.getXxx(int|String) } 9.释放资源 //////////////////////////////////////// 获取src目录下的properties格式的配置文件 ResourceBundle bundle=ResourceBundle.getBundle("不带后缀名的文件名"); String value = bundle.getString("key"); //////////////////////// 自定义连接池: 增强方法: 1.继承 2.装饰者模式(静态代理) 3.动态代理 /////////////// 装饰者模式(静态代理) 1.装饰者和被装饰者实现同一个接口或者继承同一个类 2.在装饰者中要有被装饰者的引用 3.对需要增强的方法进行加强 4.对不需要加强的方法调用原来方法 /////////////////// 常见连接池: dbcp: c3p0:★ 配置文件: 名称:c3p0.properties或者 c3p0-config.xml 位置:src下 使用: new ComboPooledDataSource() //////////////// dbutils: 工具类,封装了jdbc的操作. 使用步骤: 1.导入jar包 2.创建queryrunner类 3.编写sql 4.执行sql queryrunner:操作sql语句 构造器: new queryrunner() 方法: query(..) update(..) ResultSetHandler:封装结果集 BeanHandler BeanListHandler MapListHandler ScalarHandler