回顾:java
sqlmysql
sql分类:spring
DDL:sql
对象:数据库和表数据库
关键词:create alter drop truncateapache
建立数据库:create database day06;api
删除数据库: 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
处理结果
释放资源
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBConnection
{
public static void main(String[] args)
{
String driver = "com.mysql.jdbc.Driver";
//localhost指本机,也能够用本地ip地址代替,3306为MySQL数据库的默认端口号,“user”为要链接的数据库名
String url = "jdbc:mysql://localhost:3306/user";
//填入数据库的用户名跟密码
String username = "test";
String password = "test";
String sql = "select * from user";//编写要执行的sql语句,此处为从user表中查询全部用户的信息
try
{
Class.forName(driver);//加载驱动程序,此处运用隐式注册驱动程序的方法
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
Connection con = DriverManager.getConnection(url,username,password);//建立链接对象
Statement st = con.createStatement();//建立sql执行对象
ResultSet rs = st.executeQuery(sql);//执行sql语句并返回结果集
while(rs.next())//对结果集进行遍历输出
{
System.out.println("username: "+rs.getString(1));//经过列的标号来得到数据
System.out.println("useradd: "+rs.getString("useradd"));//经过列名来得到数据
System.out.println("userage: "+rs.getInt("userage"));
}
//关闭相关的对象 从最外层 开始关闭
if(rs != null)
{
try
{
rs.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
if(st != null)
{
try
{
st.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
if(con !=null)
{
try
{
con.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
}
catch(SQLException e)
{
e.printStackTrace();
}
}
}
初始化数据库和表:
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注入问题
。
攻击
当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。若是代码使用存储过程,而这些存储过程做为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能致使攻击者使用应用程序登录在数据库中执行命令。相关的SQL注入能够经过测试工具pangolin进行。若是应用程序使用特权太高的账户链接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者做为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中自己的变量处理不当,使应用程序存在安全隐患。这样,用户就能够提交一段数据库查询的代码,根据程序返回的结果,得到一些敏感的信息或者控制整个服务器,因而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
回顾:
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