JDBC★★★★★
=声明==
该文部分代码和内容节选自其他作者文章,仅用作个人学习,特此声明
链接:md文档/狂神说java/03.MySql/MySQL基础.md · 大垚大摆/java笔记 - Gitee.com
10、JDBC ★★★★★
10.1 数据库驱动和JDBC
1、数据库驱动
驱动:声卡,显卡,数据库
我们的程序会通过数据库驱动,和数据库打交道!
2、JDBC
SUN公司为了简化开发人员的(对数据库的统一)操作,提供了一个(java操作数据库的)规范,俗称JDBC
这些规范的实现由具体的厂商去做~
对于开发人员来说,我们只需要掌握JDBC接口的操作即可!
java.sql
javax.sql
还需要导入一个数据库驱动包 mysql-connector-java-5.1.47.jar
10.2 练习:第一个JDBC程序
1、创建测试用的数据库
CREATE DATABASE jdbcstudy CHARACTER SET utf8 COLLATE utf8_general_ci;
USER jdbcstudy;
CREATE TABLE users(
`id` INT PRIMARY KEY,
`name` VARCHAR(40),
`password` VARCHAR(40),
`email` VARCHAR(60),
`birthday` DATE
);
INSERT INTO users(`id`,`name`,`password`,`email`,`birthday`)
VALUES(1,'张三','123456','zs@sina.com','1980-12-04'),
(2,'李四','123456','lisi@sina.com','1981-12-04'),
(3,'王五','123456','wangwu@sina.com','1982-12-04');
2、用IDEA进行测试
-
创建一个普通项目
-
导入数据库驱动jar包 (mysql-connector-java-5.1.47.jar)
-
下载好jar包
-
复制到 IDEA
-
导入数据库驱动包即可
-
-
编写测试代码
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JdbcFirstDemo { public static void main(String[] args) throws ClassNotFoundException, SQLException { //1.加载驱动 // DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //推荐这种写法加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2.用户信息和URL // useSSL=true可能会报错(是否使用安全的连接为true) // url格式为 jdbc:mysql://localhost:3306/jdbctest(数据库名)?useUnicode=true(支持中文)&characterEncoding=utf8&useSSL=false String url = "jdbc:mysql://localhost:3306/jdbctest?useUnicode=true&characterEncoding=utf8&useSSL=false"; String userName = "root"; String passWord = "xy680501*"; //3.连接成功,数据库对象 Connection代表数据库 Connection connection = DriverManager.getConnection(url, userName, passWord); //4.执行SQl的对象 Statement 执行的sql对象 Statement statement = connection.createStatement(); //5.执行SQL的对象 去 执行SQL ,可能存在结果,查看返回的结果 String sql = "SELECT * FROM users"; //返回的结果集 结果集中封装了我们全部的查询的结果 ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { System.out.println("id="+resultSet.getObject("id")); System.out.println("name="+resultSet.getObject("name")); System.out.println("password="+resultSet.getObject("password")); System.out.println("email="+resultSet.getObject("email")); System.out.println("birthday="+resultSet.getObject("birthday")); System.out.println("==============================="); } //6.释放连接 resultSet.close(); statement.close(); connection.close(); } }
-
稍微分析一下上边的java代码
-
第一步要加载驱动
/*加载驱动 方法一:DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 推荐用方法二加载驱动 */ Class.forName("com.mysql.jdbc.Driver");
-
第二步要连接数据库
-
首先,把用户信息和url分别定义为字符串
/*把用户信息和URL定义为字符串 useSSL=true可能会报错(是否使用安全的连接为true) url格式为 jdbc:mysql://localhost:3306/jdbctest(数据库名)?useUnicode=true(支持中文)&characterEncoding=utf8&useSSL=false */ String url = "jdbc:mysql://localhost:3306/jdbctest?useUnicode=true&characterEncoding=utf8&useSSL=false"; String userName = "root"; String passWord = "xy680501*";
-
然后连接数据库,之后就用connection来代表连接的jdbctest数据库
//连接数据库,数据库对象(要用到前一步定义的用户信息和URL) 后面就用 Connection 代表数据库 Connection connection = DriverManager.getConnection(url, userName, passWord);
-
-
第三步是创建一份对象来执行SQL命令
这一步就相当于创建一个sql命令栏,在命令栏里写sql语句来进行数据库操作
//创建一个执行SQl的对象 statement Statement statement = connection.createStatement();
-
第四步是用创建的statement对象执行SQL命令
举个例子:现在我要查询表的全部内容并将查询结果封装为结果集形式
//执行SQL的对象 去 执行SQL ,可能存在结果,查看返回的结果 String sql = "SELECT * FROM users"; //返回的结果集 结果集中封装了我们全部的查询的结果 ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { System.out.println("id="+resultSet.getObject("id")); System.out.println("name="+resultSet.getObject("name")); System.out.println("password="+resultSet.getObject("password")); System.out.println("email="+resultSet.getObject("email")); System.out.println("birthday="+resultSet.getObject("birthday")); System.out.println("==============================="); }
-
最后要释放连接,否则就会占用大量资源
//释放连接 resultSet.close(); statement.close(); connection.close();
-
-
运行结果
很明显与查询表的内容一致
-
步骤总结
- 加载驱动
- 连接数据库DriverManager
- 获取执行SQL的对象 Statement
- 获得返回的结果集
- 释放连接
10.3 JDBC 对象解释
DriverManager
//1.加载驱动
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//推荐这种写法加载驱动
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(url, userName, passWord);
// connection代表数据库
// 数据库设置自动提交
// 事务提交
// 事务回滚
connection.setAutoCommit(true);
connection.commit();
connection.rollback();
URL
String url = "jdbc:mysql://localhost:3306/jdbctest?useUnicode=true&characterEncoding=utf8&useSSL=false";
// mysql默认端口3306
// 协议://主机地址:端口号/数据库名?参数1&参数2&参数3
//mysql8需要写时区
// oracle默认端口1521
// jdbc:oracle:thin:@localhost:1521:sid
Statement 和 PreparedStatement 都是执行sql对象
String sql = "SELECT * FROM users";//编写SQL
statement.executeQuery();//执行查询 返回结果集ResultSet
statement.executeUpdate();//新增,删除,修改,都用这个,返回影响到的的行数
statement.execute();//执行任何SQL
statement.executeBatch();//执行多个SQL
ResultSet 查询的结果集,封装了所有的查询结果
获得指定的数据类型
//在不知道列类型的情况下使用
resultSet.getObject();
//如果知道列类型,就使用指定的类型
resultSet.getString();
resultSet.getInt();
resultSet.getDouble();
resultSet.getBigDecimal();
resultSet.getFloat();
resultSet.getDate();
//...
遍历,指针
resultSet.beforeFirst();//移动到最前面
resultSet.afterLast();//移动到最后面
resultSet.next();//移动到下一个数据
resultSet.previous();//移动到前一行
resultSet.absolute(row);//移动到指定行
释放资源
resultSet.close();
statement.close();
connection.close();//消耗资源
10.4 Statement 对象详解
jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
Statement对象的executeUpdate
方法,用于向数据库发送增、删、改的SQL语句,executeUpdate
执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发送了变化)。
Statement.executeQuery
方法用于向数据库发送查询语句,executeQuery
方法返回代表查询结果的ResultSet对象。
CRUD操作-create
使用executeUpdate(String sql)
方法完成数据添加操作,示例操作:
Statement statement = connection.createStatement();
String sql = "insert into user(...) values(...)";
int num = statement.executeUpdate(sql);
if (num > 0) {
System.out.println("插入成功~");
}
CRUD操作-delete
Statement statement = connection.createStatement();
String sql = "delete from user where id=1";
int num = statement.executeUpdate(sql);
if (num > 0) {
System.out.println("删除成功~");
}
CRUD操作-update
Statement statement = connection.createStatement();
String sql = "update user set name='' where name =''";
int num = statement.executeUpdate(sql);
if (num > 0) {
System.out.println("修改成功~");
}
CRUD操作-read
Statement statement = connection.createStatement();
String sql = "SELECT * FROM users";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
//根据获取列的数据类型,分别调用resultSet的相应方法映射到java对象中
}
用代码实现数据库的增删改查操作
JDBCUtils 用于加载驱动,获取连接(该示例为连接到 jdbctest 数据库)并释放连接
连接到这个数据库
代码位置如下图所示
-
提取工具类
import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /** * @ClassName: JDBCUtils * @Description: TODO 类描述 * @Author: xy * @Version: 1.0 */ public class JDBCUtils { private static String driver = null; private static String url = null; private static String username = null; private static String password = null; static { try { InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); properties.load(in); driver = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); //驱动只用加载一次 Class.forName(driver); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 获取连接 */ public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, username, password); } /** * 释放资源 */ public static void release(Connection con, Statement st, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
配置文件db.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbctest?useUnicode=true&characterEncoding=utf8&useSSL=false username=root password=xy680501*
1.编写增删改的方法 executeUpdate
-
Insert
编写练习import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * @ClassName: testInsert * @Description: TODO 类描述 * @Author: xy * @Version: 1.0 */ public class testInsert { public static void main(String[] args) { Connection con = null; Statement st = null; ResultSet rs = null; try { con = JDBCUtils.getConnection(); st = con.createStatement(); String sql = "INSERT INTO users(`id`,`name`,`password`,`email`,`birthday`)\n" + "VALUES (4,'钱七','123456','qianqi@sina.com','1988-12-04')"; int num = st.executeUpdate(sql); if (num > 0) { System.out.println("插入成功!"); } } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.release(con, st, rs); } } }
如下图所示:成功插入了一行记录
-
Delete
编写练习import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * @ClassName: testDelete * @Description: TODO 类描述 * @Author: xy * @Version: 1.0 */ public class testDelete { public static void main(String[] args) { Connection con = null; Statement st = null; ResultSet rs = null; try { con = JDBCUtils.getConnection(); st = con.createStatement(); String sql = "DELETE FROM users WHERE `id`=4"; int num = st.executeUpdate(sql); if (num > 0) { System.out.println("删除成功!"); } } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.release(con, st, rs); } } }
如下图所示:成功删除了一行数据
-
Update
编写练习import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * @ClassName: testUpdate * @Description: TODO 类描述 * @Author: xy * @Version: 1.0 */ public class testUpdate { public static void main(String[] args) { Connection con = null; Statement st = null; ResultSet rs = null; try { con = JDBCUtils.getConnection(); st = con.createStatement(); String sql = "UPDATE users SET birthday='1990-12-01' WHERE id=1"; int num = st.executeUpdate(sql); if (num > 0) { System.out.println("更新成功!"); } } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.release(con, st, rs); } } }
如下图所示:字段id为1处的birthday数据成功修改为1990-12-01
2.编写查询方法 Statement.executeQuery()
package com.xy.MySQL.myMethods;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @ClassName: testSelect
* @Description: TODO 类描述
* @Author: xy
* @Version: 1.0
*/
public class testSelect {
public static void main(String[] args) {
Connection con = null;
Statement st = null;
ResultSet rs = null;
try {
con = JDBCUtils.getConnection();
st = con.createStatement();
String sql = "SELECT * FROM users WHERE id=1";
rs = st.executeQuery(sql);
while (rs.next()) {
System.out.println("id="+rs.getInt("id"));
System.out.println("name="+rs.getString("name"));
System.out.println("password="+rs.getString("password"));
System.out.println("email="+rs.getString("email"));
System.out.println("birthday="+rs.getDate("birthday"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.release(con, st, rs);
}
}
}
如下图所示:成功查询id=1处的id,name,password,email,birthday信息
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库