您的位置:首页 > 编程语言 > Java开发

07-javaWeb-jdbc

2020-07-14 05:55 316 查看

 

目录

一、通过jdbc完成单表的curd操作

1、 1 jdbc

1、 2 jdbc操作步骤:★

1、 2、1 初始化数据库和表

1、 2、2 IDE打开之后——eclipse

1、 2、3 使用junit单元测试

1、 2、4 添加工具类               

1、 2、5  使用工具类插入一条数据

1、 3 jdbc-api详解

1、 3、1 DriverManager:管理了一组jdbc的操作 类

1、 3、2 (了解)Driver:java.sql 接口 驱动

1、 4 常见的配置文件格式

1、 4 、1 properties配置文件存放用户信息

二、通过连接池(数据源)优化我们的操作.

2、 1 连接池概述

2、 2 自定义一个连接池(理解思想) 

2、 2、 1 连接池代码

2、 2 、 2 测试代码

2、 3 增强方法

2、 3、 1 装饰者模式:★★★

2、 4 常用的连接池

2、 4、 1 DBCP:(理解)

2、 4、 2 C3P0:(★)

三、使用dbutils完成curd操作

3、 1 dbutils

3、 2 核心类或接口

3、 2 、1 QueryRunner:类名

3、 2、 2 DbUtils:释放资源,控制事务 类

3、 2 、3 ResultSetHandler:封装结果集 接口

四、总结

一、通过jdbc完成单表的curd操作

 

需求:
        对分类表完成操作.
技术分析:
        jdbc

1、 1 jdbc

        java操作数据库.jdbc是oracle公司指定的一套规范(一套接口)
        驱动:jdbc的实现类.由数据库厂商提供.
        我们就可以通过一套规范操作不同的数据库了(面向对象——多态)
        jdbc作用:
                连接数据库
                发送sql语句
                处理结果

1、 2 jdbc操作步骤:★

        1.数据库和表
        2.创建一个项目
        3.导入驱动jar包
        4.编码:
                注册驱动
                获取连接
                编写sql
                创建预编译的语句执行者(?号)
                设置参数
                执行sql
                处理结果
                释放资源

1、 2、1 初始化数据库和表

                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','书籍');

1、 2、2 IDE打开之后——eclipse

                1.修改字符集 utf-8
                2.新建 java项目
                3.使用的jdk为自己的jdk 不用使用内置

1、 2、3 使用junit单元测试

                要求:
                        1.方法是public void xxx(){}
                        2.在方法上添加 @Test
                        3.在@Test 按下 ctrl+1(快速锁定错误)
                        4.在方法上右键 run as  -->junit 就可以执行方法了.

[code]public class Hello {
@Test
public void f1(){
System.out.println("hello");
}

@Test
public void f2() throws Exception{
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//DriverManager.registerDriver(new Driver());————驱动注册两次

//获取连接 		ctrl+o 整理包
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/day07", "root", "1234");

//编写sql
String  sql="select * from category";

//创建语句执行者
PreparedStatement st=conn.prepareStatement(sql);

//设置参数

//执行sql
ResultSet rs=st.executeQuery();

//处理结果
while(rs.next()){
System.out.println(rs.getString("cid")+"::"+rs.getString("cname"));
}

//释放资源.
rs.close();
st.close();
conn.close();
}

1、 2、4 添加工具类               

注册驱动、 获取连接、释放资源 工具类

异常处理:抛出异常,谁调用谁处理

方法调用前先判断是否为空

[code]public class DataSourceUtils {
private static ComboPooledDataSource ds=new ComboPooledDataSource();

/**
* 获取数据源
* @return 连接池
*/
public static DataSource getDataSource(){
return ds;
}

/**
* 获取连接
* @return 连接
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
return ds.getConnection();
}

/**
* 释放资源
* @param conn 连接
* @param st 语句执行者
* @param rs 结果集
*/
public static void closeResource(Connection conn, Statement st, ResultSet rs) {
closeResultSet(rs);
closeStatement(st);
closeConn(conn);
}

/**
* 释放连接
* @param conn 连接
*/
public static void closeConn(Connection conn) {
if (conn != null) {//调用方法时需要判断是否为空
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;//助于垃圾回收器快速回收
}

}

/**
* 释放语句执行者
* @param st 语句执行者
*/
public static void closeStatement(Statement st) {
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
st = null;
}

}

/**
* 释放结果集
* @param rs 结果集
*/
public static void closeResultSet(ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}

}
}

1、 2、5  使用工具类插入一条数据

            //设置参数
            st.setString(1, "c006");
            st.setString(2, "户外");

            //执行sql ——返回行数
            int i=st.executeUpdate(); 

