• 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

      处理结果

      释放资源

     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

  • 相关阅读:
    cocos2d-x 游戏暂停界面,监听home键,返回键,Menu键 解决方案
    转载cocos2dx的各种动作用法
    cocso2d-x改变精灵图片
    cocos2d-x 菜单
    for循环
    nginx限制IP访问网站
    zabbix server in not running
    筛选nginx访问日志文件中的域名
    Zabbix历史数据清理
    http跳转http
  • 原文地址:https://www.cnblogs.com/nextgg/p/7643483.html
Copyright © 2020-2023  润新知