目录
1 JDBC简介
2 使用 JDBC 连接数据库
2.1 使用流程
3 详细操作
3.1 导入 jar 包
4 通过 java 语言操作数据库
4.1 连接 Mysql 数据库
4.2 增、删、改、查操作
5 部分问题
5.1 数据库中文乱码问题
5.2 时区问题
5.3 数据库中存在空用户名情况
1 JDBC简介
JDBC:Java Database Connectivity 是一个独立于特定数据库管理系统,通用的 SQL 数据库存取和操作的公共接口,定义了一组标准,为访问不同的数据库提供了统一的途径。
JDBC 支持多种数据库,连通 Java 程序和数据库
2 使用 JDBC 连接数据库
2.1 使用流程
1、加载驱动,也就是数据库厂商提供的 jar 包,Java 程序和数据库的桥梁
2、创建 Connection 对象,连接 Mysql 数据库
3、创建 Statement 对象,由 Connection 产生,执行 SQL 语句
4、创建 ResultSet 对象,用来保存 Statement 执行后所产生的结果,将数据库记录映射成 Java 对象
3 详细操作
3.1 导入 jar 包
在项目中创建文件夹 libs (文件夹名字可以随意,并且也不一定需要创建文件夹,只是习惯而且比较规范),将 jar 包复制到文件夹中
然后右键 jar 包,选择 ”添加为库“。
或者选择 ”文件“ -> ”项目结构“
选择 ”库“,点击 ”+“ 号,选择 ”java“,然后导入刚刚复制到项目的 jar 包
然后点击确定即可。
4 通过 java 语言操作数据库
4.1 连接 Mysql 数据库
具体代码如下:
其中:serverTimezone=GMT%2B8 是用来消除时差。characterEncoding=utf8 是用来修改 java 程序与数据库数据连接时候的编码格式。
package com.mingfa.util;
import java.sql.*;
public class JDBCUtil {
/**
* 创建连接
* return 连接实例
*/
public static Connection getConnection(){
//加载驱动
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//创建连接
String url = "jdbc:mysql://localhost:3306/test1?serverTimezone=GMT%2B8&characterEncoding=utf8";
String user = "root";
String pwd = "000914";
connection = DriverManager.getConnection(url, user, pwd);
} catch (Exception e){
e.printStackTrace();
}
return connection;
}
/**
* 释放资源
*/
public static void release(Connection connection,Statement statement,ResultSet resultSet){
try {
if(connection != null) connection.close();
if(statement != null) statement.close();
if(resultSet != null) resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
4.2 增、删、改、查操作
package com.mingfa.test;
import com.mingfa.entity.Account;
import com.mingfa.util.JDBCUtil;
import java.sql.*;
public class Test {
public static void main(String[] args) {
delete(123);//删除
update(123, "JDBC");//修改
add("MySQL");//增加
query();//查询
}
//删除
public static void delete(Integer id){
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
connection = JDBCUtil.getConnection();//得到数据库的连接
//定义SQL语句
String sql = "delete from account where id = "+id;
//执行SQL
statement = connection.createStatement();
int i = statement.executeUpdate(sql);//受影响行数
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
} finally {
//释放资源
JDBCUtil.release(connection, statement, resultSet);
}
}
//修改
public static void update(Integer id,String name){
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
connection = JDBCUtil.getConnection();//得到数据库的连接
//定义SQL语句
String sql = "update account set name = '"+ name +"' where id = "+id;
//执行SQL
statement = connection.createStatement();
int i = statement.executeUpdate(sql);//受影响行数
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
} finally {
//释放资源
JDBCUtil.release(connection, statement, resultSet);
}
}
//添加
public static void add(String name){
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
connection = JDBCUtil.getConnection();//得到数据库的连接
//定义SQL语句
String sql = "insert into account(name) values ('"+ name +"')";
//执行SQL
statement = connection.createStatement();
int i = statement.executeUpdate(sql);//受影响行数
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
} finally {
//释放资源
JDBCUtil.release(connection, statement, resultSet);
}
}
//查询
public static void query(){
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
connection = JDBCUtil.getConnection();//得到数据库的连接
//定义SQL语句
String sql = "select * from account;";
//执行SQL
statement = connection.createStatement();
resultSet = statement.executeQuery(sql);
//遍历集合
while (resultSet.next()) {
int anInt = resultSet.getInt("id");//这里的信息需要与数据库中对应列的信息一致,包括数据类型,列名。例如 int 类型,列名为 id。
String string = resultSet.getString("name");//这里的信息需要与数据库中对应列的信息一致,包括数据类型,列名。例如 varchar 类型,列名为 name。
Account account = new Account(anInt, string);
System.out.println(account);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//释放资源
JDBCUtil.release(connection, statement, resultSet);
}
}
}
利用 PreparedStatement 进行数据库语言的建立,可以提高程序与数据库交互时候的安全性,防止发生 sql 注入
eq:数据库的查询操作,其他操作是类似的,读者可以自己模仿
public static void login(String name,String pwd){
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
connection = JDBCUtil.getConnection();
//定义SQL语句
String sql = "select * from user where name = ? and pwd = ?";
//执行SQL
statement = connection.prepareStatement(sql);
//其中 1 代表 上述 sql 语句的第一个 ? ,同理,2代表第二个
statement.setString(1, name);//name 为我们输入的参数,代表我们想要找到的数据
statement.setString(2, pwd);//pwd 同上
resultSet = statement.executeQuery();
if (resultSet.next()) System.out.println("登录成功");
else System.out.println("登录失败");
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.release(connection, statement, resultSet);
}
}
5 部分问题
5.1 数据库中文乱码问题
报错提示为:报错Incorrect string value: ‘\xE5\xAD\x99\xE4\xBD\xB3...‘ for column ‘name‘ at row 1
或者数据库中中文显示 ??
原因可能是:
1、java 连接数据库的时候连接方式的编码格式问题。
解决方法:在url中加入 characterEncoding=utf8 即可。
eq:"jdbc:mysql://localhost:3306/test1?characterEncoding=utf8"。
2、在创建数据库或者数据表的时候选择了默认的编码格式,没有设置utf8。
解决方法:
若数据表还没有创建,则创建的时候加上 default charset = utf8;
eq:
若数据库还没有创建,则创建的时候也同样加上 default charset = utf8; 即可。
若已经创建,则通过如下代码进行修改编码格式:
alter database test character set utf8;
alter table account2 character set utf8;
alter table account2 change name name varchar(10) character set utf8;
其中 test 为数据库名、account2 为数据表名、name 为数据表中的列名。
5.2 时区问题
报错提示为:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized
解决方法:在url中加入 serverTimezone=GMT%2B8
eq:"jdbc:mysql://localhost:3306/test1?serverTimezone=GMT%2B8"
5.3 数据库中存在空用户名情况
使用错误的密码,或者不适用账号密码也同样可以登录数据库或者连接数据库。
解决方法:
1、进入 mysql 的 bin 目录,在搜索框中输入 cmd 。或者通过 cmd 的 cd 指令跳转到 mysql 的 bin 目录也可以。
2、登录 mysql
3、输入 select * from mysql.user where user=' '; 进行查询,查看当前的数据
4、删除空用户名:use mysql; delete from user where user = ' ';
5、重载权限表 flush privileges;
6、重启服务 service mysqld restart