JDBC(Java DataBase Connectivity)java 数据库连接,是 JavaEE 平台下的技术规范,其定义了在 Java 语言中连接数据,执行 SQL 语句的标准,可以为多种关系数据库提供统一访问。
一. 具体操作如下
1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
2.获取连接
DriverManager(驱动管理类)功能如下: 1. 注册驱动 2. 获取数据库连接
⽅法1: 注册与给定的驱动程序 DriverManager 。 public static void registerDriver(Driver driver) throws SQLException
⽅式2:根据url、数据库登录的⽤户名、密码获取⼀个数据库的连接对象。
public static Connection getConnection(String url, String user, Stri ng password)
参数说明:
1.url : 连接路径
语法:jdbc:mysql://ip地址(域名):端⼝号/数据库名称?参数键值对1&参数键值对2…
示例:jdbc:mysql://127.0.0.1:3306/db1
(1).如果连接的是本机mysql服务器,并且mysql服务默认端⼝是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
(2)JDBC配置 useSSL=false 使⽤⽤户账号密码进⾏连接,useSSL=true:⼀般通过证书或者令牌进⾏安全验证。
(3)JDBC配置useTimezone=true和serverTimezone=GMT%2B8的⽬的是为了解决时区 设置问题,确保Java应⽤程序与MySQL数据库之间的时间同步。 、
2.user :⽤户名
3.password :密码
4.Connection 数据库连接对象
功能: 1. 获取执⾏ SQL 的对象 2. 管理事务
String url = "jdbc:mysql://127.0.0.1:3306/数据库名? charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8";
String user = "数据库账户";
String password = "数据库密码";
Connection conn = DriverManager.getConnection(url, user, password);
3.定义sql
String sql = "sql语句";
4.获取sql对象
Connetction类中重要的成员⽅法包括:
1. 普通执⾏SQL对象: Statement createStatement()⽅法
2. 创建PreparedStatement类的实例: PreparedStatement prepareStatement(sql)⽅法 预编译SQL的执⾏SQL对象, 通过这种⽅式获取的 PreparedStatement SQL语句执⾏对象是我们⼀ 会重点要进⾏讲解的,它可以防⽌SQL注⼊。
Statement sta = conn.createStatement();
5.执行sql语句+6.处理结果
1. boolean execute(String sql)执⾏给定的sql语句,可以执⾏任意的sql语句,了解有这个⽅法即可。
2. int executeUpdate(String sql)⽅法:执⾏的DML语句,使⽤它可以对表中的记录进⾏修改、插⼊和 删除等操作。执⾏DDL(create,alter, drop)语句,⼀般情况下ddl不太执⾏。
参数:是⼀个String对象,即⼀个更新数据表记录的SQL语句。 返回值:是int类型的值,表示的影响的⾏数。(可以通过影响的⾏数判断DML语句是否执⾏成功, 返回值>0的则执⾏成功,反之,则失败)
int count = sta.executeUpdate(sql);
if(count > 0) {
System.out.println("修改数据成功");
}else {
System.out.println("修改失敗");
}
7.资源关闭
sta.close();
conn.close();
二. 开始实操
写一个jdbc类,包括四个方法。具体实现完成以下要求:
字段名称 | 说明 | 数据类型 | 约束 |
---|---|---|---|
name | 用户名 | varchar(10) | 主键 |
pwd | 密码 | varchar(6) | 不允许空 |
邮箱 | varchar(24) | ||
birthday | 生日 | date | |
money | 账户余额 | int |
name | pwd | birthday | money | |
张三 | 888888 | zhangsan@126.com | 1986-10-11 | 1200 |
李四 | 999999 | lisi@126.com | 1988-10-23 | 700 |
王五 | 777777 | wangwu@126.com | 1990-9-11 | 200 |
(1)将表中插入上面表格中的数据;
(2)张三的生日更新为当前系统时间;
(3)删除名为王五的全部记录;
(4)查询“1987”以后出生的用户信息;
package com.ape.jdbchome;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBC {
static String driver = "com.mysql.cj.jdbc.Driver";
static String user = "root";
static String password = "123456";
static String url = "jdbc:mysql://127.0.0.1:3306/db6?charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8";;
static {
try {
//注册驱动
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// insertData();
// updateData();
// deleteData();
selectData();
}
//(1)将表中插入上面表格中的数据;
public static void insertData() {
Connection conn = null;
Statement stm = null;
try {
//获取连接
conn = getConnection();
System.out.println(conn);
stm = conn.createStatement();
String sql = "INSERT INTO Users VALUES('张三','888888','zhangsan@126.com','1986-10-11',1200),('李四','777777','lisi@126.com','1988-10-23',700),('王五','777777','wangwu@126.com','1990-9-11',200);";
int count = stm.executeUpdate(sql);
if(count > 0) {
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放资源
close(conn,stm);
}
}
//(2)张三的生日更新为当前系统时间;
public static void updateData() {
Connection conn = null;
Statement stm = null;
try {
//获取连接
conn = getConnection();
System.out.println(conn);
stm = conn.createStatement();
String sql = "UPDATE Users SET birthday = NOW() WHERE NAME = '张三'";
int count = stm.executeUpdate(sql);
if(count > 0) {
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放资源
close(conn,stm);
}
}
//(3)删除名为王五的全部记录;
public static void deleteData() {
Connection conn = null;
Statement stm = null;
try {
//获取连接
conn = getConnection();
stm = conn.createStatement();
String sql = "DELETE FROM Users WHERE NAME = '王五'";
int count = stm.executeUpdate(sql);
if(count > 0) {
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放资源
close(conn,stm);
}
}
//(4)查询“1987”以后出生的用户信息;
public static void selectData() {
User user1 = new User();
Connection conn = null;
Statement stm = null;
ResultSet rs = null;
try {
//获取连接
conn = getConnection();
stm = conn.createStatement();
String sql = "SELECT * FROM Users WHERE birthday > '1987-12-31'";
rs = stm.executeQuery(sql);
if(rs.next()) {
user1.setName(rs.getNString("name"));
user1.setPwd(rs.getNString("pwd"));
user1.setEmail(rs.getNString("email"));
user1.setBirthday(rs.getDate("birthday"));
user1.setMoney(rs.getInt("money"));
}
System.out.println(user1);
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放资源
close(conn,stm,rs);
}
}
//重复代码抽取
/*
* 获取连接
* */
public static Connection getConnection() throws SQLException {
//获取连接
Connection con = DriverManager.getConnection(url, user, password);
return con;
}
/*
* 释放资源
* */
//适用于DML
public static void close(Connection con,Statement stm) {
if(stm != null) {
try {
stm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//适用于DQL
public static void close(Connection con,Statement stm,ResultSet rs) {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
close(con, stm);
}
}