概述
Java DataBase Connectivity(java 数据库连接)
maven
mysql-connector-java
pom配置文件
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency>
创建数据表user
-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`user_name` varchar(20) NOT NULL,`password` varchar(32) NOT NULL,`age` tinyint(4) unsigned NOT NULL DEFAULT '0',`gender` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '0 未知 1 男 2 女',`created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;-- ------------------------------ Records of user-- ----------------------------INSERT INTO `user` VALUES (1, 'test1', '123456', 25, 1, '2021-08-31 00:37:12', '2021-08-31 00:37:16');INSERT INTO `user` VALUES (2, 'test2', '1234abc', 22, 1, '2021-08-30 16:42:24', '2021-08-30 16:42:33');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
import java.sql.*;public class JdbcDemo {public static void main(String[] args) {Connection connection = null;PreparedStatement prepareStatement = null;ResultSet rs = null;try {// 加载驱动Class.forName("com.mysql.jdbc.Driver");// 获取连接String url = "jdbc:mysql://127.0.0.1:3306/test";String user = "root";String password = "123456";connection = DriverManager.getConnection(url, user, password);// 获取statement,preparedStatementString sql = "select * from user where id=?";prepareStatement = connection.prepareStatement(sql);// 设置参数prepareStatement.setLong(1, 1l);// 执行查询rs = prepareStatement.executeQuery();// 处理结果集while (rs.next()) {System.out.println(rs.getString("user_name"));System.out.println(rs.getString("password"));System.out.println(rs.getInt("age"));System.out.println(rs.getInt("gender"));}} catch (Exception e) {e.printStackTrace();} finally {// 关闭连接,释放资源if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (prepareStatement != null) {try {prepareStatement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}}
如果使用的是5的mysl版本的话 com.mysql.jdbc.Driver 而6的版本是com.mysql.cj.jdbc.Driver
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语句的编写。
