下载链接:https://pan.baidu.com/s/1YFOImz0dCHtzIajSFq9xgg?pwd=boul
提取码:boul
1、在【External Libraries】下右键点击【JDK】,选择【Open Library Settings】。
1、新建一个类用来存放4大常量。
public class Config {
//驱动,8.0固定为该格式
public static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
//数据库地址,修改该数据库名称
public static final String DB_URL = "jdbc:mysql://localhost:3306/database_name?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
//用户名
public static final String USER = "user_name";
//密码
public static final String PASSWORD = "password";
}
2、主类中设置3个全局变量。
//3个全局变量,Connection连接数据库,创建一个Statement对象,用于向数据库发送SQL语句。
private static Connection connection;
//Statement用于执行静态SQL语句并返回其产生的结果的对象。
private static Statement statement;
//ResultSet用于存放Statement返回的结果。
private static ResultSet resultSet;
3、主类中连接数据库。
static {
//静态块连接数据库
try{
//加载驱动
Class.forName(Config.JDBC_DRIVER);
//创建链接
connection = DriverManager.getConnection(Config.DB_URL, Config.USER, Config.PASSWORD);
//访问数据库
statement = connection.createStatement();
}catch (Exception e){
e.printStackTrace();
System.out.println("数据库连接失败!");
}
}
4、Statement类。
executeQuery方法
executeUpdate方法
execute方法
5、资源释放。
public static void release(){
try{
if (connection != null)
connection.close();
if (statement != null)
statement.close();
if (resultSet != null)
resultSet.close();
}catch (Exception e){
e.printStackTrace();
}
}
1、在数据库中新建一个Tiobe编程语言排行表名为【tioberank】。
CREATE TABLE IF NOT EXISTS `tioberank`(
`id` INT UNSIGNED AUTO_INCREMENT,
`language` CHAR(20) NOT NULL DEFAULT '',
`rank` INT UNSIGNED NOT NULL,
`ratings` FLOAT NOT NULL,
`change` FLOAT NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、插入几个测试数据。
INSERT INTO `tioberank` VALUES
('1', 'Python', '1', '15.74', '4.07'),
('2', 'C', '2', '13.96', '2.13'),
('3', 'Java', '3', '11.72', '0.6');
1、数据表存在与否查询,返回TRUE或FALSE。
public static boolean tableIsExist(String table){
boolean result = false;
int colIndex = 1;
try{
resultSet = statement.executeQuery("SHOW TABLES");
while (resultSet.next()){
if (resultSet.getString(colIndex).equals(table)){
result = true;
break;
}
}
if (!result){
System.out.println("数据表不存在!");
}
}catch (Exception e){
e.printStackTrace();
}
return result;
}
2、查询表字段名,返回一个字符串列表。
public static List<String> descTable(String table){
List<String> list = new ArrayList<>();
int colIndex = 1;
try {
if (tableIsExist(table)){
resultSet = statement.executeQuery("DESC " + table);
while (resultSet.next()){
list.add(resultSet.getString(colIndex));
}
}
}catch (Exception e){
e.printStackTrace();
}
return list;
}
3、【查询】根据SQL语句查询数据内容,返回一个哈希表列表。
private static void dataQuery(String table, String sql, List<Map<String, Object>> list) throws SQLException {
Map<String, Object> map;
List<String> headers = descTable(table);
System.out.println("执行SQL语句:" + sql);
resultSet = statement.executeQuery(sql);
while (resultSet.next()){
map = new HashMap<>();
for(String header : headers){
map.put(header, resultSet.getObject(header));
}
list.add(map);
}
}
根据上面方法衍生:
3.1 查询所有数据内容
public static List<Map<String, Object>> selectTable(String table){
List<Map<String, Object>> list = new ArrayList<>();
try{
if (tableIsExist(table)){
//查询所有内容
String sql = "SELECT * FROM " + table;
dataQuery(table, sql, list);
}
}catch (Exception e){
e.printStackTrace();
}
return list;
}
3.2 根据具体的SQL语句查询数据内容
public static List<Map<String, Object>> selectTable(String table, String sql){
List<Map<String, Object>> list = new ArrayList<>();
try{
if (tableIsExist(table)){
//自定义SQL语句查询内容
dataQuery(table, sql, list);
}
}catch (Exception e){
e.printStackTrace();
}
return list;
}
或是根据不同的SQL语句自定义不同的接口函数,如根据字段名和数据进行模糊查询(这里只写了一个单条件,多条件可以参照下方删除数据的写法):
public static List<Map<String, Object>> selectTable(String table, String key, Object value){
List<Map<String, Object>> list = new ArrayList<>();
try{
if (tableIsExist(table)){
String sql = "SELECT * FROM " + table + " WHERE " + key + " LIKE '" + value + "'";
dataQuery(table, sql, list);
}
}catch (Exception e){
e.printStackTrace();
}
return list;
}
//调用
selectTable("tioberank", "language", "%a%");
4、【增加、删除、修改】定义一个执行executeUpdate的函数,使其根据是否有数据得到修改为依据返回TRUE或FALSE。
private static boolean dataUpdate(String sql) throws SQLException {
System.out.println("执行SQL语句:" + sql);
int executeResult = statement.executeUpdate(sql);
return executeResult > 0;
}
4.1 增加数据操作
public static String addTable(String table, String[] values){
String result = "";
try {
if (tableIsExist(table)){
StringBuilder stringBuilder = new StringBuilder();
//第一个为id自增量,用null表示使其自动增加
stringBuilder.append("INSERT INTO ").append(table).append(" VALUES(null, ");
String sql = "";
for (String value : values){
stringBuilder.append("'").append(value).append("', ");
}
//去除最后一个逗号
stringBuilder.delete(stringBuilder.length()-2, stringBuilder.length()-1);
stringBuilder.append(");");
sql = stringBuilder.toString();
if (dataUpdate(sql))
result = "添加数据成功!";
else
result = "添加数据失败!";
}
}catch (Exception e){
e.printStackTrace();
}
return result;
}
//调用
String[] data = new String[]{"C++", "4", "9.76", "2.63"};
System.out.println(addTable("tioberank", data));
4.2 删除数据操作。
删除数据后可能会出现自增ID序列混乱的问题,若想解决,需要先删除ID列再重新增加,相当于刷新序列刷新序列SQL语句参照:
ALTER TABLE TABLE_NAME DROP id;
ALTER TABLE TABLE_NAME ADD id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;
Java代码参照(这里多条件删除为【与】的关系,【或】的关系参照该方式可以很快写出):
private static String refreshDataID(String table){
//刷新数据ID序列
String sql;
String result;
try {
sql = "ALTER TABLE " + table + " DROP id";
statement.execute(sql);
sql = "ALTER TABLE " + table + " ADD id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST";
statement.execute(sql);
result = "刷新ID序列成功!";
}catch (Exception e){
e.printStackTrace();
result = "刷新ID序列失败!";
}
return result;
}
public static String deleteTable(String table, Map<String, String> conditions){
//删除数据
String result = "";
try {
if (tableIsExist(table)){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("DELETE FROM ").append(table).append(" WHERE ");
String sql = "";
conditions.forEach((key, value) -> {
stringBuilder.append(key).append("='").append(value).append("' AND ");
});
//去除最后一个&及空格
stringBuilder.delete(stringBuilder.length()-5, stringBuilder.length());
sql = stringBuilder.toString();
if (dataUpdate(sql)) {
result = "删除数据成功!";
System.out.println(refreshDataID(table));
}
else
result = "删除数据失败!";
}
}catch (Exception e){
e.printStackTrace();
}
return result;
}
//调用
HashMap<String, String> deleteConditions = new HashMap<>();
deleteConditions.put("id", "4");
System.out.println(deleteTable("tioberank", deleteConditions));
4.3 数据更新操作
public static String updateTable(String table, String conditionKey, String conditionValue, String aimKey, String aimValue){
//更新数据
String result = "";
try {
if (tableIsExist(table)){
String sql = "UPDATE " + table + " SET `" + aimKey + "`='" + aimValue + "' WHERE " + conditionKey + "='" + conditionValue + "'";
if (dataUpdate(sql)) {
result = "更新数据成功!";
}
else
result = "更新数据失败!";
}
}catch (Exception e){
e.printStackTrace();
}
return result;
}
//调用
System.out.println(updateTable("tioberank", "language", "Python", "rank", "2"));
以上这些接口函数本质上就是使用statement的executeQuery、executeUpdate和execute方法来执行SQL语句并返回执行结果,我们完全可以按照不同项目的不同需求去进行构建,减少徒手敲SQL语句的次数。
【项目码云地址】 https://gitee.com/boulete/MysqlJDBC.git