概述
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,preparedStatement
String 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语句的编写。