概述


Java DataBase Connectivity(java 数据库连接)

maven

mysql-connector-java
pom配置文件

  1. <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. <version>5.1.49</version>
  6. </dependency>

创建数据表user

  1. -- ----------------------------
  2. -- Table structure for user
  3. -- ----------------------------
  4. DROP TABLE IF EXISTS `user`;
  5. CREATE TABLE `user` (
  6. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  7. `user_name` varchar(20) NOT NULL,
  8. `password` varchar(32) NOT NULL,
  9. `age` tinyint(4) unsigned NOT NULL DEFAULT '0',
  10. `gender` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '0 未知 1 男 2 女',
  11. `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  12. `updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  13. PRIMARY KEY (`id`)
  14. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
  15. -- ----------------------------
  16. -- Records of user
  17. -- ----------------------------
  18. INSERT INTO `user` VALUES (1, 'test1', '123456', 25, 1, '2021-08-31 00:37:12', '2021-08-31 00:37:16');
  19. INSERT INTO `user` VALUES (2, 'test2', '1234abc', 22, 1, '2021-08-30 16:42:24', '2021-08-30 16:42:33');
  20. INSERT INTO `user` VALUES (3, 'test3', 'qwer123', 30, 2, '2021-08-30 16:42:54', '2021-08-30 16:44:40');

步骤
1 注册驱动/加载驱动DriverManager.registerDriver
2 获取连接 DriverManager.getConnection
3 获取操作数据库的预处理对象prepareStatement
4 执行结果SQL 得到结果集executeQuery()
5 遍历结果集next()
6 释放资源close

  1. import java.sql.*;
  2. public class JdbcDemo {
  3. public static void main(String[] args) {
  4. Connection connection = null;
  5. PreparedStatement prepareStatement = null;
  6. ResultSet rs = null;
  7. try {
  8. // 加载驱动
  9. Class.forName("com.mysql.jdbc.Driver");
  10. // 获取连接
  11. String url = "jdbc:mysql://127.0.0.1:3306/test";
  12. String user = "root";
  13. String password = "123456";
  14. connection = DriverManager.getConnection(url, user, password);
  15. // 获取statement,preparedStatement
  16. String sql = "select * from user where id=?";
  17. prepareStatement = connection.prepareStatement(sql);
  18. // 设置参数
  19. prepareStatement.setLong(1, 1l);
  20. // 执行查询
  21. rs = prepareStatement.executeQuery();
  22. // 处理结果集
  23. while (rs.next()) {
  24. System.out.println(rs.getString("user_name"));
  25. System.out.println(rs.getString("password"));
  26. System.out.println(rs.getInt("age"));
  27. System.out.println(rs.getInt("gender"));
  28. }
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. } finally {
  32. // 关闭连接,释放资源
  33. if (rs != null) {
  34. try {
  35. rs.close();
  36. } catch (SQLException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. if (prepareStatement != null) {
  41. try {
  42. prepareStatement.close();
  43. } catch (SQLException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. if (connection != null) {
  48. try {
  49. connection.close();
  50. } catch (SQLException e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. }
  55. }
  56. }

如果使用的是5的mysl版本的话 com.mysql.jdbc.Driver 而6的版本是com.mysql.cj.jdbc.Driver

  1. DriverManager.registerDriver(new com.mysql.jdbc.Driver());

API


一、注册驱动
实际开发中注册驱动会使用如下的方式: Class.forName(“com.mysql.jdbc.Driver”); 因为之前的方式会导致驱动注册两次。
二、获得连接
Connection getConnection(String url,String username,String password);
url 写法:jdbc:mysql://localhost:3306/jdbc
jdbc :协议
mysql :子协议
localhost :主机名
3306 :端口号
url 简写:jdbc:mysql:///jdbc
Connection :连接对象 主要作用:
一、创建执行 SQL 语句的对象
Statement createStatement() :执行 SQL 语句,有 SQL 注入的漏洞存在。
PreparedStatement prepareStatement(String sql) :预编译 SQL 语句,解决 SQL注入的漏洞。
CallableStatement prepareCall(String sql) :执行 SQL 中存储过程.
二、进行事务的管理
setAutoCommit(boolean autoCommit):设置事务是否自动提交。 commit():事务提交
rollback():事务回滚
Statement :执行 SQL 主要作用:
一、执行 SQL 语句
boolean execute(String sql):执行 SQL,执行 select 语句返回 true,否则返回 false ResultSet executeQuery(String sql):执行 SQL 中的 select 语句
int executeUpdate(String sql):执行 SQL 中的 insert/update/delete 语句
二、执行批处理操作
addBatch(String sql):添加到批处理
executeBatch():执行批处理 clearBatch():清空批处理
ResultSet:结果集
结果集:其实就是查询语句(select)语句查询的结果的封装。 主要作用:结果集获取查询到的结果的。
next():针对不同的类型的数据可以使用 getXXX()获取数据,通用的获取数据的方法: getObject();

SQL注入漏洞解决


PreparedStatement是Statement的子接口,它的实例对象可以通过调用 Connection.preparedStatement(sql)方法获得,相对于Statement对象而 言:
– PreperedStatement可以避免SQL注入的问题。
– Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。
PreparedStatement 可对SQL进行预编译,从而提高数据库的执行效率。
– 并且PreperedStatement对于sql中的参数,允许使用占位符的形式进行 替换,简化sql语句的编写。