(javaweb(Dao 模式 和 javabean)和 数据库连接池)JDBC数据库基本知识点(二)

    xiaoxiao2021-12-14  19

    JDBC数据库基本知识点(二) 导读{ 【1】JDBC 批处理SQL   【2】处理结果集(针对的就是执行select 语句拿到的ResultSet 对象)【3】 分页显示功能

    JDBC 高级应用

    【1】DAO 模式  和 JavaBean

    【2】JDBC 数据库连接池

    【2.1】为什么需要使用数据库连接池?

    【2.3】怎么使用数据库连接池?

    【1】获取数据库连接(Connection)

    【2】获取数据库连接池对象(DataSource)

    【3】使用DBCP 数据源 获取数据库的连接

    关于使用DBCP   获取数据库连接

    【1】第一种方式:类创建
    【2】第二种:使用配置文件进行创建

     【4】使用C3P0 数据源 获取数据库的连接

    C3P0 的方式拿到数据库连接

    }

    【1】JDBC 批处理SQL  

    可以使用 Statement  或者 PreparedStatement 对象来实现。 注意:能够批量处理执行的SQL 必须是 INSTER UPDATE DELETE  等返回 int 类型的SQL。 不能批量执行 SELECT 语句,会进行报错。另外批处理需要数据库的支持,可能有些数据库不支持。 例子一:使用Statement 批处理 package cn.edu.aynu.sushe.utils;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;public class PichuliStatement { private static Connection conntection; private static Statement statement; public static void main(String[] args) { try { conntection = JDBCUtils.getConntection(); statement = conntection.createStatement(); for (int i = 0; i < 10; i++) { String sql = "insert into user(name,password) values('a" + i + "','aaa" + i + "')"; statement.addBatch(sql); // batch 批量 }// 批量执行将每句sql 执行的结果返回为 int【】 数组 int[] executeBatch = statement.executeBatch(); for (int i = 0; i < executeBatch.length; i++) { System.out.println(executeBatch[i] + ""); } } catch (Exception e) { e.printStackTrace(); } finally { // 关闭流 if (conntection != null) { try { conntection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 关闭流 if (statement != null) { try { statement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }} 结果:    命令行: 注意: 这个返回的int[]  当数组中的数据出现 大于 0 就代表这条sql 语句被执行成功了。如果小于0 就意味着sql 语句没有执行成功。 例子二:使用PreparedStatement 批处理    package cn.edu.aynu.sushe.utils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;public class pichuliPreparedStatement { public static void main(String[] args) { try { Connection conntection = JDBCUtils.getConntection(); String sql = "insert into user(name,password) values(?,?)"; PreparedStatement prepareStatement = conntection.prepareStatement(sql); for (int i = 0; i < 10; i++) { int index = 1 ; prepareStatement.setString(1, "aa"+i); prepareStatement.setString(2, "aa"+i); prepareStatement.addBatch(); } int[] executeBatch = prepareStatement.executeBatch(); for (int i = 0; i < executeBatch.length; i++) { System.out.println(i+"haha"); } } catch (Exception e) { e.printStackTrace(); } }} 结果: 命令行:

    【2】处理结果集(针对的就是执行select 语句拿到的ResultSet 对象)

    package cn.edu.aynu.sushe.utils;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class ResultSetDemo01 { /** * @param args */ public static void main(String[] args) { Connection conntection; try { conntection = JDBCUtils.getConntection(); Statement createStatement = conntection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = createStatement.executeQuery("select * from user"); // 光标指向第2行 rs.absolute(2); System.out.println(rs.getInt("id")); // 光标向上移动1行 rs.previous(); System.out.println(rs.getInt("id")); // 光标相对向下移动2行 rs.relative(2); System.out.println(rs.getInt("id")); // 光标相对向上移动2行 rs.relative(-2); System.out.println(rs.getInt("id")); // 向下移动一行 rs.next(); System.out.println(rs.getInt("id")); } catch (Exception e) { e.printStackTrace(); } }} 数据库

    【3】分页显示功能

    可以看这个   http://blog.csdn.net/qq_28817739/article/details/53232548

    JDBC 高级应用

    【1】DAO 模式  和 JavaBean

       Access英文意思:(使用 存取 ) DAO (数据库操作对象 DataBase Access  Object)是JDBC 下常用的模式。 保存数据时,将java  bean 的属性拆分成sql语句,并保存到数据库中。 读取数据时,将数据从数据库读出来,通过setXXX方法设置到javabean 中。 看来代码怎么组成: javabean  对象: (省略  get  set 方法) package cn.edu.aynu.shuse.bean;public class Users { private int id; // 用户的id,自动增长,作为 linkman 的外键 private String username; // 用户的姓名 private String password; // 用户的密码            getXXX            setxxx } Dao 类 package cn.edu.aynu.shuse.dao;import java.sql.SQLException;import java.util.List;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanHandler;import org.apache.commons.dbutils.handlers.BeanListHandler;import cn.edu.aynu.shuse.bean.Users;import cn.edu.aynu.shuse.utils.JDBCUtils;/** * 对user表的数据操作,两方面{ (1)根据账户名,去查找密码 (2)注册添加用户的信息 } * * @author Administrator * */public class UsersDao { /** * QueryRunner类简化了执行SQL语句的代码,它与ResultSetHandler组合在一起就能完成大部分的数据库操作,大大减少编码量。 * 针对不同的数据库操作,QueryRunner类提供的不同的方法。 */ QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); /** * (1)根据账户名,去查找密码 * * @throws SQLException */ public Users select(String name) throws SQLException { String sql = "select * from user where username=?"; Users list = qr.query(sql, new BeanHandler<Users>(Users.class), name); return list; } /** * (2)注册添加用户的信息 * * @throws SQLException */ public void add(String name, String password) throws SQLException { String sql = "insert into user(username,password) values(?,?) "; qr.update(sql, name, password); }}

    【2】JDBC 数据库连接池

    【2.1】为什么需要使用数据库连接池?

              在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源频繁地创建、断开数据库连接势必会影响数据库的访问效率,甚至导致数据库崩溃。 为了避免频繁的创建数据库连接,工程师们提出了数据库连接池技术。 【2.2】什么是数据库连接池?         数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用现有的数据库连接,而不是重新建立。下面通过一张图来简单描述应用程序如何通过连接池连接数据库。

    【2.3】怎么使用数据库连接池?

    【1】获取数据库连接(Connection)

    既然要连接数据库就应该获取数据库连接对象(Connection),那么我们通过使用JDBC提供了javax.sql.DataSource接口(它负责与数据库建立连接,并定义了返回值为Connection对象的方法) Connection getConnection()  Connection getConnection(String username,String password) 来拿到我们的数据库连接对象

    【2】获取数据库连接池对象(DataSource)

    我们习惯性的把实现了javax.sql.DataSource接口的类称为数据源,顾名思义,数据源即数据的来源。在数据源中存储了所有建立数据库连接的信息

    常用的数据源分为两种 :  DBCP  C3P0 下面针对两个比较常用的数据源介绍一下: DBCP是数据库连接池(DataBase Connection Pool)的简称,是Apache组织下的开源连接池实现,也是Tomcat服务器使用的连接池组件。 单独使用DBCP数据源时,需要在应用程序中导入两个jar包。commons-pool.jar包  commons-dbcp.jar包 (commons-dbcp.jar包中包含两个核心类,分别是BasicDataSourceFactory和BasicDataSource,它们都包含获取DBCP数据源对象的方法。) C3P0是目前最流行的开源数据库连接池之一,它实现了DataSource数据源接口,支持JDBC2和JDBC3的标准规范,易于扩展并且性能优越,著名的开源框架Hibernate和 Spring使用的都是该数据源。   我们在使用C3P0数据源开发时,需要了解C3P0中DataSource接口的实现类ComboPooledDataSource,它是C3P0的核心类,提供了数据源对象的相关方法。

    【3】使用DBCP 数据源 获取数据库的连接

    【1】当使用DBCP数据源时,首先得创建数据源对象,数据源对象的创建方式有两种。 第一种:通过BasicDataSource类直接创建数据源对象 ,手动给数据源对象设置属性值,然后获取数据库连接对象。 第二种:通过读取配置文件创建数据源对象, 使用BasicDataSourceFactory工厂类读取配置文件,创建数据源对象,然后获取数据库连接对象。(推荐使用)

    关于使用DBCP   获取数据库连接

    【1】第一种方式:类创建
    package cn.edu.aynu.DBCP;import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSource;public class leichuangjian { // public static DataSource ds = null ; static { // 获取DBCP的数据源对象 BasicDataSource basicDataSource = new BasicDataSource(); /* * 【1】设置数据库的配置信息 */ // 设置连接数据库的驱动名称 basicDataSource.setDriverClassName("com.mysql.jdbc.Driver"); // 设置连接数据库的路径 basicDataSource.setUrl("jdbc:mysql://localhost:3306/test"); // 设置数据库的登陆账号 basicDataSource.setUsername("root"); // 设置数据库的登录密码 basicDataSource.setPassword("111"); /* * 【2】设置数据库连接池的信息 * */ //设置数据库连接池初始化的连接数目 basicDataSource.setInitialSize(10); //设置数据库连接池最大活跃的连接数目 basicDataSource.setMaxActive(5); //设置数据库连接池最小闲置的连接数目 basicDataSource.setMinIdle(2); ds = basicDataSource; } /** * @param args * @throws SQLException */ public static void main(String[] args) throws SQLException { // 导入jar包 // 从数据库获取一个连接 Connection connection = ds.getConnection(); System.out.println(connection); }}
    【2】第二种:使用配置文件进行创建
     注意:这个配置文件 后缀必须是 : xxx.properties 否者创建的就是错误的    代码: package cn.edu.aynu.DBCP;import java.io.InputStream;import java.sql.Connection;import java.util.Properties;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;public class peizhichuangjian { /** * @param args * @throws Exception */ @SuppressWarnings("static-access") public static void main(String[] args) throws Exception { // 通过配置文件来返回数据库的连接 Properties properties = new Properties(); // 通过类加载器拿到配置信息 InputStream inputStream = new peizhichuangjian()// .getClass()// .getClassLoader()// .getSystemResourceAsStream("ds.properties"); // 加载拿到的流 properties.load(inputStream); // 通过工厂类创建DataSourse DataSource createDataSource = BasicDataSourceFactory .createDataSource(properties); Connection connection = createDataSource.getConnection(); System.out.println(connection); }}

     【4】使用C3P0 数据源 获取数据库的连接

    【1】当使用C3P0数据源时,首先得创建数据源对象,数据源对象的创建方式有两种。 第一种:通过 ComboPooledDataSource 类直接创建数据源对象 ,手动给数据源对象设置属性值,然后获取数据库连接对象。 第二种:通过读取配置文件创建数据源对象, 使用 ComboPooledDataSource 读取配置文件,创建数据源对象,然后获取数据库连接对象。(推荐使用)(其中读取配置文件,有两种方式:一种是默认的,一种是自定义的详情看下面)

    C3P0 的方式拿到数据库连接

    【1】类创建 package cn.edu.aynu.C3P0;import java.beans.PropertyVetoException;import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class leichuangjian { public static DataSource ds = null; static { ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); // 【1】配置数据源的信息 try { comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver"); comboPooledDataSource .setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test"); comboPooledDataSource.setUser("root"); comboPooledDataSource.setPassword("111"); // 设置连接池信息 comboPooledDataSource.setInitialPoolSize(10); comboPooledDataSource.setMaxPoolSize(100); ds = comboPooledDataSource; } catch (PropertyVetoException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * @param args * @throws SQLException */ public static void main(String[] args) throws SQLException { Connection connection = ds.getConnection(); System.out.println(connection); }} 使用配置文件进行创建   以xml 的方式进行的存储 这个文件存放在 src 目录下  其中的配置代码: <?xml version="1.0" encoding="UTF-8"?><c3p0-config> <!-- 默认配置,当使用ComboPooledDataSource无参构造器时,使用的就是这个配置 --> <default-config> <!-- 基本配置 --> <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="user">root</property> <property name="password">111</property> <!-- 每次增量,当需要创建Connection对象时,一次创建几个 --> <property name="acquireIncrement">3</property> <!-- 当创建池对象后,池中应该有几个Connection对象 --> <property name="initialPoolSize">10</property> <!-- 池中最少Connection个数,如果少于这个值,就会创建Connection --> <property name="minPoolSize">2</property> <!-- 池中最大连接个数 --> <property name="maxPoolSize">10</property> </default-config> <!-- 命名配置,new ComboPooledDataSource("oralce-config")时,使用的就是这个配置 --> <named-config name="mysql-config"> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="user">root</property> <property name="password">111</property> <property name="acquireIncrement">3</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">2</property> <property name="maxPoolSize">10</property> </named-config></c3p0-config> 获取数据源 package cn.edu.aynu.C3P0;import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class morenpeizhi { public static DataSource ds = null; static{ // 使用默认的配置 ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); ds =comboPooledDataSource;            // 使用 mysql-config 命名的文件创建  ComboPooledDataSource comboPooledDataSource  = new ComboPooledDataSource("mysql-config");         ds =comboPooledDataSource ; } /** * @param args * @throws SQLException */ public static void main(String[] args) throws SQLException { Connection connection = ds.getConnection(); // 拿到连接 System.out.println(connection); }}

     
    转载请注明原文地址: https://ju.6miu.com/read-970650.html

    最新回复(0)