栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JDBC:JAVA连接Mysql实现增删改查

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JDBC:JAVA连接Mysql实现增删改查

总有特别赶的时候,小高叫你如何速通JAVA连接数据库Mysql实现增删改查。CV战士
一、前置准备工作

1、 安装IDEA,配置JAVA环境
2、 安装Mysql,配置Mysql环境变量
3、 安装SQLyog,测试连接成功
注解:IDEA可以私信我要链接;Mysql建议安装5.7或者8.0.26(免费);SQLyog可以私信我要链接

二、在IDEA上导入mysql对应版本的驱动

1、概述:在项目下new 一个名为lib的Directory文件夹,并导入对应Mysql版本型号的Mysql的jar包。
实操:①jar包下载。官网下载地址:https://dev.mysql.com/downloads/connector/j/
②将第一张图选中部分ctrl CV到第二张图片
③将外部jar包添加到IntelliJ IDEA项目。右键lib --> add as library --> Module Library --> OK

——————————————————————————————————

三、代码参上! 按照截图创建项目、包、类、配置文件

jdbc.properties配置文件
user=root
password=000000
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.cj.jdbc.Driver

注解:
① 注意不要带空格
② 密码记得用自己的,我自己的是000000

JDBCUtils类
package com.xiaogao.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

//数据库的连接与关闭类
public class JDBCUtils {
    //执行测试是否连接成功与关闭成功
    public static void main(String[] args) {
        getConnection();
        closeResource(null,null,null);
    }
//获取数据库的连接方法
    
