IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> jdbc基础 -> 正文阅读

[大数据]jdbc基础

一、获取连接

import org.junit.Test;
import java.io.File;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.util.Properties;
public class ConnectionTest {
    /**
     * 方式一
     */
    @Test
    public void testConnect1() throws Exception {
        //加载驱动
        Class<?> clazz = Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) clazz.getDeclaredConstructor().newInstance();
        //提供连接数据
        String url = "jdbc:mysql://localhost:3306/school";
        Properties info = new Properties();
        info.setProperty("user","root");
        info.setProperty("password","123456");
        //获取连接
        Connection connect = driver.connect(url, info);
        System.out.println(connect);
    }
    /**
     * 方式二:使用DriverManger
     */
    @Test
    public void testConnect2() throws Exception {
        //获取Driver对象
        Class<?> clazz = Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) clazz.getDeclaredConstructor().newInstance();
        //加载驱动
        DriverManager.registerDriver(driver);
        //获取连接
        Connection connect = DriverManager.getConnection("jdbc:mysql://localhost:3306/school", "root", "123456");
        System.out.println(connect);
    }
    /**
     * 方式三:使用DriverManger
     */
    @Test
    public void testConnect3() throws Exception {
        //获取Driver对象并加载驱动
        Class.forName("com.mysql.jdbc.Driver");//Driver类的静态代码块中注册加载驱动
//        public class Driver extends NonRegisteringDriver implements java.sql.Driver {
//            public Driver() throws SQLException {
//            }
//            static {
//                try {
//                    DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//                } catch (SQLException var1) {
//                    throw new RuntimeException("Can't register driver!");
//                }
//            }
//        }
        //获取连接
        Connection connect = DriverManager.getConnection("jdbc:mysql://localhost:3306/school", "root", "123456");
        System.out.println(connect);
    }
    /**
     * 方式四:最终版
     */
    @Test
    public void testConnect4() throws Exception {
        //读取配置文件
        InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
        Properties properties = new Properties();
        properties.load(is);
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        //获取Driver对象并加载驱动
        Class.forName(driver);
        //获取连接
        Connection connect = DriverManager.getConnection(url,user,password);
        System.out.println(connect);
    }
}

二、批量插入

