Java-JDBC- 操作Mysql数据库(Druid连接池)

  • 基础部分

导入druid的jar包https://mvnrepository.com/artifact/com.alibaba/druid/1.1.12icon-default.png?t=N176https://mvnrepository.com/artifact/com.alibaba/druid/1.1.12

使用数据库连接池Druid这里介绍两种连接方法

  1. 硬链接:
    //硬编码
    public void testHard() throws Exception {
        //连接池对象
        DruidDataSource druidDataSource = new DruidDataSource();
        //设置参数(必须的:setUrl,setUsername,setPassword|非必需的:setInitialSize...)
        druidDataSource.setUrl("jdbc:mysql://localhost:3306/xxxxx");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("xxxx");
        //获取连接
        DruidPooledConnection connection = druidDataSource.getConnection();
        //CRUD

        //回收连接
        connection.close();
    }

软连接:

首先准备一个druid.properties配置文件写入数据库的基本配置

#druid配置文件
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/xxxxxx
username=root
password=xxxx
public void testSoft() throws Exception {
        Properties properties = new Properties();
        InputStream rs = DruidUsePart.class.getClassLoader().getResourceAsStream("druid.properties");
        properties.load(rs);

        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
        Connection connection = dataSource.getConnection();
        //CRUD

        connection.close();

    }
  • 实战部分 

1.配置文件src/druid.properties

#druid配置文件
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/xxxxxx
username=root
password=xxxx

2.工具类 

package druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

//这个工具类的作用就是用来给所有的SQL操作提供连接,和释放连接。
public class JDBCUtilsV2 {

    private static DataSource dataSource=null;//连接池对象
    private static ThreadLocal<Connection> tl=new ThreadLocal<>();

    static {
        Properties properties = new Properties();
        InputStream rs = JDBCUtilsV2.class.getClassLoader().getResourceAsStream("druid.properties");
        try {
            properties.load(rs);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        try {
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

    //获取连接
    public static Connection getConnection() throws SQLException {
        Connection connection= tl.get();
        if (connection==null){
            connection=dataSource.getConnection();
            tl.set(connection);
        }
        return connection;
    }

    //释放连接
    public static void freeConnection() throws SQLException {
        Connection connection = tl.get();
        if (connection!=null){
            tl.remove();//清空线程本地变量
            connection.setAutoCommit(true);//回归事务状态(默认)
            connection.close();
        }

    }
}

3.数据库如下 (id为主键且自增)

users

 4.User类如下

@Data
public class User {
    private int id;
    private String userId;
    private String username;
    private String gender;
    private int age;
    private String password;
}

5. DAO接口及其实现类,对所有表的操作(增、删、改、查)代码重复度很高,抽取公共代码,给这些DAO的实现类可以抽取一个公共的父类,我们称为BaseDao

package druid;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;


public class BaseDao {

    /**
     * @param sql    传入带占位符sql语句
     * @param params 传入占位符的参数(Object...按列表使用)
     * @return 返回影响行数
     */
    public int executeUpdate(String sql, Object... params) throws Exception {
        //获取连接
        Connection connection = JDBCUtilsV2.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        for (int i = 1; i <= params.length; i++) {
            preparedStatement.setObject(i, params[i - 1]);
        }
        int rows = preparedStatement.executeUpdate();
        preparedStatement.close();
        //回收连接考虑事务
        if (connection.getAutoCommit()) {
            //没有开启事务
            JDBCUtilsV2.freeConnection();
        }
        return rows;
    }

    /**
     * 通用的查询多个Javabean对象的方法,例如:多个User对象
     * 这里的tClass接收的是T类型的Class对象
     * @param tClass 如果查询员工信息,tClass代表Employee.class
     * @param sql String类型的查询语句
     * @param params 占位符参数
     * @return
     * @param <T> 
     * @throws Exception
     */
    public <T> List<T> executeQuery(Class<T> tClass,String sql,Object... params)throws Exception{
        //获取链接
        Connection connection = JDBCUtilsV2.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        if (params!=null&&params.length!=0){
            //占位符是从1-n,params是从0-n-1
            for (int i = 0; i < params.length; i++) {
             preparedStatement.setObject(i+1,params[i]);
            }
        }
        ResultSet resultSet = preparedStatement.executeQuery();
        ResultSetMetaData metaData = resultSet.getMetaData();//装当前结果集列的信息
        int columnCount = metaData.getColumnCount();//列的数量
        List<T> list = new ArrayList<>();//一行数据对应一个T类型的对象
        while (resultSet.next()) {
            T t=tClass.newInstance();
            for (int i = 1; i <= columnCount; i++) {
                Object value = resultSet.getObject(i);//获取第i列的值(resultSet中的行列都从1开始数)
                String propertyName = metaData.getColumnLabel(i);//select userId as ID,username as Name,gender,age,password from users;中可获取别名ID、Name
                Field field = tClass.getDeclaredField(propertyName);
                field.setAccessible(true);//打破private修饰
                field.set(t,value);
            }
            list.add(t);
        }
        resultSet.close();
        preparedStatement.close();
        if(connection.getAutoCommit()){
            JDBCUtilsV2.freeConnection();
        }
        return list;
    }
}

7.举个例子

//在users中插入一条数据,结果如图8.1所示
    @Test
    public void testInsert() throws Exception {
        UUID uuid = UUID.randomUUID();
        String sql = "insert into users(userId,username,gender,age,password) values(?,?,?,?,?);";
        int rows = executeUpdate(sql, uuid.toString().replace("-", ""), "zhangsan", "male", 25, "123456");
        return rows;
    }

//在users中查询所有数据,结果如图8.2所示
    @Test
    public void findAll() throws Exception {
        String sql = "select * from users;";
        List<User> list = executeQuery(User.class, sql);
        System.out.println(list.toString());
    }

8.结果 

图8.1插入结果
图8.2查询结果​​​

 

 10.对比

对于上述操作的对比可以见文章https://mp.csdn.net/mp_blog/creation/editor/129563984

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Druid连接池是一个高效、可靠的数据库连接池。它支持多种数据库,包括MySQL。使用Druid连接池可以大大提高应用程序的数据库访问性能。 要使用Druid连接池连接MySQL数据库,需要在项目中引入DruidMySQL的依赖包。然后,在配置文件中配置Druid连接池的相关参数,包括数据库连接URL、用户名、密码、驱动类等。具体的配置方式可以参考Druid官方文档。 下面是一个简单的配置示例: ``` # 数据库连接池配置 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver # 连接池配置 spring.datasource.druid.initial-size=5 spring.datasource.druid.min-idle=5 spring.datasource.druid.max-active=20 spring.datasource.druid.max-wait=60000 spring.datasource.druid.time-between-eviction-runs-millis=60000 spring.datasource.druid.min-evictable-idle-time-millis=300000 spring.datasource.druid.validation-query=SELECT 1 FROM DUAL spring.datasource.druid.test-while-idle=true spring.datasource.druid.test-on-borrow=false spring.datasource.druid.test-on-return=false spring.datasource.druid.pool-prepared-statements=true spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20 spring.datasource.druid.filters=stat,wall,log4j spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 ``` 配置好之后,就可以在代码中通过Druid连接池获取数据库连接,并执行SQL语句了。例如: ``` // 获取数据库连接 Connection conn = dataSource.getConnection(); // 执行SQL语句 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM user"); while (rs.next()) { System.out.println(rs.getString("name")); } // 关闭连接 rs.close(); stmt.close(); conn.close(); ``` 需要注意的是,使用完数据库连接后一定要及时关闭连接,释放资源,否则会造成连接泄漏和系统资源浪费。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值