    //获取数据库的连接方法
    public static Connection getConnection() {
        Connection conn = null;
        try {
//1、读取配置文件中的四个基本信息

            //getSystemClassLoader()方法用于查找要委派的系统类加载器,这将是ClassLoader新实例的默认委派父级
            //Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,
            //    以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
            //这个具体我也看不懂,如果感兴趣自己去查吧。     0.0
            //本人理解,通过调用ClassLoader类的具体方法实现调用配置文件为is对象的效果。

            //Properties继承了Hashtable类,以Map的形式进行放置值,put(key,value)和get(key),文本注释信息可以用”#”来注释。
            //	Properties类表示了一个持久的属性集。Properties可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
            //	Properties文件内容的格式是:键=值 形式,Key值不能重复。
            Properties pros = new Properties();
            //方式一:调用load()方法,加载配置文件。
            //InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
            //pros.load(is);
            //方式二:load(InputStream) 加载配置文件,InputStream流的形式
            pros.load(ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties"));

            //getProperty(String):String 获取配置文件属性
            //getProperty(String key):用指定的键在此属性列表中搜索属性。也就是通过参数key,得到key所对应的value。
            String user = pros.getProperty("user");
            String password = pros.getProperty("password");
            String url = pros.getProperty("url");
            String driverClass = pros.getProperty("driverClass");
//2、加载驱动
            //Class.forName:返回与给定的字符串名称相关联类或接口的Class对象。
            Class.forName(driverClass);
//3、获取连接
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("好耶!");
            System.out.println(conn);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        return conn;
    }
//数据库的关闭资源方法
    public static void closeResource(Connection conn,Statement ps,ResultSet rs){
        try {
            if (conn != null)
                conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        try {
            if (ps != null)
            ps.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        try {
            if (rs != null)
                rs.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        System.out.println("HH");
    }


}
PreparedStatementTest类
package com.xiaogao.util;

import com.mysql.cj.x.protobuf.MysqlxCrud;

import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class PreparedStatementTest {
    //通用增删改的方法  --增删改不同的表  --增删改不同的操作
    public static void testOthers(String sql,Object...args) {
        Connection conn = null;
        PreparedStatement ps = null;

        try {
//1、获取数据库的连接
            conn = JDBCUtils.getConnection();

//2、预编译sql语句,返回PrepareStatement的实例
            //Connection接口的实例调用了preareStatement(sql)的方法,返回了PrepareStatement接口的实例ps
            ps = conn.prepareStatement(sql);
//3、填充占位符
            for (int i = 0; i < args.length; i++) {
                //这里占位符的第一个对应的是args数组的第0个,因此i+1 和 i 的关系注意不要写错
                ps.setObject(i+1,args[i]);
            }
//4、执行
            ps.execute();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
//5、关闭资源
            JDBCUtils.closeResource(conn,ps,null);
        }
    }



    //通用的查找方法。  针对于不同表的通用查询操作,可以返回表中的多条数据
//#############################################################################################################
    //???下述中的泛型方法和泛型类和泛型接口并不是明白???
// #############################################################################################################
    public static  List testSelect(Class clazz, String sql, Object...args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i+1,args[i]);
            }
            //返回执行查询语句后得到的ResultSet结果集,注意:该结果集永远不能为null。
            rs = ps.executeQuery();
            //获取结果集的元数据
//#############################################################################################################
            //??? 获取什么元数据,不太清楚???
// #############################################################################################################
            ResultSetMetaData rsmd = rs.getMetaData();
            //通过ResultSetMetaData获取结果集中的列数
            int columnCount = rsmd.getColumnCount();
            //创建集合对象
            ArrayList list = new ArrayList();
//#############################################################################################################
            //???   next???迭代器???  ???
// #############################################################################################################
            while (rs.next()){
                T t = clazz.newInstance();
                //处理一行数据中的每一个列,给t对象指定的属性赋值
                for (int i = 0; i < columnCount; i++) {
                    Object columnValue = rs.getObject(i + 1);
                    //获取每个列的列名
                    //columnLabel可以获取别名
                    String columnLabel = rsmd.getColumnLabel(i + 1);

                    //给t对象指定的某个属性,赋值为columnValue,通过反射来实现
                    Field field = clazz.getDeclaredField(columnLabel);
                    //防止属性设置为private
                    field.setAccessible(true);
                    field.set(t,columnValue);
                }
                list.add(t);
            }
            return list;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(conn,ps,rs);
        }
        return null;
    }

    //测试
    public static void main(String[] args) {
        //修改操作
//        String sql = "update `order` set order_name = ? where order_id = ?";
//        testOthers(sql,"BB",2);
        //增加操作
//        String sql = "insert into `order` values(?,?,?)";
//        testOthers(sql,5,"HH","2002-11-27");
        //删除操作
//        String sql = "delete from `order` where order_name=?";
//        testOthers(sql,"HH");
        //查找操作
//#############################################################################################################
        //??? 这里的通用查询操作可不可以不用在java中创建表直接使用呢???
// #############################################################################################################
        String sql = "select id,name,email from customers where id < ?";
        List list = testSelect(Customer.class, sql, 12);
        list.forEach(System.out::println);

    }

}
Customer

这个类是需要跟自己数据库的表对应的,可以自行更改,如果不会更改但又想傻瓜式复制的话,可以在数据库中创建该类。我先将数据库中的表结构与表内容截图如下,可以自行创建。

package com.xiaogao.util;

import java.util.Date;

public class Customer {
    private int id;
    private String name;
    private String email;
    private Date birth;

    public Customer() {
    }

    public Customer(int id, String name, String email, Date birth) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.birth = birth;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", email='" + email + ''' +
                ", birth=" + birth +
                '}';
    }
}

这个类也可以根据自己的需求自己创建,该类的内容包含如下:
----该类包含了本表的各列名称作为属性
----空参构造器和全餐构造器Constructor
----所有参数的Getter and Setter方法
----重写了toString()方法
在IDEA中使用快捷键alt+insert即可

四、测试 在JDBCUtils类中执行main方法,输出结果如下即为连接成功。

在PreparedStatementTest类的main方法中执行结果如下即为执行成功

最后,希望对大家有些帮助,如有错误敬请指正。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027093.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号