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

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

【1】JDBC 批处理SQL  

可以使用 Statement  或者 PreparedStatement 对象来实现。
注意:能够批量处理执行的SQL 必须是 INSTER UPDATE DELETE  等返回 int 类型的SQL。
不能批量执行 SELECT 语句,会进行报错。另外批处理需要数据库的支持,可能有些数据库不支持。
例子一:使用Statement 批处理
   
   
  1. package cn.edu.aynu.sushe.utils;
  2. import java.sql.Connection;
  3. import java.sql.SQLException;
  4. import java.sql.Statement;
  5. public class PichuliStatement {
  6. private static Connection conntection;
  7. private static Statement statement;
  8. public static void main(String[] args) {
  9. try {
  10. conntection = JDBCUtils.getConntection();
  11. statement = conntection.createStatement();
  12. for (int i = 0; i < 10; i++) {
  13. String sql = "insert into user(name,password) values('a" + i
  14. + "','aaa" + i + "')";
  15. statement.addBatch(sql); // batch 批量
  16. }
  17. // 批量执行将每句sql 执行的结果返回为 int【】 数组
  18. int[] executeBatch = statement.executeBatch();
  19. for (int i = 0; i < executeBatch.length; i++) {
  20. System.out.println(executeBatch[i] + "");
  21. }
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. } finally {
  25. // 关闭流
  26. if (conntection != null) {
  27. try {
  28. conntection.close();
  29. } catch (SQLException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. }
  33. }
  34. // 关闭流
  35. if (statement != null) {
  36. try {
  37. statement.close();
  38. } catch (SQLException e) {
  39. // TODO Auto-generated catch block
  40. e.printStackTrace();
  41. }
  42. }
  43. }
  44. }
  45. }
结果:
  
命令行:

