JDBC:
指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库。从根本上来说,JDBC 是一种规范,它提供了一套完整的接口,允许便携式访问到底层数据库
常见的 JDBC 组件:
JDBC 的 API 提供了以下接口和类:
DriverManager :这个类管理一系列数据库驱动程序。匹配连接使用通信子协议从 JAVA 应用程序中请求合适的数据库驱动程序。识别 JDBC 下某个子协议的第一驱动程序将被用于建立数据库连接。
Driver : 这个接口处理与数据库服务器的通信。你将很少直接与驱动程序互动。相反,你使用 DriverManager 中的对象,它管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息。
Connection : 此接口具有接触数据库的所有方法。该连接对象表示通信上下文,即,所有与数据库的通信仅通过这个连接对象进行。
Statement : 使用创建于这个接口的对象将 SQL 语句提交到数据库。除了执行存储过程以外,一些派生的接口也接受参数。
ResultSet : 在你使用语句对象执行 SQL 查询后,这些对象保存从数据获得的数据。它作为一个迭代器,让您可以通过它的数据来移动。
SQLException : 这个类处理发生在数据库应用程序的任何错误。
JDBC连接Mysql数据库
- 加载驱动(先导入mysql-connector-java-5.1.49.jar下载地址)
- 连接数据库
我这边使用的是MySQL5,所以所用的驱动是com.mysql.jdbc.Driver,对于MySQL 8.0.21的版本则使用com.mysql.cj.jdbc.Driver。并且高版本的MySQL需要设置时区,低版本的不需要没有太大影响。
// 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//DriverManager驱动管理类,主要负责获取一个数据库的连接
conn = DriverManager.getConnection(
/*
serverTimezone=GMT%2B8 时区作用:web服务器和mysql服务器的会话期间的mysql服务器时区,就是临时指定mysql服务器的时区。
characterEncoding=utf-8" 解决乱码问题
*/
"jdbc:mysql://localhost:3306/ykl_saim?serverTimezone=GMT%2B8&characterEncoding=utf-8",
"root",
"123456"
);
- 使用语句操作数据库
String sql="sql语句 ";
// 执行sql
ps = conn.prepareStatement(sql);
- 关闭数据库连接,释放资源
// 释放资源
ps.close();
conn.close();
Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。
方法executeQuery
用于产生单个结果集的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法是 executeQuery。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。
方法executeUpdate
1、用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
2、使用executeUpdate方法是因为在 createTableCoffees 中的 SQL 语句是 DDL (数据定义语言)语句。创建 表,改变表,删除表都是 DDL 语句的例子,要用 executeUpdate 方法来执行。你也可以从它的名字里看出,方法executeUpdate 也被用于执行更新表 SQL 语句。
方法execute:
1、用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能 。
2、execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程 或动态执行未知 SQL 字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。
首先我先简单列举一个查询的案例
Connection conn = null;
PreparedStatement ps = null;
try {
// 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//DriverManager驱动管理类,主要负责获取一个数据库的连接
conn = DriverManager.getConnection(
/*
serverTimezone=GMT%2B8 时区作用:web服务器和mysql服务器的会话期间的mysql服务器时区,就是临时指定mysql服务器的时区。
characterEncoding=utf-8" 解决乱码问题
*/
"jdbc:mysql://localhost:3306/ykl_saim?serverTimezone=GMT%2B8&characterEncoding=utf-8",
"root",
"123456"
);
String sql="sql语句 ";
// 执行sql
ps = conn.prepareStatement(sql);
// 获取查询结果
ResultSet rs=ps.executeQuery();
// 查询结果的长度
int count = rs.getMetaData().getColumnCount();
while(rs.next()){
// 通过字段检索(某个查询字段)
int id = rs.getInt("id");
String name = rs.getString("name");
for(int i=1;i<=count;i++) {
// 遍历输出查询结果(整条)
System.out.print(rs.getString(i));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
// 释放资源
ps.close();
conn.close();
}
下面是一个简单的增加案例(DDM 共用)
Connection conn = null;
PreparedStatement ps = null;
try {
// 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//DriverManager驱动管理类,主要负责获取一个数据库的连接
conn = DriverManager.getConnection(
/*
serverTimezone=GMT%2B8 时区作用:web服务器和mysql服务器的会话期间的mysql服务器时区,就是临时指定mysql服务器的时区。
characterEncoding=utf-8" 解决乱码问题
*/
"jdbc:mysql://localhost:3306/ykl_saim?serverTimezone=GMT%2B8&characterEncoding=utf-8",
"root",
"123456"
);
String sql="insert语句 ";
// 执行sql
ps = conn.prepareStatement(sql);
//用于增删改操作
int result = ps.executeUpdate();
// 查看是否插入成功,成功result就会大于0
System.out.println(result);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
// 释放资源
ps.close();
conn.close();
}
经过长时间的使用我就将那些不变的内容写到了一个工具类中
jdbc.properties配置信息
public class JDBCUtils {
/*配置连接*/
public static Connection getConnection() throws Exception {
//从配置文件中获取连接资源
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(is);
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driver");
// 加载驱动
Class.forName(driver);
// 获取一个数据库的连接
Connection connection = DriverManager.getConnection(url, user, password);
// 返回一个已经连接好的Connection
return connection;
}
/*释放资源*/
public static void closeResource(Connection connection, Statement ps){
try {
if (ps != null)
ps.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if (connection != null)
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
这样下次我们就可以直接调用已经写好的方法,不用再重复写固定的代码了
public void insert(String sql,Object ...args)){
Connection connection = null;
PreparedStatement ps = null;
try {
//1,获取数据库的连接
connection = JDBCUtils.getConnection();
//2,预编译sql语句
ps = connection.prepareStatement(sql);
//3,填充占位符:i+1表示的是sql中的位置,args[i]:可变参数占位符,就是把值写进去
for (int i = 0; i < args.length; i++) {
ps.setObject(i+1,args[i]);
}
//4,执行操作
ps.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
//5,关闭资源
JDBCUtils.closeResource(connection,ps);
}
}
总结
使用JDBC连接Mysql数据库并进行基本功能就已经完成了,这些只是最简单的数据库操作,实际开发过程中操作数据库比这些复杂多了,包括事务处理,存储过程、流数据等等,就需要使用JDBC更高级的功能了。
梦想也许在今天无法实现,但重要的是,它在你心里。重要的是,你一直在努力,加油!!!