0
点赞
收藏
分享

微信扫一扫

javaJDBC的学习笔记

Xin_So 2022-02-25 阅读 63

文件流程图:


一、连接数据库

数据表:

 

db.properties配置文件:我连接的是Linux里面的数据库

username=root
password=123456
url=jdbc:mysql://172.16.6.25:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=false
driverClass=com.mysql.jdbc.Driver
JDBCUtils里面写的连接数据库:
public static Connection getConnection() throws Exception {
        Properties properties = new Properties();
        InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
        properties.load(is);

        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driverClass = properties.getProperty("driverClass");

        Class.forName(driverClass);
        Connection conn = DriverManager.getConnection(url, username, password);
        return conn;
    }
MysqlDAO中的测试:


二、 增加删除修改数据库信息:

代码在JDBCUtils,连接前面的定义好的函数

public static void closeResource(Connection conn, Statement ps) {
        try {
            ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


public static void update(String sql, Object... args) {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = JDBCUtils.getConnection();
            //预编译sql,返回PreparedStatement
            ps = conn.prepareStatement(sql);
            //填充占位符
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);//特别注意,小心出错
            }
            ps.execute();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(conn, ps);
        }
    }

修改结果:

删除结果:

插入测试结果:


三、 MySQL查询:

Customer类:

package com.Crunchy.util;

public class Customer {
    private int id;
    private String name;
    private Float money;

    public Customer() {
    }

    public Customer(int id, String name, Float money) {
        this.id = id;
        this.name = name;
        this.money = money;
    }

    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 Float getMoney() {
        return money;
    }

    public void setMoney(Float money) {
        this.money = money;
    }

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

