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