提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
自学习完Mysql后,接下来我们学习JDBC,即使用java代码连接数据库,并对其进行简单的增删改查!!
一、JDBC是什么?
示例:JDBC(Java DataBase Connectivity)它由一组用Java语言编写的类和接口组成,是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。
二、使用步骤
1.1.注册驱动
首先我们将下载好的JDBC驱动导入IDEA
下载完成后,解压,
注意:笔者这里下载了5版本和8版本的驱动,您可以根据自己的Mysql版本下载一个即可!!
select version();//登入Mysql后输入可以查看自己的Mysql版本号
打开IDEA,按Ctrl+Alt+Shift+S
准备工作之后
我们便可以开始写JAVA代码了!!
注册驱动共有两种方法
方式一: Driver driver = new com.mysql.jdbc.Driver();//注意是jdbc驱动包的Driver()方法
DriverManager.registerDriver(driver);
方式二:通过映射的类加载原理
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
注意:Class.forName
需要捕获ClassNotFoundException
异常.
2.获取链接对象
首先我们需要准备url,user,password,(注意都是字符串类型),然后使用DriverManager.getConnection(url, user, password)方法
url格式:jdbc:mysql://IP地址:数据库的端口号/数据库名称
user :填写mysql的用户名
password:对应的密码
代码如下(示例):
//getConnection方法也需要捕获SQLException异常。
try{
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/gzpowernode", "root", "123456");}
catch (SQLException e) {
e.printStackTrace();
此时可能会有一个错误但时不影响程序的运行:
解决方案:在URL最后面添加:?&useSSL=false
这行代码
try{
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/gzpowernode?&useSSL=false", "root", "123456");}
catch (SQLException e) {
e.printStackTrace();
之后运行便不会报此错误
3.获取数据库操作对象
方式一:使用Statement接口
3.1,创建Statement对象(可以进行SQL注入)
Statement stmt = conn.createStatement();
3.2,执行SQL语句
3.2.1,查询语句
注意:executeQuery()
方法返回类型为ResultSet
我们后面会在处理查询结果集讲到
String sql = "select * from 表名";
ResultSet rs = stmt.executeQuery(sql);
3.2.2 ,delete update insert 语句
注意:executeUpdate()方法的返回值类型为int,是专门用来执行delete update insert ,这三条DQL语句的。
String sql1 = "delete from 表名 where 条件 ";
String sql2 = "update 表名 set 字段1 = 值,...where 条件";
String sql3 = "insert into 表名(字段1,字段2,...) values(对应的值1,值2,...),((对应的值1,值2,...),...)";
int count = stmt.executeUpdate(sql);//count为该SQL语句影响的记录条数
方式二:使用PreparedStatement接口,PreparedStatement是SQL语句的预处理接口(解决SQL注入的重要方式)
注意:PreparedStatement接口继承Statement接口
3.3,创建PreparedStatement对象,并预处理SQL语句
3.3.1,查询语句
1.创建需要预处理的SQL语句:
String sql = "select 字段,字段 from 表名 where name=? and password =?";
注意:?
为占位符,
2.创建 PreparedStatement 对象并预处理SQL语句:
注意:prepareStatement()方法抛出SQLException异常
try{
PreparedStatement ps = conn.prepareStatement(sql);}
catch (SQLException e) {
e.printStackTrace();
3.执行SQL语句:
准备工作:
给?
赋值,常用方法:
setInt(int 问号的位置,int 设置的值)
setString(int 问号的位置,String 设置的值)
setDouble(int 问号的位置,Double设置的值)
注意:JDBC中问号的位置从1开始!!!
例子:
ps.setString(1, "小李");
ps.setInt(2, 123456);
执行SQL语句:executeQuery()方法抛出SQLException异常
try{
rs = ps.executeQuery();//注意此处不用再填sql}
catch (SQLException e) {
e.printStackTrace();
完整写法:
try{
String sql = "select 字段,字段 from 表名 where name=? and password =?"
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "小李");
ps.setInt(2, 123456);
ResultSet rs = ps.executeQuery();
}
catch (SQLException e) {
e.printStackTrace();
3.3.2 delete update insert 语句
与上面步骤类似,只需将executeQuery()
方法改成executeUpdate()
,适当的写?
即可
1.创建需要预处理的SQL语句:
String sql1 = "delete from 表名 where 字段 = ? ";
String sql2 = "update 表名 set 字段 = ?,...where 字段 = ?";
String sql3 = "insert into 表名(?,?,...) values(对应的?,?,...),((?,?,...),...)";
2.创建 PreparedStatement 对象并预处理SQL语句:
try{
PreparedStatement ps = conn.prepareStatement(sql);}
catch (SQLException e) {
e.printStackTrace();
3.执行SQL语句:
准备工作:
给?
赋值
例子:
ps.setString(1, "小李");
ps.setInt(2, 123456);
执行SQL语句:executeUpdate()方法抛出SQLException异常
try{
rs = ps.executeUpdate();//注意此处不用再填sql}
catch (SQLException e) {
e.printStackTrace();
4.处理查询结果集
执行查询语句,并把结果集返回给集合ResultSet
4.1创建ResultSet对象接收查询结果集合(executeQuery()方法的返回值)
ResultSet rs = stmt.executeQuery(sql);或者
ResultSet rs = ps.executeQuery();
4.2,遍历输出查询结果集合
相关常用方法:
getString(数字或者字段名字)
getInt(数字或者字段名字)
getDouble(数字或者字段名字)
boolean next(),使用该方法让指针指向记录的下一行,(最开始指向字段的名字),下一行有数据返回true,没有返回false.
例如查询:select ename,empno,sal from emp
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
String sql ="select ename,empno,sal from emp";
rs = stmt.executeQuery(sql);
while (rs.next()) {
String ename = rs.getString("ename");//注意括号内填写查询后返回的表的字段的名字,即:使用别名写别名
int empno = rs.getInt("empno");//括号内也可以填写数字,数字顺序对应查询结果中的字段顺序(数字从1开始),但是不建议这样写
Double sal = rs.getDouble("sal");
System.out.println(ename + "," + empno + "," + sal);
}
}catch(Exception e){//直接抛出最大异常
e.printStackTrace();
}
查询结果:
5,关闭资源
为了确保资源一定被关闭,关闭资源的代码填写到finally代码块中
5.1,关闭顺序
1.先关闭查询结果集对象(ResultSet rs)
2.关闭数据库操作对象(Statement stmt) or (PreparedStatement ps)
3.关闭连接对象(Connetion conn)
5.2
例子:
finally {
//6.释放资源
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("查询结果集对象未关闭");
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("数据库操作对象未关闭");
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("连接对象未关闭");
}
}
}
6.事务
JDBC默认为自动提交
我们想要JDBC程序实现事务(同时成功或者同时失败)就必须关闭自动提交
步骤:
Connection conn =…;
1.在获取连接对象之后执行conn.setAutoCommit(Boolean autoCommit)
方法,autoCommit = true
为自动提交(默认值为true),autoCommit = false
为关闭自动提交
2.在执行完操作后执行conn.commit()
方法提交,结束事务
3.防止事务失败造成数据库损坏,在catch代码块中执行conn.rollback()
try{
Connection conn = ....
conn.setAutoCommit(false);//关闭自动提交,开启事务
conn.commit();//提交事务
}catch (Exception e) {
if (conn != null) {
try {//事务出错将回滚
conn.rollback();
} catch (SQLException a) {
a.printStackTrace();
}
}
福利:
为感谢读者的支持,在此送上笔者自己手写的JDBC工具包和使用工具包的案例
工具包:
package JDBC_TB;
import java.sql.*;
import java.util.ResourceBundle;
//JDBC连接Mysql的工具类
public class Jdbc_Tb {
private Jdbc_Tb() {
}
//静态代码块注册驱动
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/*
获取连接对象
*/
public static Connection getConnection(String database, boolean autoCommit) throws SQLException {
ResourceBundle bundle = ResourceBundle.getBundle("jdbcToll");//资源绑定
String url = bundle.getString("url");
String user = bundle.getString("user");
String password = bundle.getString("password");
Connection conn = DriverManager.getConnection(url + database + "?&useSSL=false", user, password);
conn.setAutoCommit(autoCommit);
return conn;
}
//关闭资源,使用多态
public static void closeSource(Connection conn, Statement stmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("查询结果集对象未关闭");
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("数据库操作对象未关闭");
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("连接对象未关闭");
}
}
}
}
配置文件:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/
user=账号
password=密码
使用案例
package jdbc.mysql.gzpowernode;
import JDBC_TB.*;
import java.sql.*;
/*
* mysql事务
*
* */
public class test06 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.注册驱动
//2.获取连接对象
conn = Jdbc_Tb.getConnection("此处填自己的数据库名", false);//关闭自动提交
//3.获取数据库预处理操作对象
String sql = "select ename,sal from emp where sal = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, 5000);
rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("ename") + "," + rs.getDouble("sal"));
}
conn.commit();
} catch (Exception e) {
if (conn != null) {
try {//事务出错将回滚
conn.rollback();
} catch (SQLException a) {
a.printStackTrace();
}
}
e.printStackTrace();
} finally {
Jdbc_Tb.closeSource(conn, ps, rs);
}
}
}
笔者的学习包项目,包括工具包,在这
总结
JDBC编程六步
1.注册驱动
2.获取连接对象
3.获取数据库操作对象
4.执行SQL语句
5.处理查询结果集(SQL语句为查询语句时有这一步)
6.释放资源
创作不易喜欢的小伙伴可以一键二连哦,谢谢支持
<贵大20通信李小江>