jdbc
一、jdbc
1.基础知识(了解)
(1)简介:java语言操作数据库,是oracle公司制定的一套规范(一套接口).
(2)驱动:jdbc的实现类,由数据库厂商提供.
(3)作用(了解):连接数据库;发送sql语句;处理结果
2.操作步骤 ★
(1)数据库和表
(2)创建一个项目
(3)导入驱动jar包(步骤:项目右键-New-Folder(命名为lib)-将jar包复制到lib中)
(4)编码
注册驱动
格式:Class.forName("全限定名");//包名+类名
例如:Class.forName("com.mysql.jdbc.Driver");
获取连接
格式:static Connection getConnection(String url, String user, String password)
例如:Connection conn =
DriverManager.getConnection("jdbc:mysql://loacalhost:3306/dayxx","root","123");
编写sql
获取语句执行者
例如:PreparedStatement st=conn.prepareStatement(sql);
设置参数
格式:st.setXxx(int 第几个问号,Object 实参);
例如:st.setString(1, "c005");
执行sql
例如:ResultSet rs=st.executeQuery();
int i=st.executeUpdate();
处理结果
格式:若是resultset
while(rs.next()){
rs.getXxx(int|String);
}
例如:
while(rs.next()){
rs.getString("cid");
}
释放资源
3.使用junit单元测试(了解)
要求:
(1)方法是public void xxx(){}
(2)在方法上添加 @Test
(3)在@Test 按下 ctrl+1(快速锁定错误)
(4)在方法上右键 run as -->junit 就可以执行方法了.
4.jdbc-api详解(了解)
所有的包 都是 java.sql 或者 javax.sql
(1)DriverManager:管理了一组jdbc的操作 类
常用方法:
注册驱动(了解)
static void registerDriver(Driver driver) :
将类加载到内存中:
方式1: ★ Class.forName("全限定名");//包名+类名
例如: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 接口 驱动
(2)Connection:连接 接口
常用方法:
获取语句执行者:
(了解)Statement createStatement() :获取普通的语句执行者 会出现sql注入问题
★PreparedStatement prepareStatement(String sql) :获取预编译语句执行者
(了解)CallableStatement prepareCall(String sql) :获取调用存储过程的语句执行者
(了解):
setAutoCommit(false) :手动开启事务
commit() :提交事务
rollback():事务回滚
Statement:语句执行者 接口
(3)PreparedStatement:预编译语句执行者 接口
常用方法:
设置参数:
setXxx(int 第几个问号,Object 实际参数);
常见的方法:
setInt
setString
setObject
执行sql:
ResultSet executeQuery():执行 r 语句 返回值:结果集
int executeUpdate() :执行cud 语句 返回值:影响的行数
(4)ResultSet:结果集 接口
执行查询语句之后返回的结果
常用方法:
boolean next():判断是否有下一条记录,若有返回true且将光标移到下一行,若没有则返回false
光标一开始处于第一条记录的上面
获取具体内容:
格式:
getXxx(int|string)
若参数为int :第几列
若参数为string:列名(字段名)
例如:
获取cname的内容可以通过
getString(2)
getString("cname")
常用方法:
getInt
getString 也可以获取int值
getObject 可以获取任意
5.配置文件
(1)常见的配置文件格式
a.properties 里面内容的格式 key=value
b.xml
(2)获取src目录下的properties格式的配置文件
使用步骤:
a.获取ResourceBundle(获取资源文件里面的内容)对象:
格式:static ResourceBundle getBundle("文件名称不带后缀名")
例如:ResourceBundle bundle=ResourceBundle.getBundle("不带后缀名的文件名");
b.通过ResourceBundle对象获取配置信息(获取值)
格式:String getString(String key) :通过指定key获取指定的value
例如:String value = bundle.getString(key);
二、连接池
1.基础知识(了解)
(1)概述:管理数据库的连接
就是在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可.
所有的连接池必须实现一个接口 javax.sql.DataSource接口
(2)作用:提高项目的性能.
(3)使用:
获取连接方法:Connection getConnection()
归还连接的方法就是以前的释放资源的方法.调用conn.close();
2.自定义连接池(理解思想)
3.增强方法
(1)继承
(2)静态代理(装饰者模式)
(3)动态代理
4.装饰者模式(静态代理)★★★
使用步骤:
(1)装饰者和被装饰者实现同一个接口或者继承同一个类
(2)在装饰者中要有被装饰者的引用
(3)对需要增强的方法进行加强
(4)对不需要加强的方法调用原来方法
5.常见连接池
(1)DBCP(DataBase Connection Pool)数据库连接池:(了解) apache组织
使用步骤:
a.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
b.使用api
方式一:硬编码
//创建连接池
BasicDataSource ds = new BasicDataSource();
//配置信息
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql:///day07");
ds.setUsername("root");
ds.setPassword("1234");
方式二:配置文件
事先编写一个properties文件
//存放配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/dbcp.properties"));
//设置
//prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");
//创建连接池
DataSource ds = new BasicDataSourceFactory().createDataSource(Properties prop);
(2)C3P0:(★) hibernate和spring使用,有自动回收空闲连接的功能.
使用步骤:
a.导入jar包(c3p0-0.9.1.2.jar)
b.使用api
方式一:硬编码(不推荐)
//创建连接池
ComboPooledDataSource ds = new ComboPooledDataSource();
//配置信息 类DBCP
方式二:配置文件
配置文件的名称:c3p0.properties 或者 c3p0-config.xml
配置文件的路径:src下
使用:(通过构造器创建)
//使用默认的配置
new ComboPooledDataSource()
//使用命名的配置 若配置的名字找不到,使用默认的配置
new ComboPooledDataSource(String configName)
三、dbutils
1.简介:是apache组织的一个工具类,封装了jdbc的操作(jdbc框架).
2.使用步骤
(1)导入jar包(commons-dbutils-1.4.jar)
(2)创建一个queryrunner类
queryrunner作用:操作sql语句
构造方法:new QueryRunner(Datasource ds);
(3)编写sql
(4)执行sql
query(..) :执行r操作
update(...):执行cud操作
例如:qr.update(sql, "c201","厨房用品");
3.核心类或接口
(1)QueryRunner:类名
作用:操作sql语句
构造器:new QueryRunner(Datasource ds);
注:底层帮我们创建连接,创建语句执行者,释放资源.
常用方法:
query(..):
update(..):
(2)DbUtils(了解):释放资源,控制事务 类
closeQuietly(Connection conn) :内部处理了异常
commitAndClose(Connection conn):提交事务并释放连接
....
(3)ResultSetHandler:封装结果集 接口
(了解)ArrayHandler: 将查询结果的第一条记录封装成数组,返回
(了解)ArrayListHandler: 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回
★★BeanHandler: 将查询结果的第一条记录封装成指定的bean对象,返回
★★BeanListHandler: 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中返回.
(了解)ColumnListHandler: 将查询结果的指定一列放入list中返回
(了解)MapHandler: 将查询结果的第一条记录封装成map,字段名作为key,值为value返回
★MapListHandler: 将查询结果的每一条记录封装成map集合,将每一个map集合放入list中返回
★ScalarHandler:针对于聚合函数 例如:count(*) 返回的是一个Long值
四、常见案例
1.案例一-通过jdbc完成单表的curd操作
(1)需求:对分类表完成操作.
(2)技术分析:jdbc(java数据库连接)
2.案例二-通过连接池(数据源)优化我们的操作
(1)需求:使用jdbc的时候,每操作一次都需要获取连接(创建)用完之后把连接释放掉了(销毁),通过连接池来优化curd操作.
(2)技术分析:连接池
3.案例三-使用dbutils完成curd操作
(1)需求:使用dbutils完成curd操作
(2)技术分析:dbutils