JDBC数据库基本知识点(二)
导读{
【1】JDBC 批处理SQL
【2】处理结果集(针对的就是执行select 语句拿到的ResultSet 对象)【3】 分页显示功能
【2】处理结果集(针对的就是执行select 语句拿到的ResultSet 对象)【3】 分页显示功能
}
【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();
}
}
}
数据库
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; // 用户的密码
getXXXsetxxx
}
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);
}
}