jdbc学习笔记-Dehy
因为参与学校实验室软件开发,技术需要,初次涉猎jdbc,写了这篇总结
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
java操作数据库.jdbc是oracle公司指定的一套规范(一套接口)
驱动:jdbc的实现类.由数据库厂商提供.
首先粘一段自己写的代码
@Test
public void f2() throws Exception {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo?useSSL=false&serverTimezone=GMT%2B8","root","123456");
//编写SQL
String sql="select * from category";
//创建语句执行者
PreparedStatement st = conn.prepareStatement(sql);
//设置参数
//执行SQL
ResultSet rs = st.executeQuery();
//处理结果
while(rs.next()) {
System.out.println(rs.getString("cid")+"::"+rs.getString("cname"));
}
//释放资源
rs.close();
st.close();
conn.close();
}
主要还是调用jdbc的相关类来完成用Java语言代码的操作,首先要导入要用的jar包,就是所谓的驱动。
导包
将下载的驱动jar包放到新建的lib文件夹下面,然后点击右键,选中build path
将会产生一个新的文件夹,如图
基本jdbc代码流程
可以分为8个步骤:
1、注册驱动
有两种写法:Class.forName(“com.mysql.cj.jdbc.Driver”) 和Class.forName(“com.mysql.jdbc.Driver”); 第一种是mysql8.0以上的版本,后一种是mysql8.0之前的写法, 因为我装的是mysql8.0.14版本,所以用前一个
此外呢,还可以用专门的注册方法去写,但个人认为这个更简单高效,不多说!
2、获取连接
3、编写SQL 这里分为多种SQL语句,后面根据SQL语句的执行功能的区别来使用不同的执行方法
如果有参数的语法格式:将SQL语句的参数位置写成小问号就行了,形如:
//编写SQL
String sqlA="insert into category values(?,?)";
String sqlB="update category set cname= ? where cid = ?";
如果没有参数那就和平时一样罗
4、创建语句执行者
5、设置参数
(这里没有参数):
设置参数:
setXxx(int 第几个问号,Object 实际参数);
常见的方法: setInt,setString,setObject
6、执行SQL
ResultSet executeQuery() :执行 r 语句 返回值:结果集
int executeUpdate() :执行cud 语句 返回值:影响的行
7、处理结果
处理结果集 ResultSet
boolean next():这个函数的作用是将光标向前移动一行,第一次执行将光标移动到第一行,如果当前行有效,则返回true,否则返回false;
获取具体内容
getXxx( int | string)
若参数为int :第几列
若参数为string:列名(字段名)
例如:
获取cname的内容可以通过
getString(2)
getString(“cname”)
常用方法:
getInt
getString 也可以获取int值
getObject 可以获取任意内容
8、释放资源
这里别忘了要从低到高释放资源,没做也没关系,让系统自动回收垃圾
配置文件
在我们的项目中,方便对数据库连接的管理,我们应用了properies配置文件 ,说白了他的作用就是把我们的数据库连接的识别信息放到了一个固定的文件中,让程序自己去调用它们,这样好更加方便维护代码。
通常我们把这个配置文件放到Java项目中的src文件夹下面
常见的配置文件格式:
1.properties
内容的格式 key=value
读取配置: ResourceBundle快速获取配置信息
步骤:1.获取ResourceBundle对象
static ResourceBundle getBundle(“文件名称(不带后缀名)”);
2.获取配置信息
String getString(String key);通过key获取指定的value;
2.xml
这里暂且不提
连接池
连接池:就是在使用jdbc时优化操作的一种手段,方便我们管理数据库的连接。
作用:(1)提高项目的性能
(2)在连接池初始化时存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可。
使用方法:
所有连接池必须实现接口: javax.sql.DataSource接口
jdk会自带有连接池,这里方便学习,就自己写一个,感受一下
连接池定义
package com.javaweb.pool.text;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.ResourceBundle;
import javax.sql.DataSource;
public class mydataSource {
//开一个连接池集合
static LinkedList<Connection> pool=new LinkedList<Connection>();
static String driverClass;
static String url;
static String username;
static String password;
static {
//获取对象
ResourceBundle bundle=ResourceBundle.getBundle("jdbc");
//获取值
driverClass=bundle.getString("driverClass");
url=bundle.getString("url");
username=bundle.getString("username");
password=bundle.getString("password");
//注册驱动
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
//初始化时需要放入3个连接
for(int i=1;i<=3;i++) {
try {
Connection conn=DriverManager.getConnection(url,username,password);
pool.addLast(conn);
}
catch(SQLException e) {
e.printStackTrace();
}
}
}
//从连接池中获取连接
public static Connection getConnection(){
//获取连接时判断pool是否为空,为空再加入2个连接
if(pool.isEmpty()) {
for(int i=1;i<=2;i++) {
try {
Connection conn=DriverManager.getConnection(url,username,password);
pool.addLast(conn);
}
catch(SQLException e) {
e.printStackTrace();
}
}
}
return pool.removeFirst();
}
//归还连接的方法
public static void back(Connection conn){
//将conn放到List最后面
pool.addLast(conn);
}
}
常用的连接池
- DBCP
使用步骤:
1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
2.使用api
a.硬编码
//创建连接池
BasicDataSource ds = new BasicDataSource();
//配置信息
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql:///jdbcdemo");
ds.setUsername("root");
ds.setPassword("123456");
b.配置文件
实现编写一个properties文件
这是一篇<<范例写法>>
//存放配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/jdbc.properties"));
//设置
//prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");
//创建连接池
DataSource ds = new BasicDataSourceFactory().createDataSource(prop);
- C3P0(推荐)
hibernate和spring可以使用
和DBCP的区别:C3P0有自动回收空闲连接的功能.,而DBCP是没有的
使用步骤:
1.导入jar包(例:c3p0-0.9.1.2.jar)
2.使用api
a.硬编码(不推荐)
new ComboPooledDataSource()
b.配置文件
配置文件名称:c3p0.properties 或者 c3p0-config.xml,一定注意这个名称不可以写错,因为这是项目中默认要使用的配置文件
编码只需要一句话
new ComboPooledDataSource()//使用默认的配置
new ComboPooledDataSource(String configName)//使用命名的配置 若配置的名字找不到,使用默认的配置
借鉴大神整理的文件配置:c3p0-config.xml的配置
DButils工具包
dbutils: 是apache组织的一个工具类,jdbc的框架,更方便我们使用
相关jar包:commons-dbutlis-1.7.jar,网上很容易找到
DButils的核心类或接口
-
QueryRunner:
作用:操作sql语句
构造器:
new QueryRunner(Datasource ds);
这个类很实用,可以帮我们创建连接,创建语句执行者 ,释放资源.
常用方法:
query(…):
update(…): -
DbUtils:
作用:释放资源,控制事务
closeQuietly(conn):内部处理了异常
commitAndClose(Connection conn):提交事务并释放连接
… -
ResultSetHandler:
作用:封装结果集,这是一个接口
ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler
详细介绍
(了解)ArrayHandler, 将查询结果的第一条记录封装成数组,返回
(了解)ArrayListHandler, 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回
★★BeanHandler, 将查询结果的第一条记录封装成指定的bean对象,返回
★★BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.
(了解)ColumnListHandler, 将查询结果的指定一列放入list中返回
(了解)MapHandler, 将查询结果的第一条记录封装成map,字段名作为key,值为value 返回
★MapListHandler, 将查询结果的每一条记录封装map集合,将每一个map集合放入list中返回
★ScalarHandler,针对于聚合函数 例如:count(*) 返回的是一个Long值
光列出来没用,给个案例:
@Test
public void QueryAll() throws SQLException {
QueryRunner qr=new QueryRunner(Jdbcutils.getDataSourec());
//编写SQL
String sql="select * from category";
//执行,将所有数据项封装成集合
List<Object[]> rs=qr.query(sql, new ArrayListHandler());//重点是这里如何使用这个操作类,核心内容
//打印结果集
for(Object[] objects:rs) {
System.out.println(Arrays.toString(objects));
}
}