注意: 这个返回的int[]  当数组中的数据出现 大于 0 就代表这条sql 语句被执行成功了。如果小于0 就意味着sql 语句没有执行成功。
例子二:使用PreparedStatement 批处理   
    
    
  1. package cn.edu.aynu.sushe.utils;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.SQLException;
  5. public class pichuliPreparedStatement {
  6. public static void main(String[] args) {
  7. try {
  8. Connection conntection = JDBCUtils.getConntection();
  9. String sql = "insert into user(name,password) values(?,?)";
  10. PreparedStatement prepareStatement = conntection.prepareStatement(sql);
  11. for (int i = 0; i < 10; i++) {
  12. int index = 1 ;
  13. prepareStatement.setString(1, "aa"+i);
  14. prepareStatement.setString(2, "aa"+i);
  15. prepareStatement.addBatch();
  16. }
  17. int[] executeBatch = prepareStatement.executeBatch();
  18. for (int i = 0; i < executeBatch.length; i++) {
  19. System.out.println(i+"haha");
  20. }
  21. } catch (Exception e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }
结果:

命令行:

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

     
     
  1. package cn.edu.aynu.sushe.utils;
  2. import java.sql.Connection;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. public class ResultSetDemo01 {
  7. /**
  8. * @param args
  9. */
  10. public static void main(String[] args) {
  11. Connection conntection;
  12. try {
  13. conntection = JDBCUtils.getConntection();
  14. Statement createStatement = conntection.createStatement(
  15. ResultSet.TYPE_SCROLL_INSENSITIVE,
  16. ResultSet.CONCUR_UPDATABLE);
  17. ResultSet rs = createStatement.executeQuery("select * from user");
  18. // 光标指向第2行
  19. rs.absolute(2);
  20. System.out.println(rs.getInt("id"));
  21. // 光标向上移动1行
  22. rs.previous();
  23. System.out.println(rs.getInt("id"));
  24. // 光标相对向下移动2行
  25. rs.relative(2);
  26. System.out.println(rs.getInt("id"));
  27. // 光标相对向上移动2行
  28. rs.relative(-2);
  29. System.out.println(rs.getInt("id"));
  30. // 向下移动一行
  31. rs.next();
  32. System.out.println(rs.getInt("id"));
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. }

数据库

【3】分页显示功能

可以看这个

JDBC 高级应用

【1】DAO 模式  和 JavaBean

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

【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】第一种方式:类创建
   
   
  1. package cn.edu.aynu.DBCP;
  2. import java.sql.Connection;
  3. import java.sql.SQLException;
  4. import javax.sql.DataSource;
  5. import org.apache.commons.dbcp.BasicDataSource;
  6. public class leichuangjian {
  7. //
  8. public static DataSource ds = null ;
  9. static {
  10. // 获取DBCP的数据源对象
  11. BasicDataSource basicDataSource = new BasicDataSource();
  12. /*
  13. * 【1】设置数据库的配置信息
  14. */
  15. // 设置连接数据库的驱动名称
  16. basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
  17. // 设置连接数据库的路径
  18. basicDataSource.setUrl("jdbc:mysql://localhost:3306/test");
  19. // 设置数据库的登陆账号
  20. basicDataSource.setUsername("root");
  21. // 设置数据库的登录密码
  22. basicDataSource.setPassword("111");
  23. /*
  24. * 【2】设置数据库连接池的信息
  25. *
  26. */
  27. //设置数据库连接池初始化的连接数目
  28. basicDataSource.setInitialSize(10);
  29. //设置数据库连接池最大活跃的连接数目
  30. basicDataSource.setMaxActive(5);
  31. //设置数据库连接池最小闲置的连接数目
  32. basicDataSource.setMinIdle(2);
  33. ds = basicDataSource;
  34. }
  35. /**
  36. * @param args
  37. * @throws SQLException
  38. */
  39. public static void main(String[] args) throws SQLException {
  40. // 导入jar包
  41. // 从数据库获取一个连接
  42. Connection connection = ds.getConnection();
  43. System.out.println(connection);
  44. }
  45. }
【2】第二种:使用配置文件进行创建
 注意:这个配置文件 后缀必须是 : xxx.properties 否者创建的就是错误的
 

 代码:
   
   
  1. package cn.edu.aynu.DBCP;
  2. import java.io.InputStream;
  3. import java.sql.Connection;
  4. import java.util.Properties;
  5. import javax.sql.DataSource;
  6. import org.apache.commons.dbcp.BasicDataSourceFactory;
  7. public class peizhichuangjian {
  8. /**
  9. * @param args
  10. * @throws Exception
  11. */
  12. @SuppressWarnings("static-access")
  13. public static void main(String[] args) throws Exception {
  14. // 通过配置文件来返回数据库的连接
  15. Properties properties = new Properties();
  16. // 通过类加载器拿到配置信息
  17. InputStream inputStream = new peizhichuangjian()//
  18. .getClass()//
  19. .getClassLoader()//
  20. .getSystemResourceAsStream("ds.properties");
  21. // 加载拿到的流
  22. properties.load(inputStream);
  23. // 通过工厂类创建DataSourse
  24. DataSource createDataSource = BasicDataSourceFactory
  25. .createDataSource(properties);
  26. Connection connection = createDataSource.getConnection();
  27. System.out.println(connection);
  28. }
  29. }

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

【1】当使用C3P0数据源时,首先得创建数据源对象,数据源对象的创建方式有两种。

第一种:通过 ComboPooledDataSource 类直接创建数据源对象 ,手动给数据源对象设置属性值,然后获取数据库连接对象。

第二种:通过读取配置文件创建数据源对象, 使用 ComboPooledDataSource 读取配置文件,创建数据源对象,然后获取数据库连接对象。(推荐使用)(其中读取配置文件,有两种方式:一种是默认的,一种是自定义的详情看下面)
C3P0 的方式拿到数据库连接
【1】类创建
   
   
  1. package cn.edu.aynu.C3P0;
  2. import java.beans.PropertyVetoException;
  3. import java.sql.Connection;
  4. import java.sql.SQLException;
  5. import javax.sql.DataSource;
  6. import com.mchange.v2.c3p0.ComboPooledDataSource;
  7. public class leichuangjian {
  8. public static DataSource ds = null;
  9. static {
  10. ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
  11. // 【1】配置数据源的信息
  12. try {
  13. comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");
  14. comboPooledDataSource
  15. .setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test");
  16. comboPooledDataSource.setUser("root");
  17. comboPooledDataSource.setPassword("111");
  18. // 设置连接池信息
  19. comboPooledDataSource.setInitialPoolSize(10);
  20. comboPooledDataSource.setMaxPoolSize(100);
  21. ds = comboPooledDataSource;
  22. } catch (PropertyVetoException e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. }
  26. }
  27. /**
  28. * @param args
  29. * @throws SQLException
  30. */
  31. public static void main(String[] args) throws SQLException {
  32. Connection connection = ds.getConnection();
  33. System.out.println(connection);
  34. }
  35. }
使用配置文件进行创建
  以xml 的方式进行的存储 这个文件存放在 src 目录下

 其中的配置代码:
   
   
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <c3p0-config>
  3. <!-- 默认配置,当使用ComboPooledDataSource无参构造器时,使用的就是这个配置 -->
  4. <default-config>
  5. <!-- 基本配置 -->
  6. <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test</property>
  7. <property name="driverClass">com.mysql.jdbc.Driver</property>
  8. <property name="user">root</property>
  9. <property name="password">111</property>
  10. <!-- 每次增量,当需要创建Connection对象时,一次创建几个 -->
  11. <property name="acquireIncrement">3</property>
  12. <!-- 当创建池对象后,池中应该有几个Connection对象 -->
  13. <property name="initialPoolSize">10</property>
  14. <!-- 池中最少Connection个数,如果少于这个值,就会创建Connection -->
  15. <property name="minPoolSize">2</property>
  16. <!-- 池中最大连接个数 -->
  17. <property name="maxPoolSize">10</property>
  18. </default-config>
  19. <!-- 命名配置,new ComboPooledDataSource("oralce-config")时,使用的就是这个配置 -->
  20. <named-config name="mysql-config">
  21. <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
  22. <property name="driverClass">com.mysql.jdbc.Driver</property>
  23. <property name="user">root</property>
  24. <property name="password">111</property>
  25. <property name="acquireIncrement">3</property>
  26. <property name="initialPoolSize">10</property>
  27. <property name="minPoolSize">2</property>
  28. <property name="maxPoolSize">10</property>
  29. </named-config>
  30. </c3p0-config>
获取数据源
   
   
  1. package cn.edu.aynu.C3P0;
  2. import java.sql.Connection;
  3. import java.sql.SQLException;
  4. import javax.sql.DataSource;
  5. import com.mchange.v2.c3p0.ComboPooledDataSource;
  6. public class morenpeizhi {
  7. public static DataSource ds = null;
  8. static{
  9. // 使用默认的配置
  10. ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
  11. ds =comboPooledDataSource;
  12.    
       // 使用 mysql-config 命名的文件创建
  1.  ComboPooledDataSource comboPooledDataSource  = new ComboPooledDataSource("mysql-config");
            ds =comboPooledDataSource ;
  2. }
  3. /**
  4. * @param args
  5. * @throws SQLException
  6. */
  7. public static void main(String[] args) throws SQLException {
  8. Connection connection = ds.getConnection(); // 拿到连接
  9. System.out.println(connection);
  10. }
  11. }





 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值