[code]	//插入一条数据
@Test
public void f3(){
//模板,方便最后释放资源
Connection conn=null;
ResultSet rs=null;
PreparedStatement st=null;

try {
//获取连接
conn=JdbcUtils.getConnection();

//编写sql
String sql="insert into  category values(?,?)";

//获取语句执行者
st=conn.prepareStatement(sql);

//设置参数
st.setString(1, "c006");
st.setString(2, "户外");

//执行sql ——返回行数
int i=st.executeUpdate();

//处理结果
if(i==1){
System.out.println("success");
}else{
System.out.println("fail");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//释放资源
JdbcUtils.closeResource(conn, st, rs);
}
}

 

1、 3 jdbc-api详解

        所有的包 都是 java.sql 或者 javax.sql

1、 3、1 DriverManager:管理了一组jdbc的操作 类

 常用方法:

  • 1、了解:注册驱动        registerDriver

                                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();——object类中的方法

  • 2、掌握:获取连接          getConnection

                                static Connection getConnection(String url, String user, String password) 

                                        参数1:告诉我们连接什么类型的数据库及连接那个数据库

                                                                协议:数据库类型:子协议 参数
                                                mysql:        jdbc:mysql://localhost:3306/数据库名称
                                                oracle:        jdbc:oracle:thin@localhost:1521@实例
                                                
                                        参数2:账户名 root
                                        参数3:密码

1、 3、2 (了解)Driver:java.sql 接口 驱动

  • 1 、Connection:连接 接口

                常用方法:
                        获取语句执行者:
                                (了解)Statement createStatement() :获取普通的语句执行者  会出现sql注入问题
                                ★PreparedStatement prepareStatement(String sql) :获取预编译语句执行者
                                (了解)CallableStatement prepareCall(String sql):获取调用存储过程的语句执行者——oracle

                        了解:
                                setAutoCommit(false) :手动开启事务
                                commit():提交事务
                                rollback():事务回滚——一件完整的事情

  •  2 、Statement:语句执行者 接口

PreparedStatement:预编译语句执行者 接口——Statement的子接口

                常用方法:
                        设置参数:
                                setXxx(int 第几个问号,Object 实际参数);
                                        常见的方法:
                                                 setInt
                                                 setString
                                                 setObject
                        
                        执行sql:
                                 ResultSet executeQuery() :执行 r 语句 返回值:结果集——SQL 查询
                                 int executeUpdate() :执行cud 语句 返回值:影响的行数—— 

INSERT
UPDATE
 或 
DELETE
 语句

  • 4 、ResultSet:结果集 接口

                执行查询语句之后返回的结果
                        常用方法:
                                boolean next():判断是否有下一条记录,若有返回true且将光标移到下一行,若没有呢则返回false
                                        光标一开始处于第一条记录的上面
                                
                                获取具体内容
                                        getXxx(int|string)
                                                若参数为int :第几列
                                                若参数为string:列名(字段名)
                                        例如:
                                                获取cname的内容可以通过
                                                        getString(2)
                                                        getString("cname")
                                        常用方法:
                                                getInt
                                                getString 也可以获取int值
                                                getObject 可以获取任意

1、 4 常见的配置文件格式

        1、 properties——src目录下
                里面内容的格式 key=value——不能有空格,

[code]driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day07
user=root
password=1234

        2、 xml

1、 4 、1 properties配置文件存放用户信息

若我们的配置文件为properties,并且放在src目录下.
我们可以通过 ResourceBundle工具快速获取里面的配置信息
        使用步骤:
                1.获取ResourceBundle 对象:
                        static ResourceBundle getBundle("文件名称不带后缀名") 
                2.通过ResourceBundle 对象获取配置信息 

[code]		// 获取ResourceBundle ctrl+2 l
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");

// 获取指定的内容
DRIVERCLASS = bundle.getString("driverClass");
URL = bundle.getString("url");
USER = bundle.getString("user");
PASSWORD = bundle.getString("password");
  • 更新工具类 
[code]	static final String DRIVERCLASS;
static final String URL;
static final String USER;
static final String PASSWORD;

static {
// 块编辑 alt+shift +a
// 变大写 ctrl+shift+x
// 变小写 ctrl+shift+y
// 向下复制一行   alt+ctrl+↓
// 向下添加一个空行 shift + enter
// 向上添加一个空行 ctrl+shift + enter
// 删除一行 选中行  ctrl+d
// 注释或者去掉注释 ctrl+/
// 向下移动一行 alt + ↓

// 获取ResourceBundle ctrl+2 l
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");

// 获取指定的内容
DRIVERCLASS = bundle.getString("driverClass");
URL = bundle.getString("url");
USER = bundle.getString("user");
PASSWORD = bundle.getString("password");
}

static {
// 注册驱动 ctrl+shift+f格式化代码
try {
Class.forName(DRIVERCLASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

// 获取连接
public static Connection getConnection() throws SQLException {
// 获取连接 ctrl+o 整理包
return  DriverManager.getConnection(URL, USER, PASSWORD);
}

 

二、通过连接池(数据源)优化我们的操作.

需求:
        使用jdbc的时候,每次操作一次都需要获取连接(创建)用完之后把连接释放掉了(销毁),通过连接池来优化curd操作.
技术分析:
        连接池

2、 1 连接池概述

        管理数据库的连接
        作用:
                提高项目的性能.
        就是在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可.
        所有的连接池必须实现一个接口 javax.sql.DataSource接口
        
        获取连接方法:
                Connection getConnection() 
        归还连接的方法
                就是以前的释放资源的方法.调用connection.close();

2、 2 自定义一个连接池(理解思想) 

2、 2、 1 连接池代码

[code]import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;

import com.itheima.utils.JdbcUtils;

/**
* 简易的连接池
* @author Administrator
*
*/
public class MyDataSource {
//存取快
static LinkedList<Connection> pool=new LinkedList<>();
static{
//初始化的时候 需要放入3个连接——存取,集合
for (int i = 0; i < 3; i++) {
try {
Connection conn = JdbcUtils.getConnection();
//存放在最后
pool.addLast(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}

//从连接池中获取连接
public static Connection getConnection(){
//获取连接的时候需要判断list是否为空
if(pool.isEmpty()){
//在添加2个连接进去
for (int i = 0; i < 3; i++) {
try {
Connection conn = JdbcUtils.getConnection();
pool.addLast(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
System.out.println("从池中获取一个连接");
return pool.removeFirst();
}

//归还连接的方法
public static void addBack(Connection conn){
//将conn放入到list的最后面即可
pool.addLast(conn);
System.out.println("连接已归还");
}
}

2、 2 、 2 测试代码

[code]import java.sql.Connection;

public class TestDs {

public static void main(String[] args) {
//创建连接池
MyDataSource ds = new MyDataSource();

//获取连接
Connection conn=ds.getConnection();
System.out.println(conn);

//归还连接
ds.addBack(conn);
}

}

2、 3 增强方法

        1.继承——需要父类源码
        2.装饰者模式(静态代理)
        3.动态代理

2、 3、 1 装饰者模式:★★★

        使用步骤:
                1.装饰者和被装饰者实现同一个接口或者继承同一个类
                2.装饰者中要有被装饰者的引用
                3.对需要增强的方法进行加强
                4.对不需要加强的方法调用原来方法

  • 简单案例 

接口

[code]public interface Car {
void run();
void stop();
}

实现接口

[code]public class QQ implements Car {

@Override
public void run() {
System.out.println("qq在跑");
}

@Override
public void stop() {
System.out.println("刹得住车");
}
}

增强接口

[code]//1.装饰者和被装饰者实现同一个接口或者继承同一个类
public class CarWarp implements Car {
private Car car;
// 2.装饰者中要有被装饰者的引用
public CarWarp(Car car){
this.car=car;
}
//public CarWarp(QQ car)

@Override
public void run() {
//3.对需要增强的方法进行加强
System.out.println("加上电池");
System.out.println("我终于可以5秒破百了..");
}

@Override
public void stop() {
//4.对不需要加强的方法调用原来方法
car.stop();
}
}

测试

[code]	public static void main(String[] args) {
QQ qq = new QQ();
/*qq.run();//qq在跑
qq.stop();//刹得住车*/

CarWarp warp = new CarWarp(qq);
warp.run();
warp.stop();
}
  • conn增强的连接池

增强接口

[code]//构造方法中要传入连接池,实现连接池归还操作
public ConnectionWarp(Connection conn,LinkedList<Connection> list){
this.conn=conn;
this.list=list;
}
[code]//this代表的是当前连接,归还连接池,在构造方法中传入连接池集合
list.addLast(this);
[code]public class ConnectionWarp implements Connection {

private Connection conn;
private LinkedList<Connection> list;

public ConnectionWarp(Connection conn){
this.conn=conn;
}
//构造方法中要传入连接池,实现连接池归还操作
public ConnectionWarp(Connection conn,LinkedList<Connection> list){
this.conn=conn;
this.list=list;
}

@Override
//不需要加强的方法 调用原来的
public Statement createStatement() throws SQLException {
// TODO Auto-generated method stub
return conn.createStatement();
}

@Override
//不需要加强的方法 调用原来的
public PreparedStatement prepareStatement(String sql) throws SQLException {
// TODO Auto-generated method stub
return conn.prepareStatement(sql);
}

@Override
//需要加强的方法
public void close() throws SQLException {
//添加到连接池中
System.out.println("前:"+list.size());
//System.out.println(this);//this代表的是当前连接
list.addLast(this);
System.out.println("后:"+list.size());
System.out.println("已经归还到连接池中");
}

自己编写的连接池

[code]//将conn进行包装
// ConnectionWarp myConn = new ConnectionWarp(conn);
//获取连接使用增强conn的接口
ConnectionWarp myConn = new ConnectionWarp(conn,pool);
[code]/**
* 升级的连接池
* @author Administrator
*
*/
public class MyDataSource {
static LinkedList<Connection> pool=new LinkedList<>();
static{
//初始化的时候 需要放入3个连接
for (int i = 0; i < 3; i++) {
try {
Connection conn = JdbcUtils.getConnection();
pool.addLast(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}

//从连接池中获取连接
public static Connection getConnection(){
//获取连接的时候需要判断list是否为空
if(pool.isEmpty()){
//在添加2个连接进去
for (int i = 0; i < 3; i++) {
try {
Connection conn = JdbcUtils.getConnection();
pool.addLast(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
System.out.println("从池中获取一个连接");
Connection conn = pool.removeFirst();
//将conn进行包装
// ConnectionWarp myConn = new ConnectionWarp(conn);
//获取连接使用增强conn的接口
ConnectionWarp myConn = new ConnectionWarp(conn,pool);
return myConn;
}
}

测试

[code]public class TestDs {

public static void main(String[] args) throws SQLException {
//创建连接池
MyDataSource ds = new MyDataSource();

//获取连接
Connection conn=ds.getConnection();
System.out.println(conn);

//归还连接
conn.close();
}
}

2、 4 常用的连接池

2、 4、 1 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");//本地数据库,默认端口3306,可以省略localhost:3306
                                        ds.setUsername("root");
                                        ds.setPassword("1234");


                                b.配置文件
                                        实现编写一个properties文件

[code]driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///day07
username=root
password=1234

                                        //存放配置文件
                                        Properties prop = new Properties();
                                        prop.load(new FileInputStream("src/dbcp.properties"));
                                        //通过属性设置值
                                        //prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");
                                        
                                        //创建连接池——工厂类
                                        DataSource ds = new BasicDataSourceFactory().createDataSource(prop);

[code]	@Test
//硬编码
public void f1() throws Exception{
//创建连接池
BasicDataSource ds = new BasicDataSource();

//配置信息
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql:///day07");
ds.setUsername("root");
ds.setPassword("1234");

Connection conn=ds.getConnection();
String sql="insert into category values(?,?);";
PreparedStatement st=conn.prepareStatement(sql);

//设置参数
st.setString(1, "c011");
st.setString(2, "饮料");

int i = st.executeUpdate();
System.out.println(i);
//释放资源closeResource(conn, st, rs);
JdbcUtils.closeResource(conn, st, null);
}

@Test
public void f2() throws Exception{
//存放配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/dbcp.properties"));
//设置
//prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");

//创建连接池
DataSource ds = new BasicDataSourceFactory().createDataSource(prop);
Connection conn=ds.getConnection();

String sql="insert into category values(?,?);";
PreparedStatement st=conn.prepareStatement(sql);

//设置参数
st.setString(1, "c012");
st.setString(2, "饮料1");

int i = st.executeUpdate();
System.out.println(i);
JdbcUtils.closeResource(conn, st, null);
}

2、 4、 2 C3P0:(★)

                hibernatespring使用
                有自动回收空闲连接的功能.
                使用步骤:
                        1.导入jar包(c3p0-0.9.1.2.jar)
                        2.使用api
                                a.硬编码(不推荐)
                                        new ComboPooledDataSource()
                                b.配置文件
                                        配置文件的名称:c3p0.properties 或者 c3p0-config.xml
                                        配置文件的路径:src

c3p0.properties : 

[code]c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql:///day07
c3p0.user=root
c3p0.password=1234

 c3p0-config.xml

[code]<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<!-- 基本配置 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/day07</property>
<property name="user">root</property>
<property name="password">1234</property>

<!--扩展配置-->
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>

<!-- 命名的配置 -->
<named-config name="itcast">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/xxxx</property>
<property name="user">root</property>
<property name="password">1234</property>

<!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">20</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">40</property>
<property name="maxStatements">20</property>
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>

                                        编码只需要一句话
                                                new ComboPooledDataSource()//使用默认的配置
                                                new ComboPooledDataSource(String configName)//使用命名的配置 若配置的名字找不                                                 到, 使用默认的配置

三、使用dbutils完成curd操作

技术分析:
        dbutils

3、 1 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操作

编写datesource工具类

[code]public class DataSourceUtils {
private static ComboPooledDataSource ds=new ComboPooledDataSource();

/**
* 获取数据源
* @return 连接池
*/
public static DataSource getDataSource(){
return ds;
}

/**
* 获取连接
* @return 连接
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
return ds.getConnection();
}

/**
* 释放资源
* @param conn 连接
* @param st 语句执行者
* @param rs 结果集
*/
public static void closeResource(Connection conn, Statement st, ResultSet rs) {
closeResultSet(rs);
closeStatement(st);
closeConn(conn);
}

/**
* 释放连接
* @param conn 连接
*/
public static void closeConn(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}

/**
* 释放语句执行者
* @param st 语句执行者
*/
public static void closeStatement(Statement st) {
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
st = null;
}
}

/**
* 释放结果集
* @param rs 结果集
*/
public static void closeResultSet(ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
}
}

 CURDDemo 

[code]public class CURDDemo {
@Test
public void insert() throws SQLException{
//1.创建queryrunner类
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());

//2.编写sql
String sql="insert into category values(?,?)";

//3.执行sql
qr.update(sql, "c201","厨房电器");

}

@Test
public void update() throws SQLException{
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());

String sql="update category set cname = ? where cid = ?";

qr.update(sql, "达电器","c000");
}
}

3、 2 核心类或接口

3、 2 、1 QueryRunner:类名

                作用:操作sql语句
                构造器:
                        new QueryRunner(Datasource ds);
                注意:
                        底层帮我们创建连接,创建语句执行者 ,释放资源.
                常用方法:
                        query(..):
                        update(..):

3、 2、 2 DbUtils:释放资源,控制事务 类

                closeQuietly(conn):内部处理了异常
                commitAndClose(Connection conn):提交事务并释放连接
                ....

3、 2 、3 ResultSetHandler:封装结果集 接口

                ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler,                                   MapHandler,MapListHandler, ScalarHandler
                 

  1.                  (了解)ArrayHandler, 将查询结果的第一条记录封装成数组,返回
  2.                  (了解)ArrayListHandler, 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回
  3.                  ★★BeanHandler, 将查询结果的第一条记录封装成指定的bean对象,返回
  4.                  ★★BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.
  5.                  (了解)ColumnListHandler, 将查询结果的指定一列放入list中返回 
  6.                  (了解)MapHandler, 将查询结果的第一条记录封装成map,字段名作为key,值为value 返回
  7.                  ★MapListHandler, 将查询结果的每一条记录封装map集合,将每一个map集合放入list中返回
  8.                  ★ScalarHandler,针对于聚合函数 例如:count(*) 返回的是一个Long值

创建Bean类

[code]public class Category {
private String cid;
private String cname;
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "Category [cid=" + cid + ", cname=" + cname + "]";
}
}

结果集案例

[code]public class ResultHandleDemo {
@Test
public void arrayHandler() throws SQLException{
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());

String sql="select * from category";

Object[] query = qr.query(sql, new ArrayHandler());
System.out.println(Arrays.toString(query));
}

@Test
public void arrayListHandler() throws SQLException{
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());

String sql="select * from category";
List<Object[]> list = qr.query(sql, new ArrayListHandler());
for (Object[] obj : list) {
System.out.println(Arrays.toString(obj));
}
}

@Test
public void beanHandler() throws SQLException{
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());

String sql="select * from category";

Category bean = qr.query(sql, new BeanHandler<>(Category.class));

System.out.println(bean);
}

@Test
public void beanListHandler() throws SQLException{
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());

String sql="select * from category";

List<Category> list = qr.query(sql, new BeanListHandler<>(Category.class));

for (Category bean : list) {

System.out.println(bean);
}
}

@Test
public void mapHandler() throws SQLException{
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());

String sql="select * from category";

Map<String, Object> map = qr.query(sql, new MapHandler());
System.out.println(map);
}

@Test
public void mapListHandler() throws SQLException{
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());

String sql="select * from category";

List<Map<String, Object>> list = qr.query(sql, new MapListHandler());
for (Map<String, Object> map : list) {
System.out.println(map);
}
}

@Test
public void scalarHandler() throws SQLException{
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());

String sql="select count(*) from category";

Object obj = qr.query(sql, new ScalarHandler());
System.out.println(obj.getClass().getName());
}
}

四、总结

  • 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  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: