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.xml和c3p0.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()); // 打印类型
Java开发系列-JDBC的更多相关文章
- 完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络]
完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络] 地址:http://blog.csdn.net/qq_35101189/article/details/53729720?ref=m ...
- 【java开发系列】—— JDK安装
前言 作为一个java开发者,安装JDK是不可避免的,但是配置路径却总是记不住,百度也有很多参考例子.这里仅仅当做以后参考的笔记记录. 说到JDK,就不得不提JRE.他们到底是什么呢? 通常我们进行j ...
- Java开发系列-文件上传
概述 Java开发中文件上传的方式有很多,常见的有servlet3.0.common-fileUpload.框架.不管哪种方式,对于文件上传的本质是不变的. 文件上传的准备 文件上传需要客户端跟服务都 ...
- java开发中JDBC连接数据库代码和步骤
JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...
- 【转】Java开发中JDBC连接数据库代码和步骤总结
(转自:http://www.cnblogs.com/hongten/archive/2011/03/29/1998311.html) JDBC连接数据库 创建一个以JDBC连接数据库的程序,包含7个 ...
- 完整java开发中JDBC连接数据库代码和步骤
JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...
- 【java开发系列】—— struts2简单入门示例
前言 最近正好有时间总结一下,过去的知识历程,虽说东西都是入门级的,高手肯定是不屑一顾了,但是对于初次涉猎的小白们,还是可以提供点参考的. struts2其实就是为我们封装了servlet,简化了js ...
- 完整java开发中JDBC连接数据库代码和步骤 JDBC连接数据库
JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...
- (转)完整java开发中JDBC连接数据库代码和步骤
JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...
随机推荐
- android高级篇收录
Android运行时性能优化 1.android启动优化 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」 支付宝 App 构建优化解析:通过安装包重排布优化 Android 端 ...
- zookeeper基本概述
zookeeper是一个分布式的协调服务框架 其本质是一个分布式的小文件存储系统,可以存储一些小的文件,官方建议每个小文件不要超过一兆 zk一般都是装奇数台,便于zk内部的一些投票选举 leader: ...
- csp-s模拟测试95
csp-s模拟测试95 去世场祭. $T1$:这不裸的除法分块吗. $T2$:这不裸的数据结构优化$Dp$吗. $T3$:这不裸的我什么都不会搜索骗$30$分吗. 几分钟后. 这除法分块太劲了..(你 ...
- iOS7 AVAudioRecorder不能录音
今天写录音代码的时候,在iOS7以下就可以录音,但是iOS7上不可以,后来才知道iOS7录音方式变了,加上下面的代码就可以了,bingo AVAudioSession *audioSession = ...
- java排序算法之冒泡排序和快速排序
总结一下Java排序算法,以便记忆. 各类排序的时间复杂度: 排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 复杂性 直接插入排序 O(n2)O(n2) O( ...
- PAT_A1064#Complete Binary Search Tree
Source: PAT A1064 Complete Binary Search Tree (30 分) Description: A Binary Search Tree (BST) is recu ...
- 『BASH』——Hadex's brief analysis of "Lookahead and Lookbehind Zero-Length Assertions"
/*为节省时间,本文以汉文撰写*/ -前言- 深入学习正则表达式,可以很好的提高思维逻辑的缜密性:又因正则应用于几乎所有高级编程语言,其重要性不言而喻,是江湖人士必备的内功心法. 正则表达式概要(ob ...
- 剑指offer——29顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...
- 22-Ubuntu-文件和目录命令-移动文件和目录-mv
mv 可以用来移动文件或目录,也可以给文件或目录重命名. 选项 含义 -i 覆盖文件前提示 1.移动文件和目录 1-1移动文件 例: 将当前目录下的123.txt文件移动到~/桌面/b/e目录下 mv ...
- 【POJ】2253 Frogger
= =.请用C++提交.. 如果有朋友能告诉我G++和C++交题什么机制..我感激不尽.G++杀我. 题目链接:http://poj.org/problem?id=2253 题意:青蛙A要去找B约会, ...