url=jdbc:mysql://localhost:3306/school?useSSL=false&rewriteBatchedStatements=true
user=root
password=123456
driver=com.mysql.jdbc.Driver
public class JDBCUtil {
    //获取连接
    public static Connection getConnection() throws Exception {
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
        Properties pt = new Properties();
        pt.load(is);
        String driver = pt.getProperty("driver");
        String url = pt.getProperty("url");
        String user = pt.getProperty("user");
        String password = pt.getProperty("password");
        Class.forName(driver);
        return DriverManager.getConnection(url,user,password);
    }
    //关闭连接
    public static void closeResource(Connection conn, PreparedStatement ps){
        try {
            if(conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(ps != null) ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
public class BatchTest {
    public static void main(String[] args){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            //获取连接
            conn = JDBCUtil.getConnection();
            //测试数据删数据
            String deleteSql = "truncate table my_test";
            PreparedStatement deletePs = conn.prepareStatement(deleteSql);
            deletePs.execute();
            //设置不非自动提交
            long start = System.currentTimeMillis();
            conn.setAutoCommit(false);
            String sql = "insert into my_test (id,name) values(?,?)";
            ps = conn.prepareStatement(sql);
            for (int i = 1; i <= 10000000; i++) {
                ps.setInt(1,i);
                ps.setString(2,"name_"+i);
                ps.addBatch();
                if(i % 1000 == 0){
                    ps.executeBatch();
                    ps.clearBatch();
//                    conn.commit();
                }
            }
            ps.executeBatch();
            ps.clearBatch();
            conn.commit();
            long end = System.currentTimeMillis();
            System.out.println("耗时:"+(end-start)/1000+"秒");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.closeResource(conn,ps);
        }
    }
}
  • rewriteBatchedStatements=true 启动批量插入,否则executeBatch也是一个一个的插入。
  • 批量插入自动提交效率比手动最后一把提交效率低。

三、数据库连接池

  • JDBC的数据库连接池使用 javax.sql.DataSource 来表示,DataSource只是接口,需要具体的实现类。
  • DBCP:tomcat自带,速度比c3p0较快,但自身存在bug。
  • C3P0:速度较慢,稳定性可以。
  • Proxool:有监控连接池状态功能,稳定性较差。
  • Druid(德鲁伊):阿里巴巴提供,集以上优点与一身。

德鲁伊连接池

public class DruidTest {
	//传统方式
    @Test
    public void test1() throws SQLException {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/school");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        //设置最大活跃数等等
        dataSource.setMaxActive(10);
        Connection conn = dataSource.getConnection();
        System.out.println(conn);
    }
    //使用配置文件-推荐
    @Test
    public void test2() throws Exception {
        Properties properties = new Properties();
        //方式一:
//        FileInputStream is = new FileInputStream(new File("druid.properties"));
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
        properties.load(is);
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
        Connection conn = dataSource.getConnection();
        System.out.println(conn);
    }
}

四、Apache-DBUtils实现CRUD操作

开源工具类,对jdbc简单封装

  • 增删改通用操作
    @Test
    public void test1() throws Exception {
        Connection conn = JDBCUtil.getConnection();
        QueryRunner runner = new QueryRunner();
        String sql = "insert into my_test (id,name) values(?,?)";
        int count = runner.update(conn, sql, 1, "张三");
        conn.close();
        System.out.println("影响条数:"+count);
    }
  • 查询一个对象
    @Test
    public void test2() throws Exception {
        Connection conn = JDBCUtil.getConnection();
        QueryRunner runner = new QueryRunner();
        String sql = "select id,name from my_test where id = ?";
        BeanHandler<MyTest> rsh = new BeanHandler<>(MyTest.class);
        MyTest myTest = runner.query(conn, sql, rsh, 1);
        conn.close();
        System.out.println(myTest.toString());
    }
  • 查询多个对象
    @Test
    public void test3() throws Exception {
        Connection conn = JDBCUtil.getConnection();
        QueryRunner runner = new QueryRunner();
        String sql = "select id,name from my_test where id > ?";
        BeanListHandler<MyTest> rsh = new BeanListHandler<>(MyTest.class);
        List<MyTest> myTestList = runner.query(conn, sql, rsh, 0);
        conn.close();
        myTestList.forEach(System.out::println);
    }
  • 查询对象以map返回
    @Test
    public void test4() throws Exception {
        Connection conn = JDBCUtil.getConnection();
        QueryRunner runner = new QueryRunner();
        String sql = "select id,name from my_test where id > ?";
        MapListHandler rsh = new MapListHandler();
        List<Map<String, Object>> mapList = runner.query(conn, sql, rsh, 0);
        conn.close();
        System.out.println(mapList);
    }
  • 查询特殊值
    @Test
    public void test5() throws Exception {
        Connection conn = JDBCUtil.getConnection();
        QueryRunner runner = new QueryRunner();
        String sql = "select count(*) from my_test";
        ScalarHandler<Long> rsh = new ScalarHandler<>();
        Long count = runner.query(conn, sql, rsh);
        conn.close();
        System.out.println(count);
    }
  • 批量插入
    @Test
    public void test7() throws Exception {
        Connection conn = JDBCUtil.getConnection();
        QueryRunner runner = new QueryRunner();
        String sql = "insert into my_test (id,name) values(?,?)";
        Object[][] params = new Object[3][2];
        params[0][0] = 5;
        params[0][1] = "赵5";
        params[1][0] = 6;
        params[1][1] = "赵6";
        params[2][0] = 7;
        params[2][1] = "赵7";
        MapListHandler rsh = new MapListHandler();
        List<Map<String, Object>> maps = runner.insertBatch(conn, sql, rsh, params);
        conn.close();
        System.out.println(maps);
    }
  • 查询自定义
    @Test
    public void test6() throws Exception {
        Connection conn = JDBCUtil.getConnection();
        QueryRunner runner = new QueryRunner();
        String sql = "select count(*) from my_test where id = ?";
        ResultSetHandler<MyTest> rsh = new ResultSetHandler(){
            @Override
            public MyTest handle(ResultSet rs) throws SQLException {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                return new MyTest(id,name);
            }
        };
        MyTest test = runner.query(conn, sql, rsh, 1);
        conn.close();
        System.out.println(test);
    }
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-12 13:14:07  更:2021-09-12 13:15:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:47:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码