今天整理一下JDBC
1.数据的状态
(1)瞬时状态:存放在内存中的数据,程序运行时存在,停止丢失
(2)持久状态:存放在硬盘中的数据,程序运行与否都存在
2.持久化:数据在瞬时状态和持久状态转换的机制
(1)技术
① jdbc
② IO流
③ xml
(2)框架
① mybatis
② Hibernate
③ JPA:是一个标准
④ EJB
⑤ Jfinal
3.jdbc:java的数据库链接,用java语言编写的用于链接各种数据库的API(应用进程编程接口),使用持久化框架的基础
4.数据链接池:就是程序运行时创建n个链接,提供给用户使用,减少频繁创建链接的资源消耗,特别是在web项目中。类似于10086
5.jdbc的层次结构
a.JDBC API 对java程序提供类和接口方便统一操作数据库
b.JDBC Driver Interface:驱动接口 专门对接各种数据库,不需要关注
6.常用类和接口
(1)类
①SQLException:编译时异常
②DriverManager:驱动管理,负责根据用户提供的数据库地址,用户名和密码完成数据库的链接
(2)接口
①Connection:代表是根据数据库的链接(会话)
②Statement:执行SQL语句的对象,而是SQL语句传递给数据库并获取结果(运输队长)
③ResultSet:结果集,存放SQL语句查询的结果,可能没数据,但是一定有列信息
④PreparedStatement:执行预编译的SQL语句,SQL语句中带有“ ?”
⑤CallableStatement:用于执行存储过程和函数的SQL语句
7.操作数据库的步骤(三个准备和七个步骤)
(1)三个准备
①数据库
1)注意编码格式 utf8
2)创建表(是否需要修改引擎),采用合理的表结构存放数据
②添加数据库的驱动jar文件到项目中,自己创建一个lib目录进行存放
③把jar文件添加到类路径中
(2)七个步骤
①生命数据库链接需要的参数
String driver = “com.mysql.jdbc.Driver”;
String url = “jdbc:mysql://localhost:3306/DataBase_Name?userUnicode=true&characterEncoding=utf8”;
String user = “root”;
String password = “pwd”;
②加载驱动类:通过名称找对应的类,需要处理ClassNotFoundException
Class.forName(driver);//反射
③根据用户提供参数获取数据库的链接,需要处理SQLException异常
Connection conn = DriverManager.getConnection(url,user,password);
④编写SQL语句,根据功能编写SQL语句
CRUD
insert、delete、update都属于修改操作,返回影响的行数
select 查询操作返回查询的结果
⑤创建一个执行SQL语句的对象(把SQL语句发送给数据库DBMS并获取结果)
⑥执行SQL语句并处理结果
如果是insert、delete、update获取影响的行数
如果是select获取的是ResultSet
⑦释放资源
ReadUtil
package com.neu.util;
import java.util.ResourceBundle;
public final class ReadUtil {
//绑定名称为 db 的资源文件
//jdk提供的用于读取 资源文件的工具
//资源文件必须放在src的目录中
private static ResourceBundle rb=ResourceBundle.getBundle("db");
public static String getDriver(){
String str=rb.getString("driver");
return str;
}
public static String getUrl(){
String str=rb.getString("url");
return str;
}
public static String getUser(){
String str=rb.getString("user");
return str;
}
public static String getPassword(){
String str=rb.getString("password");
return str;
}
public static void main(String[] args) {
System.out.println(getUser());
}
}
DBUtil
package com.neu.util;
import java.sql.*;
//静态引入,可以引入类中 被static修饰的内容
import static com.neu.util.ReadUtil.*;
/**
* 只负责进行数据库的链接和关闭
*/
public final class DBUtil {
private static final String driver=getDriver();
private static final String url=getUrl();
private static final String user=getUser();
private static final String password=getPassword();
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
//把异常信息抛出
throw new RuntimeException(e);
}
}
private DBUtil(){
}
public static Connection getConnection() throws SQLException {
Connection conn= DriverManager.getConnection(url,user,password);
return conn;
}
public static void close(ResultSet rst, Statement stmt,Connection conn){
if(rst!=null){
try {
rst.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
rst=null;
}
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
stmt=null;
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn=null;
}
}
}
}
BaseDao
package com.neu.dao;
import com.neu.util.DBUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public abstract class BaseDao {
protected Connection conn;
protected PreparedStatement stmt;
protected ResultSet rst;
protected final void close(){
DBUtil.close(rst,stmt,conn);
}
protected final void getConnection() throws SQLException {
conn=DBUtil.getConnection();
}
/**
* @param sql
* @param args
* @return
*/
protected final int executeUpdate(final String sql,String...args){
int row=0;
try {
getConnection();
stmt=conn.prepareStatement(sql);
if(args!=null){
for(int i=0;i<args.length;i++){
stmt.setString(i+1,args[i]);
}
}
row=stmt.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
}finally{
close();
}
return row;
}
/**
*
* @param sql
* @param args
* @return
*/
protected final List<Map<String,Object>> executeQuery(final String sql,String...args){
List<Map<String,Object>> list=new ArrayList<>();
try {
getConnection();
stmt=conn.prepareStatement(sql);
if(args!=null){
for(int i=0;i<args.length;i++){
stmt.setString(i+1,args[i]);
}
}
rst=stmt.executeQuery();
ResultSetMetaData data=rst.getMetaData();
int n=data.getColumnCount();
//存放查询的列名,不是真正的列名可能是别名
String[] names=new String[n];
for(int i=0;i<n;i++){
names[i]=data.getColumnLabel(i+1);
}
while(rst.next()){
Map<String,Object> map=new HashMap<>();
for(int i=0;i<n;i++){
String key=names[i];
Object value=rst.getObject(key);
map.put(key,value);
}
list.add(map);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return list;
}
}
把以上三段代码打包成jar包,以后做项目把jar包导入到项目中,每个DaoImpl继承BaseDao,数据库链接文件在property文件中配置