java_JDBC和数据库连接池

JDBC概述

一、基本介绍
在这里插入图片描述

jdbc相关知识小结

在这里插入图片描述

在这里插入图片描述

事务

一、基本介绍
在这里插入图片描述
二、应用实列

package com.shiwu;

import com.JDBC_Utils.utils_demo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author ZhouHao
 * @version 1.0
 * 成为想成为的人
 */
@SuppressWarnings("ALL")
//演示事务 的回滚
public class test {
    public static void main(String[] args) throws SQLException {
//        使用自己创utils得到连接
        Connection connection_utils = utils_demo.get_connection_utils();
//        不让他自动的提交
        connection_utils.setAutoCommit(false); //设置false
        String sql="update actor set name='小浩纸~~~~'  where id=2";
        String sql1="update actor set name='浩浩'  where id=5";
        PreparedStatement preparedStatement=null;
        try {
           preparedStatement = connection_utils.prepareStatement(sql);
//           执行
            preparedStatement.executeUpdate();

//            int i=1/0;

            PreparedStatement preparedStatement1 = connection_utils.prepareStatement(sql1);
            preparedStatement1.executeUpdate();

//            如果所有的代码都执行完成了 就他提交
            connection_utils.commit();
        } catch (SQLException throwables) {
//            如果报错了 就让他 回滚
            connection_utils.rollback();
            throwables.printStackTrace();
        }finally{
//            使用工具类  释放资源
            utils_demo.close_(null, preparedStatement,connection_utils);
        }

    }
}

batch批量处理

一、基本介绍
在这里插入图片描述
二、代码演示

package com.batch;

import com.JDBC_Utils.utils_demo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * @author ZhouHao
 * @version 1.0
 * 成为想成为的人
 */
//演示 批量处理
public class batch_demo {
    public static void main(String[] args) throws SQLException {
//        使用工具类得到一个连接
        Connection connection_utils = utils_demo.get_connection_utils();
        String sql="insert into zh_01 values(?,?) ";
        PreparedStatement preparedStatement = connection_utils.prepareStatement(sql);

        long start = System.currentTimeMillis();
        for (int i = 0; i <5000; i++) {
            preparedStatement.setInt(1, i);
            preparedStatement.setString(2, "小浩纸~");
//            将数据添加到 批量处理中
            preparedStatement.addBatch();
            if ((i+1)%1000==0){
//                满了1000 条数据就提交一次
                preparedStatement.executeBatch();
//                满了1000 条数据就提交一次  然后在清空
                preparedStatement.clearBatch();
            }

        }

        long end = System.currentTimeMillis();
        System.out.println("耗时:"+ (end-start));//耗时:72

    }
}

数据库连接池

一、传统连接问题的所在
在这里插入图片描述
二、一般使用 C3P0 和 Druid
在这里插入图片描述

Druid使用演示

代码演示

package com.druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.sql.Connection;
import java.util.Properties;

/**
 * @author ZhouHao
 * @version 1.0
 * 成为想成为的人
 */
public class druid_demo {
    public static void main(String[] args) throws Exception {

        Properties properties = new Properties();
        properties.load(new FileReader("src\\druid.properties"));
//          创建一个数据库连接池  数据源
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

        long start=System.currentTimeMillis();
        for (int i=0;i<5000;i++) {
            Connection connection = dataSource.getConnection();
            connection.close();
        }
        long end=System.currentTimeMillis();

        System.out.println("耗时:"+(end-start));
    }
}

二、druid.properties 配置文件的详细信息

#key=value
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/hsp_db02?rewriteBatchedStatements=true
username=root
password=123456
#initial connection Size
initialSize=10
#min idle connection size
minIdle=5
#max active connection size
maxActive=50
#max wait time (5000 mil seconds)
maxWait=5000

Druid 德鲁伊 自建utils工具包

代码演示:将一些初始化 连接和关闭资源都放在一个集合里面

package com.JDBC_Utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @author ZhouHao
 * @version 1.0
 * 成为想成为的人
 */
public class utils_druid {
    private static DataSource dataSource;

