Mysql的JDBC增删改查

前言

可以自己建个表,创建对应的实体类。将下面测试类里的SQL语句换了就行。
感觉麻烦的话,就按下面的步骤来。提供了实体类和表。

首先建立一个maven工程,按照下面步骤操作。

1、创建lib文件夹

将mysql-connector-java-·····.jar包放在lib文件夹下面
jar包下载地址 参考这位博主的 https://blog.csdn.net/kt1776133839/article/details/124539192
并右键lib选择Add as Library导入驱动包

在这里插入图片描述

2、建立包和类

在这里插入图片描述

ConnectionConfig类
作为数据库的连接

package com.hmw.demo.config;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class ConnectionConfig {

    // mysql地址
    public static final String URL="jdbc:mysql://localhost:3306/fo_service?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT";
    // 驱动地址
    public static final String DRIVER="com.mysql.jdbc.Driver";
    // Mysql用户名
    public static final String USERNAME="root";
    // 密码
    public static final String PASSWORD="root";
    // 加载驱动信息到程序中
    static{
        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    // 取得Connection连接对象,
    public static Connection getConnection() throws Exception{
        Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
        return conn;
    }

    // 取得Connection连接对象,
    public static void close(Connection conn, Statement pst) throws Exception{
       if(conn!=null){
           conn.close();
       }
       if(pst!=null){
           pst.close();
       }
    }
}


SimpleUtil类

package com.hmw.demo.config;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
public class SimpleUtil {


    public static List<Map<String, Object>> queryTableInfo(String sql) throws Exception {
        Connection connection = null;
        Statement statement = null;
        try {
            connection = ConnectionConfig.getConnection();
            statement = connection.createStatement();
            ResultSet rs = statement.executeQuery(sql);
            List<Map<String, Object>> list = new ArrayList<>();
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();
            while (rs.next()) {
                Map<String, Object> map = new HashMap<>();
                for (int i = 1; i <= columnCount; i++) {
                    String key = metaData.getColumnLabel(i);
                    Object value = rs.getObject(i);
                    map.put(key, value);
                }
                list.add(map);
            }
            return list;
        } catch (Exception e) {
            log.info(e.getMessage(), e);
            throw new Exception("查询数据异常");
        } finally {
            try {
                ConnectionConfig.close(connection, statement);
            } catch (Exception e) {
                log.info(e.getMessage(), e);
            }

        }
    }

    /**
     * 返回实体数据
     * @param clazz
     * @param tempList
     * @param <T>
     * @return
     */
    public static <T> List<T> handleObject(Class<T> clazz, List<Map<String, Object>> tempList) throws Exception {
        List<T> resList = new ArrayList<>();
        try
        {
            //加载数据到对象
            if (tempList.size() > 0) {
                for (Map<String, Object> map : tempList) {
                    //解析对象
                    T bean = clazz.newInstance();
                    for (Map.Entry<String, Object> entry : map.entrySet()) {
                        String propertyName = entry.getKey();
                        Object value = entry.getValue();
                        // 这里propertyName和实体的属性名称必须一模一样
                        Field field = clazz.getDeclaredField(propertyName);
                        // 设置对象的访问权限,保证对private的正常访问
                        field.setAccessible(true);
                        String str = field.getName();
                        String s = str.substring(0, 1).toUpperCase() + str.substring(1);
                        Method method = clazz.getMethod("set" + s, field.getType());
                        method.invoke(bean, value);
                    }
                    resList.add(bean);
                }
            }
        }
        catch (Exception e) {
            log.info(e.getMessage(), e);
            throw new Exception("整理表数据,发生异常!!!");
        }
        return resList;
    }


}

JDBCTest测试类
JDBC增删改查

package com.hmw.demo.controller;


import com.alibaba.fastjson.JSONObject;
import com.hmw.demo.config.ConnectionConfig;
import com.hmw.demo.config.SimpleUtil;
import com.hmw.demo.model.TSdataTag;
import lombok.extern.slf4j.Slf4j;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Timestamp;
import java.util.*;

@Slf4j
public class JDBCTest {

    public static void main(String[] args)  throws Exception{
        log.info("=====新增数据条数{}=====", addData());
        log.info("=====修改数据条数{}=====", updateData());
        log.info("=====删除数据条数{}=====", deleteData());
        log.info("=====开始批量新增数据=====");
        addBatchData();
        log.info("=====批量新增数据结束=====");
        log.info("=====批量查询数据=====");
        queryDataBatch();
    }

    // 新增数据
    public static  int addData() throws Exception{
        Connection conn = null;
        PreparedStatement pst=null;

        try {
            //获得连接对象
            conn = ConnectionConfig.getConnection();
            //准备sql语句
            String sql = "insert into t_sdata_tag (id, tag_name, app_id, create_member, create_time, last_modifier, last_modify_time)"
                    + " values (?, ?, ?, ?, ?, ?, ?)";
            //取得发送sql语句的对象
            pst = conn.prepareStatement(sql);
            pst.setString(1, UUID.randomUUID().toString());
            pst.setString(2, "新增");
            pst.setString(3, "China");
            pst.setString(4, "99999");
            pst.setTimestamp(5, new Timestamp(new Date().getTime()));
            pst.setString(6, null);
            pst.setTimestamp(7,null);
            //发送sql语句指令
            return pst.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            //关闭资源
            ConnectionConfig.close(conn,pst);
        }
        return 0;
    }

    // 修改数据
    public static  int updateData() throws Exception{
        Connection conn = null;
        PreparedStatement pst=null;

        try {
            //获得连接对象
            conn = ConnectionConfig.getConnection();
            //准备sql语句
            String sql = "Update t_sdata_tag SET  tag_name= '新增修改' " + " WHERE app_id='China' ";
            //取得发送sql语句的对象
            pst = conn.prepareStatement(sql);
            //发送sql语句指令
            return pst.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            //关闭资源
            ConnectionConfig.close(conn,pst);
        }
        return 0;
    }

    // 删除数据
    public static  int deleteData() throws Exception{
        Connection conn = null;
        PreparedStatement pst=null;

        try {
            //获得连接对象
            conn = ConnectionConfig.getConnection();
            //准备sql语句
            String sql = "DELETE FROM t_sdata_tag WHERE app_id= 'China'";
            //取得发送sql语句的对象
            pst = conn.prepareStatement(sql);
            //发送sql语句指令
            return pst.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            //关闭资源
            ConnectionConfig.close(conn,pst);
        }
        return 0;
    }


    // 批量查询数据
    public static void queryDataBatch()  throws Exception
    {
        // 准备数据
        List<String> dataList = new ArrayList();
        dataList.add("999");
        dataList.add("888");

        StringBuilder query = new StringBuilder();
        for (String item : dataList) {
            query.append("'").append(item).append("',");
        }
        String sql = "select * from t_sdata_tag"
                + " where create_member in (" + query.substring(0,query.length()-1) + ")";

        // 查询表数据 key 为字段,value为值
        List<Map<String, Object>> mapList = SimpleUtil.queryTableInfo(sql);
        // 转换成对象集合
        List<TSdataTag> tagList = SimpleUtil.handleObject(TSdataTag.class, mapList);
        log.info("实体JSON数据:" + JSONObject.toJSONString(tagList));
    }

    // 批量新增数据
    public static void addBatchData() throws Exception {

        // 准备数据
        List<TSdataTag> dataList = new ArrayList();
        for (int i = 0; i < 11; i++) {
            TSdataTag tag = new TSdataTag();
            tag.setId(UUID.randomUUID().toString());
            tag.setTag_name("测试"+ i);
            dataList.add(tag);
        }
        Connection conn = null;
        PreparedStatement pst=null;

        try {
            //获得连接对象
            conn = ConnectionConfig.getConnection();
            // 关闭自动提交
            conn.setAutoCommit(false);

            //准备sql语句
            String sql = "insert into t_sdata_tag (id, tag_name, app_id, create_member, create_time, " +
                    "last_modifier, last_modify_time) values (?, ?, ?, ?, ?, ?, ?)";
            pst = conn.prepareStatement(sql);
            for (int i = 0; i < dataList.size(); i++) {
                pst.setString(1,dataList.get(i).getId());
                pst.setString(2, dataList.get(i).getTag_name());
                pst.setString(3, "9999");
                pst.setString(4, null);
                pst.setTimestamp(5, new Timestamp(new Date().getTime()));
                pst.setString(6, null);
                pst.setTimestamp(7,null);
                // 将sql语句打包到一个容器中
                pst.addBatch();
                if(i % 5 == 0)
                {
                    // 将容器中的sql语句提交
                    pst.executeBatch();
                    // 清空容器,为下一次打包做准备
                    pst.clearBatch();
                }
            }
            // 为防止有sql语句漏提交【如i结束时%5!=0的情况】,需再次提交sql语句
            pst.executeBatch();//将容器中的sql语句提交
            pst.clearBatch();//清空容器
            // 预处理完成后统一提交  保证事务一致性。尤其是当还有其他的SQL操作时,比如先删后增
            conn.commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            //关闭资源
            ConnectionConfig.close(conn,pst);
        }
    }

}


TSdataTag实体类

package com.hmw.demo.model;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

@Data
public class TSdataTag implements Serializable {
    private String id;

    private String tag_name;

    private String app_id;

    private String create_member;

    private Date create_time;

    private String last_modifier;

    private Date last_modify_time;

    private static final long serialVersionUID = 1L;

}

3、建立数据库表

DROP TABLE IF EXISTS `t_sdata_tag`;
CREATE TABLE `t_sdata_tag`  (
  `id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `tag_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标签名',
  `app_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '应用id',
  `create_member` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `last_modifier` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人',
  `last_modify_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '按钮标签表' ROW_FORMAT = Dynamic;

4、运行测试类中的main方法

注意:事务的一致性尤其重要。可看批量新增操作 conn.commit()的位置。

posted @ 2022-11-09 17:22  云村的王子  阅读(9)  评论(0编辑  收藏  举报  来源