要想用Java操作MySQL数据库,就需要JDBC,JDBC是官方的一个jar包,提供了一系列操作数据库的接口,所以连接MySQL的第一步就是导入这个jar包。
这里jar包已经上传至百度云盘:
链接:https://pan.baidu.com/s/1aRqOMWw-df00dQem2XGv6A
提取码:7h8j
如果是Maven项目的话,那么直接导入依赖:
mysql
mysql-connector-java
8.0.15
这里使用的是8.0.15版本
导入好了以后就可以写代码操作数据库了,操作流程主要分为以下几个方面:
介绍完了步骤,下面介绍4个核心配置:
注意:这里是根据8.0.15版本来说的
通过代码来演示一下:
首先看一下数据库中的表
这是test数据库中的test表,表的内容如图所示。
接下来看一下代码演示:
public class ConnectMySQL {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获得连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC", "...用户名...", "...密码...");
//通过获得的连接创建Statement对象
String sql = "select * from test";
Statement statement = connection.createStatement();
//通过创建的Statement对象执行sql语句
ResultSet resultSet = statement.executeQuery(sql);
/**
* resultSet就是返回的结果
*/
while (resultSet.next()) {
//如果有下一条记录
//分别打印第1,2,3,4列,这里是从1开始计算的
System.out.print(resultSet.getString(1)+ " ");
System.out.print(resultSet.getString(2)+ " ");
System.out.print(resultSet.getString(3)+ " ");
System.out.print(resultSet.getString(4)+ " ");
}
//使用finaly释放资源,这里省略
}
}
注意:
Class.forName(“com.mysql.cj.jdbc.Driver”);
通过反射进行驱动类的加载。当然这里指的是版本是8点几
DriverMananger.getConnection(“url”,“user”,“password”);
传递的参数包含三部分:
String url,:数据库连接的URL
格式:jdbc:数据库的子协议://ip+端口/数据库名
eg:jdbc:mysql://localhost:3306/test 在后面加上上面提到的一些配置(避免时区,编码问题)
String user, 数据库连接的用户名
String password:数据库的密码
该过程返回的是connection对象
statement有三种实现:
java.sql.Statement ->Statement statement = connection.createStatement()
java.sql.PreparedStatement->PreparedStatement preparedStatement = connection.prepareStatement("");
这种预编译的模式可以防止sql注入,什么是sql注入呢?本篇文章最后讲解这个问题
java.sql.CallableStatement-> CallableStatement callableStatement = connection.prepareCall();
常用执行sql有两种方式:
处理结果集当我们执行的是executeQuery查询语句的时候,返回的是ResultSet的结果集合。该结果集的大概用法在代码处已经讲过,这里不再赘述。
如果是executeUpdate更新语句的时候,返回的是int值,该int表示sql操作影响的记录数量。
如果执行完了sql语句而不释放资源,那么服务器的连接数会随着客户端的使用次数增多而出现问题,所以一定要记得释放连接。
什么是sql注入问题呢?
JDBC编程时,sql语句肯定不能写死,也就是说,sql中的条件以及拿到哪些属性都需要要我们自己来控制,那么jdbc编程就可以分为两种方式:
sql注入就是第一种情况导致的,来看看是什么情况
在这里,我写一个方法来判断数据库中是否有这样的值?
数据库:
可以看到这里只有一行abc的记录,那么使用拼接的方式,看看我如何来sql注入
这里我模拟查询数据的过程,按照sql拼接的功能来说:main方法传入的如果是‘abc’,是数据库中有的,那么返回true,如果没有就返回false。
public class SQLInput {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//这里我去查询有没有def...这样的数据
System.out.println(execute("def' or 1=1 or '1'='1"));
}
public static boolean execute(String A) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获得连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC", "root", "123456");
//通过获得的连接创建Statement对象
String sql = "select * from test where A='"+A+"'" ;
//为了直观的看到原因,打印一下sql语句
System.out.println(sql);
Statement statement = connection.createStatement();
//通过创建的Statement对象执行sql语句
ResultSet resultSet = statement.executeQuery(sql);
if(resultSet.next()) {
return true;
}
return false;
}
}
我输入的是def’ or 1=1 or ‘1’='1
看看打印结果:
返回是true,看到打印的sql你明白了吗?
所以,推荐使用Preparestatement,实行预编译,在放入值的时候就进行判断,谨防sql注入。
到这里,基本的用法就已经讲完了,这里的用法需要按照我讲的去做。如果出现异常,那么可能是版本号,密码的问题。如果有问题解决不了,欢迎留言,我会第一时间解答。