一、JDBC介绍
1.JDBC是什么
JDBC是java官方定义的一套操作所有关系型数据库(mysql、oracle等)的接口规范,各个数据库厂商基于这套接口规范提供自己的驱动jar包(接口实现类),通过接口调用实现类达到操作数据库的目的。
2.JDBC的优点
(1)java不用针对每个数据库进行单独的开发
(2)可以随时替换底层的数据库
二、JDBC常见概念
2.1 DriverManager(数据库驱动)
2.1.1 注册驱动
注册代码示例:DriverManager.registerDeriver(new Driver());
实际注册代码:Class.forName(“com.mysql.jdbc.Driver”);
实际注册原理:
(1)com.mysql.jdbc.Driver继承了com.mysql.cj.jdbc.Driver
(2)com.mysql.cj.jdbc.Driver中的静态代码块调用了java.sql.DriverManager.registerDriver(new Driver());
(3)所以当Class.forName()初始化com.mysql.jdbc.Driver时,会执行com.mysql.cj.jdbc.Driver的静态代码块注册驱动。
注意:jdk1.6+Mysql5.1.6及之后的版本不再需要通过Class.forName()注册驱动,通过自动读取驱动包下的META-INF/services/java.sql.Driver文件注册驱动。
2.1.2 获取数据库连接
Connection connection = DriverManager.getConnection(String url,String userName,String password);
2.2 Connection(数据库连接)
2.2.1 获取SQL执行对象
Statement statement = connection.createStatement();
2.2.2 获取预编译SQL执行对象
PreparedStatement preparedStatement = connection.prepareStatement(String sql);
2.2.3 获取存储过程执行对象
CallableStatement callable = connection.prepareCall(String sql);
2.2.4 管理事务
(1)connection.setAutoCommit(boolean autoCommit); true为自动提交事务,false为手动提交事务并开启事务。
(2)connection.commit(); 提交事务
(3)connection.rollback(); 回滚事务
2.3 Statement(SQL执行对象)
2.3.1 执行DDL、DML语句
int count = statement.executeUpdate(String sql); 执行DML语句返回影响行数,执行DDL语句返回0
2.3.2 执行DQL语句0
ResultSet resultSet = statement.executeQuery(String sql); 返回查询结果集
2.4 PrepareStatement(预编译SQL执行对象)
String sql = "SELECT * FROM student where student_no = ? and student_name = ?"
preparedStatement.setString(1, 0211066);
preparedStatement.setInt(2, "陈冠希");
ResultSet resultSet = preparedStatement.executeQuery();
优点:
1.创建PreparedStatement对象时会将SQL模版传入mysql,完成SQL检查和SQL编译工作,提高执行效率。
2.需要执行多条相同的SQL模版时,只需要进行一次检查和编译,效率高。
3.可以防止SQL注入。(设置String参数时无论传入什么值都会封装到单引号中,例如id = ‘1 or 1 = 1’)
注意:如果想要使用预编译功能需要开启预编译配置:useServerPrepStmts=true
2.5 ResultSet(SQL查询结果集)
2.5.1 处理结果集
代码示例:
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
String cardId = resultSet.getString("card_id");
String cardName = resultSet.getString("card_name");
System.out.println(cardId + ":" + cardName);
}
三、完整示例
代码示例1(Statement):
private String url = "jdbc:mysql://localhost:3306/marketing_db?serverTimezone=Asia/Shanghai&useServerPrepStmts=true";
private String userName = "root";
private String password = "123456";
@Test
public void test01() throws ClassNotFoundException, SQLException {
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取链接
Connection connection = DriverManager.getConnection(url, userName, password);
// 3.定义SQL语句
String sql1 = "SELECT * FROM m_card_info WHERE card_id = 1";
String sql2 = "SELECT * FROM m_card_info WHERE card_id = 2";
// 4.创建SQL执行器
Statement statement = connection.createStatement();
ResultSet resultSet1 = statement.executeQuery(sql1);
while (resultSet1.next()) {
String cardId = resultSet1.getString("card_id");
String cardName = resultSet1.getString("card_name");
System.out.println(cardId + ":" + cardName);
}
ResultSet resultSet2 = statement.executeQuery(sql2);
while (resultSet2.next()) {
String cardId = resultSet2.getString("card_id");
String cardName = resultSet2.getString("card_name");
System.out.println(cardId + ":" + cardName);
}
statement.close();
// 关闭连接
connection.close();
}
代码示例2(PrepareStatement):
private String url = "jdbc:mysql://localhost:3306/marketing_db?serverTimezone=Asia/Shanghai&useServerPrepStmts=true";
private String userName = "root";
private String password = "123456";
@Test
public void test02() throws ClassNotFoundException, SQLException {
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取链接
Connection connection = DriverManager.getConnection(url, userName, password);
// 3.定义SQL语句
String sql = "SELECT * FROM m_card_info WHERE card_id = ?";
// 4.创建SQL预编译执行器
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "1");
ResultSet resultSet1 = preparedStatement.executeQuery();
while (resultSet1.next()) {
String cardId = resultSet1.getString("card_id");
String cardName = resultSet1.getString("card_name");
System.out.println(cardId + ":" + cardName);
}
preparedStatement.setString(1, "7");
ResultSet resultSet2 = preparedStatement.executeQuery();
while (resultSet2.next()) {
String cardId = resultSet2.getString("card_id");
String cardName = resultSet2.getString("card_name");
System.out.println(cardId + ":" + cardName);
}
preparedStatement.close();
// 关闭连接
connection.close();
}
9161



被折叠的 条评论
为什么被折叠?



