package myStudy_jdbc.com.xiaoqiang;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
*
* <p>Title: JDBCDemo</p>
* <p>Description: JDBC示例</p>
* @author xiaoqiang
* @date 2021年8月7日
*
* JDBC概念:java Database Connectiity java语言操作数据库
* JDBC本质:java定义了操作所有关系型数据库的规则(接口),数据库厂商实现接口(数据库驱动),提供数据库驱动jar包,我们可以使用这套
* 接口(JDBC)编程,真正执行的代码是jar包中的实现类
*
* 使用步骤:
* 1.导入驱动jar包
* 2.注册驱动
* 3.获取数据库连接对象 Connection
* 4.定义sql
* 5.获取执行sql语句的对象 Statement
* 6.执行sql,接收返回结果
* 7.处理结果
* 8.释放数据链接
*
* jdbc 对象介绍
* 1.DriverManager:驱动管理对象
* 功能:
* 1.注册驱动,告诉程序使用什么数据库 static void registerDriver(Driver d)
* mysql驱动包源码有这样一段加载驱动的代码在com.mysql.cj.jdbc.Driver类中调用DriverManager注册驱动程序
* static {
* try {
* java.sql.DriverManager.registerDriver(new Driver());
* } catch (SQLException E) {
* throw new RuntimeException("Can't register driver!");
* }
* }
*
* 2.获取数据链接
* 方法:static Connection getConnection(String url,String user,String password)
* 2.Connection:数据库连接对象
* 功能:
* 1.获取执行sql对象
* 方法 Statement createStatement()
* 方法 PreparedStatement preparedStatement(String sql)
* 2.管理事务:
* 开启:void setAutoCommit(boolean autoCommit) 参数设置为 false开启事务
* 提交:void commit();
* 回滚:void rollback();
* 3.Statement:执行静态sql语句对象
* 功能:执行静态sql并返回结果
* 方法:
* 1.int executeUpdate(String sql);
* 执行DML(insert,update,delete)语句、DDL(create,alter,drop)语句,返回值是影响的行数
* 2.ResultSet executeQuery(String sql):执行DQL(select)语句
* 4.ResultSet:结果集对象,封装查询结果
* 方法:
* 1.boolean next();游标向下移动一行,光标位于最后一行之后返回false
* 2.重载getXxx(int/String):获取数据,Xxx数据类型,例如 getInt获取 int类型数据
* 重载参数:int:代表列的编号,编号从1开始
* String:代表列名(表字段名称)
*
* 5.PreparedStatement:执行预编译sql语句对象,解决sql注入问题
* sql注入问题:在拼接sql时,有一些sql的特殊关键字的字符串拼接,会造成安全性问题
* 预编译sql:sql语句的参数使用占位符(?)
* 获取sql执行对象 Connection.prepareStatement(String sql);
* 给?赋值使用 setXxx(参数1(?的位置,从1开始),参数2(sql参数的值))
*
* jdbc 控制事务
* 使用Connection 管理事务
* 开启:void setAutoCommit(boolean autoCommit) 参数设置为 false开启事务
* 提交:void commit();
* 回滚:void rollback();
*
*/
public class JDBCDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// JDBCMethod();
// resultSetMethod();
// preparedStatementMethod();
transactionMethod(1,2,500);
}
/**
*
* <p>Title: JDBCMethod</p>
* <p>Description: JDBC 连接示例</p>
*/
public static void JDBCMethod() {
Connection conn = null;
Statement stmt = null;
try {
// 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");// mysql8.0版本后驱动
// Class.forName("com.mysql.jdbc.Driver");//mysql8.0版本前驱动
// 获取数据库连接对象 Connection(mysql 8.0后的版本需要在url中指定时区属性 serverTimezone=UTC)
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/db1?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false", "root",
"Xiaoqiang1006");
// 获取数据库连接对象 Connection(mysql 8.0前的版本)
// conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root","Xiaoqiang1006");
// 定义sql语句
String sql = "update students set age='28' where id='1'";
// 获取执行sql语句的对象 Statement
stmt = conn.createStatement();
// 执行sql,接收返回结果
int count = stmt.executeUpdate(sql);
// 处理结果
System.out.println(count);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放数据链接
try {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
*
* <p>Title: resultSetMethod</p>
* <p>Description: JDBC查询示例</p>
*/
public static void resultSetMethod() {
Connection conn = null;
Statement stmt = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/db1?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false", "root",
"Xiaoqiang1006");
String sql = "select * from students";
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
int i = rs.getInt("id");
String name = rs.getString("name");
Date date = rs.getDate("birthday");
System.out.println("id:"+ i +",姓名:"+name+",生日:"+date.toString());
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
*
* <p>Title: preparedStatementMethod</p>
* <p>Description:JDBC预编译防注入示例 </p>
*/
public static void preparedStatementMethod() {
Connection conn = null;
PreparedStatement ps = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/db1?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false", "root",
"Xiaoqiang1006");
//定义预编译sql
String sql = "select * from students where id=? and password=?";
//获取sql执行对象
ps = conn.prepareStatement(sql);
//传递where的占位符参数
ps.setInt(1, 1);
ps.setString(2, "12345");
//执行sql
ResultSet rs = ps.executeQuery();
while (rs.next()) {
int i = rs.getInt("id");
String name = rs.getString("name");
Date date = rs.getDate("birthday");
System.out.println("id:"+ i +",姓名:"+name+",生日:"+date.toString());
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCCloseUtilMethod(ps, null);
}
}
/**
*
* <p>Title: transactionMethod</p>
* <p>Description: JDBC事务示例</p>
* @param id1
* @param id2
* @param amount
*/
public static void transactionMethod(int id1,int id2,double amount) {
Connection conn = null;
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/db1?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false", "root",
"Xiaoqiang1006");
//开启事务
conn.setAutoCommit(false);
//定义两个sql,一个数据加一个数据减
String sql1 = "update students set amount = amount-? where id = ?";
String sql2 = "update students set amount = amount+? where id = ?";
//获取sql执行对象
ps1 = conn.prepareStatement(sql1);
//传递where的占位符参数
ps1.setDouble(1, amount);
ps1.setInt(2, id1);
//执行sql1
int rs1 = ps1.executeUpdate();
//编写一个运行异常,测试是否回滚
// int i = 10/0;
//获取sql执行对象
ps2 = conn.prepareStatement(sql2);
//传递where的占位符参数
ps2.setDouble(1, amount);
ps2.setInt(2, id2);
//执行sql1
int rs2 = ps2.executeUpdate();
//判断数据修改正常提交事务,否则回滚
if(rs1>0 && rs2>0) {
conn.commit();
}else {
conn.rollback();
}
} catch (Exception e) {
try {
//抛出异常回滚
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
JDBCCloseUtilMethod(ps1, null);
JDBCCloseUtilMethod(ps2, conn);
}
}
/**
*
* <p>Title: JDBCCloseUtilMethod</p>
* <p>Description: 释放jdbc资源</p>
* @param ps
* @param conn
*/
public static void JDBCCloseUtilMethod(PreparedStatement ps, Connection conn) {
try {
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
JDBC学习笔记
最新推荐文章于 2022-08-07 12:23:57 发布