文章目录
JDBC数据库访问技术的基本使用
官网介绍: JDBC Concepts1
- JDBC
Java DataBase Connectivity
JDBC下载安装
下载入口12 (需要先下载下载器:installer…)
下载入口23 (Maven下载,或者点jar包下载)
JDBC介绍
-
是一个规范,不是一个实现
-
数据库厂商根据JDBC,实现自家的驱动Driver。
如:mysql驱动com.mysql.cj.jdbc.Driver
,
(MySQL)JDBC使用:
导入专用的jar包
注册驱动、创建连接、创建语句对象、
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
// Notice, do not import com.mysql.cj.jdbc.*
// or you will have problems!
public class LoadDriver {
public static void main(String[] args) {
try {
Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
// 用了静态代码块创建Driver()对象。
// 静态代码块,在类初次被加载的时候执行且仅会被执行一次
/* @file: com.mysql.cj.jdbc.Driver (Driver.class)
...
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
...
*/
} catch (Exception ex) {
// handle the error
}
}
}
在驱动程序已在DriverManager注册后,
可以通过调用DriverManager.getConnection()
获取连接到特定数据库的连接实例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
Connection conn = null;
...
try {
conn =
DriverManager.getConnection("jdbc:mysql://localhost/test?" +
"user=Ading&password=Adingable");
/**
*url必须加时区参数: serverTimezone=Asia/Shanghai
*characterEncoding=utf8防止中文乱码
*/
} catch (SQLException ex) {
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
Connection
连接后,它可用于创建Statement
和 PreparedStatement
对象,以及检索关于数据库的元数据。
例子:执行SELECT
Statement
对象允许执行基本的SQL查询并通过ResultSet类检索结果.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
// assume that conn is an already created JDBC connection
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT knowledges,money FROM mind");
// or alternatively, if you don't know ahead of time that
// the query will be a SELECT...
if (stmt.execute("SELECT knowledges,money FROM mind")) {
rs = stmt.getResultSet();
}
// Now do something with the ResultSet ....
}
catch (SQLException ex){
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
finally {
// it is a good idea to release
// resources in a finally{} block
// in reverse-order of their creation //递归的关闭(.close())
// if they are no-longer needed
if (rs != null) {
try {
rs.close();
} catch (SQLException sqlEx) { } // ignore
rs = null;
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException sqlEx) { } // ignore
stmt = null;
}
}
对于execute() 和executeQuery()
如果事先不知道
SQL
语句是SELECT
还是UPDATE/INSERT
,
那么可以使用execute(String SQL)
方法。
如果SQL查询是一个SELECT
语句,该方法将返回true
,
如果是一个UPDATE
、INSERT
或DELETE
语句, 则返回false
。
如果语句是一个
SELECT
查询,可以通过调用getResultSet()
方法检索结果。
如果该语句是一个UPDATE
、INSERT
或DELETE
语句,
可以通过在statement
实例上调用getUpdateCount()
来检索受影响的行数。
prepareStatement对象防止sql注入
- 是一个
特殊的Statement
对象, - 把用户非法输入的单引号用
\
反斜杠做了转义( [SQL注入]4)
String sql = "update user set username=? where id = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "Ading"); // 可见,下标从1开始,不是0
preparedStatement.setInt(2, 007);
JDBC官网介绍:https://dev.mysql.com/doc/connector-j/8.0/en/ ↩︎
https://dev.mysql.com/downloads/connector/j/ ↩︎
https://mvnrepository.com/artifact/mysql/mysql-connector-java ↩︎
所谓SQL注入,指的是通过把SQL命令插入到Web表单提交或者输入域名或者页面请求的查询字符串,最终达到欺骗服务器,达到执行恶意SQL命令的目的。避免了类似select * from user where name=‘aa’ and password=‘bb’ or 1=1的sql注入问题的发生。 ↩︎