07-javaWeb-jdbc

    技术2025-04-19  10

     

    目录

    一、通过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 就可以执行方法了.

    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 添加工具类               

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

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

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

    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(); 

    //插入一条数据 @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——不能有空格,

    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 对象获取配置信息 

    // 获取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 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 连接池代码

    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 测试代码

    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.对不需要加强的方法调用原来方法

    简单案例 

    接口

    public interface Car { void run(); void stop(); }

    实现接口

    public class QQ implements Car { @Override public void run() { System.out.println("qq在跑"); } @Override public void stop() { System.out.println("刹得住车"); } }

    增强接口

    //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(); } }

    测试

    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增强的连接池

    增强接口

    //构造方法中要传入连接池,实现连接池归还操作 public ConnectionWarp(Connection conn,LinkedList<Connection> list){ this.conn=conn; this.list=list; } //this代表的是当前连接,归还连接池,在构造方法中传入连接池集合 list.addLast(this); 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("已经归还到连接池中"); }

    自己编写的连接池

    //将conn进行包装 // ConnectionWarp myConn = new ConnectionWarp(conn); //获取连接使用增强conn的接口 ConnectionWarp myConn = new ConnectionWarp(conn,pool); /** * 升级的连接池 * @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; } }

    测试

    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文件

    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);

    @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:(★)

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

    c3p0.properties : 

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

     c3p0-config.xml

    <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工具类

    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 

    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                  

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

    创建Bean类

    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 + "]"; } }

    结果集案例

    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  

    Processed: 0.008, SQL: 9