    //    通过static代码块来初始化
    static {
        try {
            Properties properties = new Properties();
            properties.load(new FileInputStream("src\\druid.properties"));
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //    获取connection 连接
    public static Connection get_Connection() throws SQLException {
        return dataSource.getConnection();
    }

    //    关闭连接
    public static void close_(ResultSet set, Statement statement, Connection connection) {
        try {
            if (set != null) {
                set.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

Apaache-DBUtils

一、对resultSet的结果集 进行改造
在这里插入图片描述
二、代码案列
1、javaBean实列中 (一个类和mysql中的一个表对应起来)

package com.apache_DB_utils;


/**
 * @author ZhouHao
 * @version 1.0
 * 成为想成为的人
 */
// 和MySQL的 actor 表 形成了映射  将插叙到的 数据存放在这里
public class Actor {
    private Integer id;
    private String name;
    private String sex;
    private String borndate;  //时间函数 使用 java.lang.utils  或者是 String
    private String phone;

//    创建一个无参的构造器  底层反射会使用到
    public Actor(){

    }

    public Actor(Integer id, String name, String sex, String bornDate, String phone) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.borndate = bornDate;
        this.phone = phone;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }



    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getBorndate() {
        return borndate;
    }

    public void setBorndate(String borndate) {
        this.borndate = borndate;
    }

    @Override
    public String toString() {
        return "Actor{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", bornDate=" + borndate +
                ", phone='" + phone + '\'' +
                '}';
    }
}

2.完成对应的crud 操作 (增删改查)

package com.apache_DB_utils;

import com.JDBC_Utils.utils_druid;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.jupiter.api.Test;

import java.sql.Connection;
import java.sql.SQLException;


import java.util.List;

/**
 * @author ZhouHao
 * @version 1.0
 * 成为想成为的人
 */
public class DB_utils_demo {
    //使用 apache-DBUtils 工具类 + druid 完成对表的 crud 操作
    @Test
    public  void query_01() throws SQLException {
//        使用druid 创建连接
        Connection connection = utils_druid.get_Connection();
//        创建QueryRunner
        QueryRunner queryRunner = new QueryRunner();

        String sql="select * from actor where id=?";
//        BeanListHandler 将结果集中的每行每列都放入到一个对应的javaBean实列中 然后在放入到对应 List集合中
        List<Actor> query = queryRunner.query(connection, sql, new BeanListHandler<>(Actor.class), 1);

        System.out.println("表中的数据是:");
        for (Actor q:query){
            System.out.println(q);
        }
//        关闭连接
//        底层得到resultSet 会帮我们关闭 query set preparedStatement
        com.JDBC_Utils.utils_druid.close_(null, null, connection);

    }

//    使用  apache-DBUtils 工具类 + druid  完成 dml语言
    @Test
    public void  query_02() throws SQLException {
        Connection connection = utils_druid.get_Connection();

        QueryRunner queryRunner = new QueryRunner();

//        String sql ="update actor set name=? where id=?";
//        String sql ="insert into actor values (null ,'张无忌','男','2000-05-05','1479')";
        String sql ="delete from actor where id=? ";


//        这里使用的话就是 update
        int row = queryRunner.update(connection, sql,7);

        System.out.println(row>0?"成功":"失败");
    }
}

DAO

一、基本说明:
在这里插入图片描述
二、代码案列:
基本设计:
在这里插入图片描述
1、工具类

(1) druid_properties

#key=value
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/hsp_db02?rewriteBatchedStatements=true
username=root
password=123456
#initial connection Size
initialSize=10
#min idle connection size
minIdle=5
#max active connection size
maxActive=50
#max wait time (5000 mil seconds)
maxWait=5000

(2) utils_druid

package com.DAO_.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @author ZhouHao
 * @version 1.0
 * 成为想成为的人
 */
public class utils_druid {
    private static DataSource dataSource;

    //    通过static代码块来初始化
    static {
        try {
            Properties properties = new Properties();
            properties.load(new FileInputStream("src\\druid.properties"));
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //    获取connection 连接
    public static Connection get_Connection() throws SQLException {
        return dataSource.getConnection();
    }

    //    关闭连接
    public static void close_(ResultSet set, Statement statement, Connection connection) {
        try {
            if (set != null) {
                set.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

2、javabean

package com.DAO_.domian;


/**
 * @author ZhouHao
 * @version 1.0
 * 成为想成为的人
 */
// 和MySQL的 actor 表 形成了映射  将插叙到的 数据存放在这里
public class Actor {
    private Integer id;
    private String name;
    private String sex;
    private String borndate;
    private String phone;

//    创建一个无参的构造器  底层反射会使用到
    public Actor(){

    }

    public Actor(Integer id, String name, String sex, String bornDate, String phone) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.borndate = bornDate;
        this.phone = phone;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }



    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getBorndate() {
        return borndate;
    }

    public void setBorndate(String borndate) {
        this.borndate = borndate;
    }

    @Override
    public String toString() {
        return "Actor{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", bornDate=" + borndate +
                ", phone='" + phone + '\'' +
                '}';
    }
}

3、存放xxxDAO、BasicDAO
BasicDAO 公共的父类 存放所有表的共有的方法

package com.DAO_.dao;

import com.DAO_.utils.utils_druid;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;


/**
 * @author ZhouHao
 * @version 1.0
 * 成为想成为的人
 */
public class BasicDAO<T>{
    private QueryRunner queryRunner=new QueryRunner();
    private Connection connection=null;

//    对应任何一个表 完成对他的曾删改
    public int update(String sql,Object...args)  {
        Connection connection=null;
//        得到一个连接
        try {
            connection = utils_druid.get_Connection();
            int update = queryRunner.update(connection, sql, args);
            return update;
        } catch (SQLException e) {
            throw  new RuntimeException(e);
        } finally {
            utils_druid.close_(null, null, connection);
        }

    }

//    查询返回多个对象  对于多个表
    public List<T> query_01(String sql,Class<T> tClass, Object...args){
        try {
            connection=utils_druid.get_Connection();

            List<T> query = queryRunner.query(connection, sql, new BeanListHandler<>(tClass), args);

            return query;

        } catch (SQLException e) {
            throw  new RuntimeException();
        } finally {
            utils_druid.close_(null, null, connection);
        }
    }

    //    查询返回单行单列 对于多个表
    public T query_02(String sql,Class<T> tClass, Object...args){
        try {
            connection=utils_druid.get_Connection();

            T query = queryRunner.query(connection, sql, new BeanHandler<>(tClass), args);

            return query;

        } catch (SQLException e) {
            throw  new RuntimeException();
        } finally {
            utils_druid.close_(null, null, connection);
        }
    }

    //    查询返回一个单  对于多个表
    public Object query_03(String sql, Object...args){
        try {
            connection=utils_druid.get_Connection();

            Object query = queryRunner.query(connection, sql, new ScalarHandler(), args);

            return query;

        } catch (SQLException e) {
            throw  new RuntimeException();
        } finally {
            utils_druid.close_(null, null, connection);
        }
    }

}

2.xxxDAO
存放 这个表的独有的方法

package com.DAO_.dao;

import com.DAO_.domian.Actor;

/**
 * @author ZhouHao
 * @version 1.0
 * 成为想成为的人
 */
public class ActorDAO extends BasicDAO<Actor>{
//    继承了基础的dao 就有了所有的方法
//    如果还要有特有的方法就可以写在这里面
}

4、测试test
就会使测试非常的简洁

package com.DAO_.test;

import com.DAO_.dao.ActorDAO;
import com.DAO_.domian.Actor;
import org.junit.jupiter.api.Test;

import java.util.List;

/**
 * @author ZhouHao
 * @version 1.0
 * 成为想成为的人
 */
public class test_demo {
    @Test
//   1.查询的使用
    public void test_01(){
        ActorDAO actorDAO = new ActorDAO();
        List<Actor> actors = actorDAO.query_01("select * from actor where id>?", Actor.class, 1);
        System.out.println("===查询的结果是===");
        for (Actor a:actors){
            System.out.println(a);
        }
    }

    @Test
//    2.修改数据
    public void test_02(){
        ActorDAO actorDAO = new ActorDAO();
        int row = actorDAO.update("update actor set name=? where id=?", "张无忌",1 );
        System.out.println(row>0?"成功":"失败");
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有心肝,只有干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值