JDBC,数据库连接池,DBUtils,MYSQL批处理,MYSQL元数据

JDBCUtils:

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

public class JdbcUtil {
    private static DataSource dataSource; //数据库连接池
    static {
        Properties properties = new Properties();
        InputStream is = JdbcUtil.class.getClassLoader().getResourceAsStream("druid.properties");
        try {
            properties.load(is);
            is.close();
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        }  catch (IOException ioException) {
            ioException.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection() throws Exception {
        return dataSource.getConnection();
    }
    public static Connection getConnectionOld() throws IOException, ClassNotFoundException, SQLException {
        InputStream is=JdbcUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
        Properties properties = new Properties();
        properties.load(is);
        is.close();

        String driverClass=properties.getProperty("driverClass");
        String url=properties.getProperty("url");
        String user=properties.getProperty("user");
        String password=properties.getProperty("password");

        Class.forName(driverClass);
        Connection connection = DriverManager.getConnection(url, user, password);
        return connection;

    }

    public static void close(Connection connection){
       close(connection,null,null);
    }

    public static void close(Connection connection, Statement statement){
        close(connection,statement,null);
    }

    public static void close(Connection connection, Statement statement, ResultSet resultSet){
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

}

druid.properties:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc?characterEncoding=UTF-8
username=root
password=123456

#初始化容量
initialSize = 3
#最大激活数
maxActive =100
#最小发呆数
minIdle =10

CommonUtil:

import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class CommonUtil {
    public static int update(Connection connection,String sql,Object...args) throws SQLException, IOException, ClassNotFoundException {

        PreparedStatement preparedStatement = null;
        preparedStatement = connection.prepareStatement(sql);
        for (int i = 0; i < args.length; i++) {
            preparedStatement.setObject(i+1,args[i]);
        }
        return preparedStatement.executeUpdate();



    }
    public static void view(Connection connection,String sql,Object...args) throws SQLException, IOException, ClassNotFoundException {
        List<Customer> list = new ArrayList<>();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        preparedStatement = connection.prepareStatement(sql);
        //设置参数
        for (int i = 0; i < args.length; i++) {
            preparedStatement.setObject(i+1,args[i]);
        }

        resultSet = preparedStatement.executeQuery();
        ResultSetMetaData resultSetMetaData =resultSet.getMetaData();

        //输出表头
        for (int i = 0; i < resultSetMetaData.getColumnCount(); i++) {
            System.out.print(resultSetMetaData.getColumnLabel(i+1)+"\t");
        }
        System.out.println();


        while (resultSet.next()) {
            for (int i = 0; i < resultSetMetaData.getColumnCount(); i++) {
                Object object = resultSet.getObject(resultSetMetaData.getColumnLabel(i + 1));
                System.out.print(object+"\t");
            }
            System.out.println();
        }

    }
}

 

JDBCDAO:

import com.atguigu.day23.JdbcUtil;
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.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class JdbcDao<T> {
    private QueryRunner queryRunner = new QueryRunner();
    private Class<T> clazz;

    public JdbcDao(Class<T> clazz) {
        this.clazz = clazz;
    }
    public T getBean(String sql, Object... args) throws Exception {
        Connection connection = null;
        try {
            connection = JdbcUtil.getConnection();
            BeanHandler<T> beanHandler = new BeanHandler<T>(clazz);
            return queryRunner.query(connection, sql, beanHandler, args);
        } finally {
            JdbcUtil.close(connection);
        }
    }

    public List<T> getList(String sql, Object... args) throws Exception {
        Connection connection = null;
        try {
            connection = JdbcUtil.getConnection();
            BeanListHandler<T> beanListHandler = new BeanListHandler<T>(clazz);
            return queryRunner.query(connection, sql, beanListHandler, args);
        } finally {
            JdbcUtil.close(connection);
        }
    }

    public Object getValue(String sql, Object... args) throws Exception {
        Connection connection = null;
        try {
            connection = JdbcUtil.getConnection();
            ScalarHandler scalarHandler = new ScalarHandler();
            return queryRunner.query(connection, sql, scalarHandler, args);
        } finally {
            JdbcUtil.close(connection);
        }
    }

    public int update(String sql, Object... args) throws Exception {
        Connection connection = null;
        try {
            connection = JdbcUtil.getConnection();
            return queryRunner.update(connection, sql, args);
        } finally {
            JdbcUtil.close(connection);
        }
    }
}

 

查询测试:

 @Test
    public void test4(){
        JdbcDao<Customer> customerJdbcDao = new JdbcDao<>(Customer.class);
        try {
            Customer bean = customerJdbcDao.getBean("select * from customer where id =?",1);
            System.out.println("bean = " + bean);

            List<Customer> list = customerJdbcDao.getList("select * from customer where id<?", 4);
            System.out.println("list = " + list);

            Object value = customerJdbcDao.getValue("select avg(age) from customer");
            System.out.println("value = " + value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

批处理:

  mysql 批处理是默认关闭的,所以需要加一个参数才打开mysql 数据库批处理,在url中添加:

rewriteBatchedStatements=true
例如: url=jdbc:mysql://127.0.0.1:3306/db5?characterEncoding=UTF-8&rewriteBatchedStatements=true

 

package com.lagou.testbatch;

import com.lagou.utils.DruidUtils;

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

public class BatchInsert {

    //使用批处理 向表中添加 10000条数据
    public static void main(String[] args) throws SQLException {

        //1.获取连接
        Connection connection = DruidUtils.getConnection();

        //2.获取预处理对象
        PreparedStatement ps = connection.prepareStatement("insert into testBatch(uname) values(?)");

        //3.执行批量插入操作
        for (int i = 0; i < 10000 ; i++){
            ps.setString(1,"小强" + i);

            //将SQL添加到批处理列表
            ps.addBatch();
        }
        //添加时间戳 测试执行效率
        long start = System.currentTimeMillis();

        //4.统一执行 批量插入操作
        ps.executeBatch();

        long end = System.currentTimeMillis();

        System.out.println("插入10000条数据需要使用: " + (end - start) + " 毫秒!");
        //5.关闭连接
        DruidUtils.close(connection,ps);
    }

}

MySql元数据:

除了表之外的数据都是元数据,可以分为三类:

  • 查询结果信息: UPDATE 或 DELETE语句 受影响的记录数。
  • 数据库和数据表的信息: 包含了数据库及数据表的结构信息。
  • MySQL服务器信息: 包含了数据库服务器的当前状态,版本号等。
show status; 查看服务器的状态信息
select version(); 获取mysql服务器的版本信息
show columns from table_name; 显示表的字段信息等,和desc table_name一样
show index from table_name; 显示数据表的详细索引信息,包括PRIMARY KEY(主键)

JDBC中描述元数据的类:

 

获取元数据对象的方法 getMetaData ():

  • connection 连接对象, 调用 getMetaData () 方法,获取的是DatabaseMetaData数据库元数据对象
  • PrepareStatement 预处理对象调用 getMetaData () , 获取的是ResultSetMetaData , 结果集元数据对象

DatabaseMetaData的常用方法:

 

ResultSetMetaData的常用方法:

 

 

 

package com.lagou.testmetadata;

import com.lagou.utils.DruidUtils;
import org.junit.Test;

import java.sql.*;

public class TestMetaData {

    //1.获取数据库相关的元数据信息 使用DatabaseMetaData
    @Test
    public void testDataBaseMetaData() throws SQLException {

        //1.获取数据库连接对象 connection
        Connection connection = DruidUtils.getConnection();

        //2.获取代表数据库的 元数据对象 DatabaseMetaData
        DatabaseMetaData metaData = connection.getMetaData();

        //3.获取数据库相关的元数据信息
        String url = metaData.getURL();
        System.out.println("数据库URL: " + url);

        String userName = metaData.getUserName();
        System.out.println("当前用户: " + userName );

        String productName = metaData.getDatabaseProductName();
        System.out.println("数据库产品名: " + productName);

        String version = metaData.getDatabaseProductVersion();
        System.out.println("数据库版本: " + version);

        String driverName = metaData.getDriverName();
        System.out.println("驱动名称: " + driverName);

        //判断当前数据库是否只允许只读
        boolean b = metaData.isReadOnly();  //如果是 true 就表示 只读
        if(b){
            System.out.println("当前数据库只允许读操作!");
        }else{
            System.out.println("不是只读数据库");
        }

        connection.close();
    }

   //获取结果集中的元数据信息
    @Test
    public void testResultSetMetaData() throws SQLException {

        //1.获取连接
        Connection con = DruidUtils.getConnection();

        //2.获取预处理对象
        PreparedStatement ps = con.prepareStatement("select * from employee");
        ResultSet resultSet = ps.executeQuery();

        //3.获取结果集元素据对象
        ResultSetMetaData metaData = ps.getMetaData();

        //1.获取当前结果集 共有多少列
        int count = metaData.getColumnCount();
        System.out.println("当前结果集中共有: " + count + " 列");

        //2.获结果集中 列的名称 和 类型
        for (int i = 1; i <=  count; i++) {
            String columnName = metaData.getColumnName(i);
            System.out.println("列名: "+ columnName);

            String columnTypeName = metaData.getColumnTypeName(i);
            System.out.println("类型: " +columnTypeName);
        }

        //释放资源
        DruidUtils.close(con,ps,resultSet);
    }

}

 

posted @ 2021-05-25 20:01  wangheng1409  阅读(50)  评论(0编辑  收藏  举报