zoukankan      html  css  js  c++  java
  • Java开发系列-JDBC

    概述

    JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序

    JDBC连接数据库

    导入MySQL数据库驱动jar包

    代码编写

    public void JDBCExample() throws ClassNotFoundException, SQLException{
        // 1.注册驱动
        Class.forName(driverClass);
    
        // 2.获取连接
        String url = "jdbc:mysql://localhost:3306/数据库名称";
        Connection connection = DriverManager.getConnection(url, user, password);
    
        // 3. 编写SQL语句
        String sql = "insert into category values(null, ?)";
    
        // 4.创建预编译
        PreparedStatement st = (PreparedStatement) connection.prepareStatement(sql);
    
        // 5. 设置参数 参数 第几个? 对应的value index是从1开始
        st.setString(1, "户外");
    
        // 6. 执行sql
       int row = st.executeUpdate();
        
       /* 
       ResultSet res = st.executeQuery();
      // 7. 处理结果
       while (res.next()) {
           System.out.println(res.getString("cname"));
        } 
        */
    
        // 8. 释放资源 (先打开后关闭)
        res.close(); 
        st.close();
        connection.close();
    }
    

    使用连接池改造JDBC的程序

    Connection对象在JDBC使用的时候.使用的时候就会去创建一个对象,使用结束以后就会将这个对象给销毁了.每次创建和销毁对象都是耗时操作.需要使用连接池对其进行优化.程序初始化的时候,初始化多个连接,将多个连接放入到池中(内存中).每次获取的时候,都可以直接从连接池中进行获取.使用结束以后,将连接归还到池中.

    常见的连接池 DBCP 、C3P0。

    DBCP

    DBCP是Apache组织一个java连接池项目,也是tomcat使用的连接池组件。单独使用JDBC需要导入2个jar包。由于建立数据库连接是一个非常耗费资源的行为,所以通过连接池预先与数据库建立一些连接放在内存中。应用程序需要建立数据库连接时直接到连接池中去申请连接,用完后再放入连接池。

    代码编写

    public void JDBCExample(){
    
        // 创建连接池
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl(""):
        dataSource.setUsername("");
        dataSource.setPassword("");
        
        try{
    	// 获得连接:
    	conn = dataSource.getConnection();
    	// 编写SQL语句.
    	String sql = "insert into category values (null,?)";
    	// 预编译SQL:
    	pstmt = conn.prepareStatement(sql);
    	// 设置参数:
    	pstmt.setString(1, "鞋靴箱包");
    	//执行SQL 
            pstmt.executeUpdate();
         }catch(Exception e)
            e.printStackTrace();
        }finally{
            JDBCUtils.release(pstmt, conn);
        }
    }
    

    C3P0

    c3p0是一个开源的JDBC连接池,它实现了数据源和JDDI绑定,支持JDBC3规范和JDBC3的标准扩展,目前使用它的开源项目有Hibernate,Spring等。

    使用步骤

    • 在src下编译c3p0配置文件

    c3p0配置文件有两种c3p0-config.xmlc3p0.properties。两种配置文件规则分别如下
    c3p0-config.xml

    <c3p0-config>
    	<!-- 默认配置,如果没有指定则使用这个配置 -->
    	<default-config>
    		<!-- 基本配置 -->
    		<property name="driverClass">com.mysql.jdbc.Driver</property>
    		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test3</property>
    		<property name="user">root</property>
    		<property name="password">123456</property>
    	
    		<!--扩展配置-->
    		<property name="checkoutTimeout">30000</property>
    		<property name="idleConnectionTestPeriod">30</property>
    		<property name="initialPoolSize">10</property>
    		<property name="maxIdleTime">30</property>
    		<property name="maxPoolSize">100</property>
    		<property name="minPoolSize">10</property>
    		<property name="maxStatements">200</property>
    	</default-config> 
    	
    	
    	<!-- 命名的配置 -->
    	<named-config name="coderhong">
    		<property name="driverClass">com.mysql.jdbc.Driver</property>
    		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test3</property>
    		<property name="user">root</property>
    		<property name="password">1234</property>
    		
    		
    		<!-- 如果池中数据连接不够时一次增长多少个 -->
    		<property name="acquireIncrement">5</property>
    		<property name="initialPoolSize">20</property>
    		<property name="minPoolSize">10</property>
    		<property name="maxPoolSize">40</property>
    		<property name="maxStatements">20</property>
    		<property name="maxStatementsPerConnection">5</property>
    	</named-config>
    </c3p0-config> 
    

    c3p0.properties

    c3p0.driverClass=com.mysql.jdbc.Driver
    c3p0.jdbcUrl=jdbc:mysql://localhost:3306/test3
    c3p0.user=root
    c3p0.password=123456
    
    • 导入jar包

    • 代码编写
    // 软编码 properties
    @Test
    public void test2() throws SQLException{
    	// 使用命名配置 如果默认配置找不到 使用默认的配置
    	// ComboPooledDataSource ds = new ComboPooledDataSource("codoerhong"); 
    	ComboPooledDataSource ds = new ComboPooledDataSource(); // 使用默认配置
    	Connection connection = ds.getConnection();
    		
    	String sql  = "select * from category";
    	PreparedStatement st = connection.prepareStatement(sql);
    		
    	ResultSet res = st.executeQuery();
    		
    	while(res.next()){
    		System.out.println(res.getString("cname"));
    	}
    		
    	st.close();
    	connection.close();
    }
    

    在开发中操作数据库比较频繁,单数创建ComboPooledDataSource 只需要一次就可以。因此封住可一个JDBCUtils工具类。

    public class JDBCUtils {
    	
    	private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
    	// 获取连接
    	public static DataSource getDataSource(){
    		return dataSource;
    	}
    	
    	// 获取连链接
    	public static Connection getConnection() throws SQLException{
    		return  dataSource.getConnection();
    	}
    	
    	// 释放资源
    	public static void closeResultSet(ResultSet rs){
    		if(rs != null){
    			try {
    				rs.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			rs = null;
    		}
    	}
    }
    

    DButiils

    DBUtils是apache组织的一个工具类,jdbc的框架, 是java编程中的数据库操作实用工具,小巧简单实用。DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码,Dbutils三个核心功能介绍

    • QueryRunner中提供对sql语句操作的API
    • ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
    • DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

    QueryRunner

    QueryRunner(DataSource ds) ,提供数据源(连接池),DBUtils底层自动维护连接connection
    update(String sql, Object... params) ,执行更新数据
    query(String sql, ResultSetHandler rsh, Object... params) ,执行查询

    ResultSetHandler

    ResultSetHandler结果集处理类 作用
    ArrayHandler 将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
    ArrayListHandler 将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
    BeanHandler 将结果集中第一条记录封装到一个指定的javaBean中。
    BeanListHandler 将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
    ColumnListHandler 将结果集中指定的列的字段值,封装到一个List集合中
    KeyedHandler 将结果集中每一条记录封装到Map<String,Object>,在将这个map集合做为另一个Map的value,另一个Map集合的key是指定的字段的值。
    MapHandler 将结果集中第一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值
    MapListHandler 将结果集中每一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中。
    ScalarHandler 它是用于单数据。例如select count(*) from 表操作。

    JDBC操作数据库

    导入jar包

    代码实例

    // 1 使用QueryRunner构造方法创建 底层自动创建sql语句的执行者, 
    QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource())
    String sql = "select *from category";
    		
    //		 ArrayHandler 将查询的第一条记录表封装成数组 返回
    //		 Object[] query = queryRunner.query(sql, new ArrayHandler());
    //		 System.out.println(Arrays.toString(query));
    		
    //		ArrayListHandler 将每一行数据封装成一个数组 将每一个数组放入list中 返回
    //		List<Object[]> query = queryRunner.query(sql, new ArrayListHandler());
    //		for (Object[] objects : query) {
    //			System.out.println("-------------");
    //			System.out.println(Arrays.toString(objects));
    //		}
    		
    //		BeanHandler
    //		Category query = queryRunner.query(sql, new BeanHandler<>(Category.class));
    //		System.out.println(query);
    
    //		BeanListHandler		
    //		List<Category> query = queryRunner.query(sql, new BeanListHandler<>(Category.class));
    //		for (Category category : query) {
    //			System.out.println(category);
    //		}
    		
    //		MapHandler将数据的第一数据 封装成map 字段名作为key 值为value
    //		Map<String, Object> query = queryRunner.query(sql, new MapHandler());
    //		System.out.println(query);
    		
    //		MapListHandler
    //		List<Map<String, Object>> query = queryRunner.query(sql, new MapListHandler());
    //		for (Map<String, Object> map : query) {
    //			System.out.println(map);
    //		}
    		
    //		ScalarHandler 为聚合函数准备 
    //		String sql = "select count(*) from category";
    //		Object query = queryRunner.query(sql, new ScalarHandler());
    //		System.out.println(query);
    //		System.out.println(query.getClass().getName()); // 打印类型
    
  • 相关阅读:
    Maven pom.xml中的元素modules、parent、properties以及import
    WebService与RMI(远程调用方式实现系统间通信)
    负载均衡+session共享(memcached-session-manager实现)
    LVS + keepalived + nginx + tomcat 实现主从热备 + 负载均衡
    将tomcat添加为linux系统服务
    virtualBox安装centos,并搭建tomcat
    主从热备+负载均衡(LVS + keepalived)
    利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)
    排序之归并排序
    排序之快速排序(下)
  • 原文地址:https://www.cnblogs.com/CoderHong/p/9465743.html
Copyright © 2011-2022 走看看