JDBC
1.什么是jdbc(Java Database Conectivity)
Java数据库连接技术的简称,提供连接各种常用数据库的能力
2.JDBC的工作原理
与数据库建立连接、执行SQL 语句、处理结果
DriverManager类:管理各种不同的JDBC驱动
Connection接口:负责连接数据库并担任传送数据的任务
Statement接口:由 Connection 产生、负责执行SQL语句
ResultSet接口:负责保存Statement执行后的查询结果
3.开发步骤
//1、导入jar包 [mysql-connector-java-8.0.16.jar]
//2、加载绑定jar包
//3、加载驱动
//4、连接数据库
public static void main(String[] args) {
try {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("驱动加载完成!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//创建连接
Connection conn = null;
//中国标准时 UTC+08:00
String URL = "jdbc:mysql://localhost:3306/hospital?useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT-8";
String user = "root";
String pwd = "root";
try {
conn=DriverManager.getConnection(URL,user,pwd);
System.out.println("数据库连接成功!");
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(null!=conn){
try {
conn.close();
System.out.println("数据库关闭连接!");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
4.数据库连接字符串
jdbc:数据库://ip:端口/数据库名称[连接参数=参数值]
String URL = “jdbc:mysql://localhost:3306/hospital?useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT-8”;
5.Connection创建数据库连接
常用方法:
createStatement(): 创建一个Statement对象将SQL语句发送到数据库
prepareStatement(String sql):创建一个PreparedStatement对象,将参数化的SQL语句发送到数据库
close():立即释放此Connection对象的数据库和JDBC资源
6.Statement接口
Java执行数据库操作的一个重要接口
Statement对象:执行不带参数的简单SQL语句
PreparedStatement对象:执行带或不带In参数的预编译SQL语句
常用方法:
executeQuery(String sql):查询并获取ResultSet对象
executeUpdate(String sql):增删改获取受影响的行数
execute(String sql):可以执行任意SQL语句,如果结果为 ResultSet 对象,则返回 true;如果其为更新计数或者不存在任何结果,则返回false
7.关闭释放资源
关闭顺序是后创建的对象要先关闭释放资源
8.ResultSet接口
常用方法:
next():将游标从当前位置向下移动一行
void close():关闭ResultSet 对象
getString、getInt、getfloat…(列名/列下标(从1开始)):当前行指定列号值
采用列名来标识列可读性强,且不容易出错
9.SQL注入攻击
10.PreparedStatement接口
避免SQL注入的隐患
PreparedStatement接口 (预编译的 SQL 语句) 提高SQL语句执行的性能
11.封装BaseDao
package com.dong.util;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* @author xiaoDong
* @version 1.0.0
* @ClassName DBHelp.java
* @Description TODO
* @createTime 2022年11月10日 14:53:00
*/
public class BaseDao {
private static final Logger logger = Logger.getLogger(DBHelp.class.getName());
private static String DRIVER = null;
//数据库连接地址
private static String URL = null;
private static String USER = null;
private static String PWD = null;
//连接数据库对象
private static Connection conn = null;
//操作指令对象
private static PreparedStatement pstms = null;
static {
//资源放置在resources文件夹中,将该文件夹设置为资源文件夹
String configFile = "database.properties";
//获取配置文件写入到流中
InputStream is = DBHelp.class.getClassLoader().getResourceAsStream(configFile);
//读取配置文件
Properties params = new Properties();
try {
params.load(is);
//读取驱动
DRIVER = params.getProperty("driver");
//读取数据库地址
URL = params.getProperty("url");
USER = params.getProperty("user");
PWD = params.getProperty("pwd");
} catch (IOException e) {
e.printStackTrace();
}
//加载驱动
try {
Class.forName(DRIVER);
logger.debug("驱动加载成功!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 打开数据库
*/
private static void openConn() {
try {
conn = DriverManager.getConnection(URL, USER, PWD);
logger.debug("数据库连接成功!");
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 返回结果集
*
* @param sql
* @param params
* @return
*/
public static ResultSet getResult(String sql, Object[] params) {
openConn();
//对指令进行预编译
try {
pstms = conn.prepareStatement(sql);
if (null != params) {
for (int i = 0; i < params.length; i++) {
pstms.setObject(i + 1, params[i]);
}
}
logger.debug("操作指令:" + sql);
return pstms.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 增删改
*
* @param sql
* @param params
* @return
*/
public static int getRows(String sql, Object[] params) {
openConn();
try {
pstms = conn.prepareStatement(sql);
if (null != params) {
for (int i = 0; i < params.length; i++) {
pstms.setObject(i + 1, params[i]);
}
}
logger.debug("操作指令:" + sql);
return pstms.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return -1;
}
/**
* 释放资源
*
* @param rs
*/
public static void closedAll(ResultSet rs) {
try {
if (null != rs) {
rs.close();
}
if (null != pstms) {
pstms.close();
}
if (null != conn) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}