 JDBCUtils:低级单表查询

//关闭查询连接
    public static void closeResource(Connection conn, Statement ps, ResultSet resultSet) {
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

//低级单表查询
    public static Customer selecta(String sql, Object... args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet resultSet = null;
        try {
            conn = JDBCUtils.getConnection();
            //预编译sql,返回PreparedStatement
            ps = conn.prepareStatement(sql);
            //执行sql语句
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
            }
            resultSet = ps.executeQuery();
            //获取结果集的元数据:ResultSetMetaData,
            ResultSetMetaData rsmd = resultSet.getMetaData();
            //通过ResultSetMetaData获取元数据的列数
            int columnCount = rsmd.getColumnCount();
            if (resultSet.next()) {//判断结果集下一条有没有数据有,指向下一条并且返回,如果没有弹出
                Customer cust = new Customer();
                //处理结果集一行数据中的每一列
                for (int i = 0; i < columnCount; i++) {
                    //获取列值
                    Object columnValue = resultSet.getObject(i + 1);
                    //获取每个列的列名
                    String columnName = rsmd.getColumnName(i + 1);
                    /*获取别名
                    * String columnLabel = rsmd.getColumnLabel(i+1);
                    * 针对于表的字段名于类的属性名不相同的情况可以使用getColumnLabel,如果
                    * sql没有给字段起别名,使用getColumnLabel获取的仍然是列名
                    * */
                    //通过反射,赋值给cust对象指定的columnName属性
                    Field field = Customer.class.getDeclaredField(columnName);
                    //允许访问私有属性
                    field.setAccessible(true);
                    //赋值
                    field.set(cust, columnValue);
                }
                //返回结果
                return cust;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭连接
            JDBCUtils.closeResource(conn, ps, resultSet);
        }
        //可能没有赋值成功,返回空
        return null;
    }

 在MysqlDAO调用测试:


四、高级单表查询:连接关闭在此处省略,与上一步低级单表相同
//高级单表查询,把Customer换为<T>,泛型,可以换结构表
    public static <T> T getInstance(Class<T> clazz,String sql, Object... args){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet resultSet = null;
        try {
            conn = JDBCUtils.getConnection();
            //预编译sql,返回PreparedStatement
            ps = conn.prepareStatement(sql);
            //执行sql语句
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
            }
            resultSet = ps.executeQuery();
            //获取结果集的元数据:ResultSetMetaData,
            ResultSetMetaData rsmd = resultSet.getMetaData();
            //通过ResultSetMetaData获取元数据的列数
            int columnCount = rsmd.getColumnCount();
            if (resultSet.next()) {//判断结果集下一条有没有数据有,指向下一条并且返回,如果没有弹出
                T t = clazz.newInstance();
                //处理结果集一行数据中的每一列
                for (int i = 0; i < columnCount; i++) {
                    //获取列值
                    Object columnValue = resultSet.getObject(i + 1);
                    //获取每个列的列名
                    String columnLabel = rsmd.getColumnLabel(i + 1);
                    /*获取别名
                     * String columnLabel = rsmd.getColumnLabel(i+1);
                     * 针对于表的字段名于类的属性名不相同的情况可以使用getColumnLabel,如果
                     * sql没有给字段起别名,使用getColumnLabel获取的仍然是列名
                     * */
                    //通过反射,赋值给cust对象指定的columnName属性
                    Field field = Customer.class.getDeclaredField(columnLabel);
                    //允许访问私有属性
                    field.setAccessible(true);
                    //赋值
                    field.set(t, columnValue);
                }
                //返回结果
                return t;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭连接
            JDBCUtils.closeResource(conn, ps, resultSet);
        }
        //可能没有赋值成功,返回空
        return null;
    }

  在MysqlDAO调用测试:

 高级多条数据查询:

//高级多表查询
    public static <T> List<T> getForList(Class<T> clazz,String sql,Object ...args){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet resultSet = null;
        try {
            conn = JDBCUtils.getConnection();
            //预编译sql,返回PreparedStatement
            ps = conn.prepareStatement(sql);
            //执行sql语句
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
            }
            resultSet = ps.executeQuery();
            //获取结果集的元数据:ResultSetMetaData,
            ResultSetMetaData rsmd = resultSet.getMetaData();
            //通过ResultSetMetaData获取元数据的列数
            int columnCount = rsmd.getColumnCount();
            //创建集合对象
            ArrayList<T> list = new ArrayList<T>();
            while (resultSet.next()) {//判断结果集下一条有没有数据有,指向下一条并且返回,如果没有弹出
                T t = clazz.newInstance();
                //处理结果集一行数据中的每一列,给T对象指定的属性赋值的过程
                for (int i = 0; i < columnCount; i++) {
                    //获取列值
                    Object columnValue = resultSet.getObject(i + 1);
                    //获取每个列的列名
                    String columnLabel = rsmd.getColumnLabel(i + 1);
                    /*获取别名
                     * String columnLabel = rsmd.getColumnLabel(i+1);
                     * 针对于表的字段名于类的属性名不相同的情况可以使用getColumnLabel,如果
                     * sql没有给字段起别名,使用getColumnLabel获取的仍然是列名
                     * */
                    //通过反射,赋值给cust对象指定的columnName属性
                    Field field = Customer.class.getDeclaredField(columnLabel);
                    //允许访问私有属性
                    field.setAccessible(true);
                    //赋值
                    field.set(t, columnValue);
                }
                list.add(t);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭连接
            JDBCUtils.closeResource(conn, ps, resultSet);
        }
        //可能没有赋值成功,返回空
        return null;
    }

测试结果:


五、 最后一个简单的登录实现

public void testLogin(){
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入用户名:");
        String user = scanner.nextLine();
        System.out.print("请输入密码:");
        String password = scanner.nextLine();
        String sql = "select id,name from account where id = ? and name = ?";
        Object returnUser = JDBCUtils.getInstance(Customer.class,sql,user,password);
        if (returnUser != null){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }
    }

在IDEA中我的Scanner是不能使用的,一直转圈,解决方法:进入这个界面在后边加入:

-Deditable.java.test.console=true

成功解决

我的JDBC学习地址:尚硅谷JDBC核心技术视频教程(康师傅带你一站式搞定jdbc)_哔哩哔哩_bilibili

 

举报

相关推荐

JAVAJDBC

javaJDBC的一些入门笔记

idea的学习笔记

Swagger的学习笔记

Redis的学习笔记

MapReduce的学习笔记

Zookeeper的学习笔记

Thymeleaf的学习笔记

0 条评论