JDBC

概念

Java DataBase Connectivity Java 数据库连接, Java语言操作数据库。

JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

用途

简单地说,JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果

对象

  1. DriverManager:驱动管理对象
  • 注册驱动:告诉程序该使用哪一个数据库驱动jar
  • 获取数据库连接:
  1. Connection:数据库连接对象
  • 获取执行sql 的对象//不安全 效率不高
  • 管理事务:
    开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
    提交事务:commit()
    回滚事务:rollback()
  1. Statement:执行sql的对象
  • 执行sql
  1. ResultSet:结果集对象,封装查询结果
  2. PreparedStatement:执行sql的对象
  • SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题输入用户随便,输入密码:a’ or ‘a’ = 'a
  • sql:select * from user where username = ‘fhdsjkf’ and password = ‘a’ or ‘a’ = ‘a’
  • 解决sql注入问题:使用PreparedStatement对象来解决
  • 预编译的SQL:参数使用?作为占位符

怎么使用jdbc

典故:“贾琏欲执事”----》加载、连接、语句、执行、关闭

贾 -->jar包(导入jar)
琏 -->连接对象
欲 -->sql 语句
执 -->curd(增删改查)
事 -->关闭连接 释放资源

使用jdbc进行curd

1.添加jar

在这里插入图片描述

2.使用(注意:jdbc中操作用到的对象 都是在import java.sql.Connection;)
public class Test {
    //获取连接对象
    static Connection connection;

    static {
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            try {
                //获取连接对象
                //连接数据库  账号  密码
                connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/myschool", "root", "root");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        //add_grade("SSM");
        //delete_gradeid(10);
        //update_gradename("SSH1");
        List<Grade> gradeList = selectAllGrade();
        System.out.println("班级编号\t\t班级名称");
        for (Grade grade:gradeList){
            System.out.println(grade.getGradeid()+"\t\t\t"+grade.getGradename());
        }
    }

    /**
     * 添加数据
     *
     * @param gradename 添加的名字
     * @return 返回添加几条数据
     */
    public static int add_grade(String gradename) {
        int num = 0;
        PreparedStatement ps = null;
        String sql = "INSERT INTO `grade`(`gradeName`) VALUES (?)";
        try {
            ps = connection.prepareStatement(sql);
            ps.setObject(1, gradename);
            num = ps.executeUpdate();
            if (num > 0) {
                System.out.println("添加成功。");
            } else {
                System.out.println("添加失败。");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return num;
    }

    /**
     * 删除数据
     *
     * @param gradeid 删除数据的ID
     * @return 删除的行数
     */
    public static int delete_gradeid(int gradeid) {
        int num = 0;
        PreparedStatement ps = null;
        String sql = "delete from `grade` where `gradeid`=?";
        try {
            ps = connection.prepareStatement(sql);
            ps.setObject(1, gradeid);
            num = ps.executeUpdate();
            if (num > 0) {
                System.out.println("删除成功。");
            } else {
                System.out.println("删除失败。");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return num;
    }

    /**
     * 修改数据
     *
     * @param gradename 修改为
     * @return 返回修改了几条数据
     */
    public static int update_gradename(String gradename) {
        int num = 0;
        PreparedStatement ps = null;
        String sql = "update `grade` set `gradename`=? where gradename='SSH'";
        try {
            ps = connection.prepareStatement(sql);
            ps.setObject(1, gradename);
            num = ps.executeUpdate();
            if (num > 0) {
                System.out.println("修改成功。");
            } else {
                System.out.println("修改失败。");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return num;
    }

    /**
     * 查询数据
     * @return 集合
     */
    public static List<Grade> selectAllGrade(){
        List<Grade> grades = new ArrayList<>();
        String sql = "select * from `grade`";
        PreparedStatement ps = null;
        ResultSet rSet = null;   //用来接收查询数据的结果集
        try {
            ps = connection.prepareStatement(sql);
            rSet = ps.executeQuery();
            while (rSet.next()){
                Grade grade = new Grade();
                grade.setGradeid(rSet.getInt(1));
                grade.setGradename(rSet.getString("gradename"));
                grades.add(grade);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return grades;
    }
}

注意:在使用查询操作是需要创建相关的实体类 如Grade实体类:

public class Grade {
    private  int gradeid;
    private String gradename;

    public int getGradeid() {
        return gradeid;
    }

    public void setGradeid(int gradeid) {
        this.gradeid = gradeid;
    }

    public String getGradename() {
        return gradename;
    }

    public void setGradename(String gradename) {
        this.gradename = gradename;
    }

    @Override
    public String toString() {
        return "Grade{" +
                "gradeid=" + gradeid +
                ", gradename='" + gradename + '\'' +
                '}';
    }
}

创建JDBC工具类

  • 目的:简化书写
  • 分析:
  1. 注册驱动也抽取
  2. 抽取一个方法获取连接对象
    需求:不想传递参数(麻烦),还得保证工具类的通用性。
    解决:配置文件 jdbc.properties
    driver=
    url=
    user=
    password=
    例如:
jdbc_driver = com.mysql.jdbc.Driver
jdbc_url = jdbc:mysql://127.0.0.1:3306/myschool
jdbc_username = root
jdbc_password = root
  1. 抽取一个方法释放资源

代码实现:

public class JDBCUtils {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    static {

        //1. 创建Properties集合类。
        Properties properties = new Properties();
        //获取src路径下的文件的方式--->ClassLoader 类加载器
        ClassLoader classLoader = JDBCUtils.class.getClassLoader();
        URL rul = classLoader.getResource("jdbc.properties");
        //得到文件地址
        String path = rul.getPath();
        //打印jdbc.properties的路径
        // System.out.println(path);
        try {
            //2. 加载文件
            properties.load(new FileReader(path));
        } catch (IOException e) {
            e.printStackTrace();
        }
        //3. 获取数据,赋值
        driver = properties.getProperty("jdbc_driver");
        url = properties.getProperty("jdbc_url");
        username = properties.getProperty("jdbc_username");
        password = properties.getProperty("jdbc_password");
        // 4.注册驱动
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

    /**
     * 获取连接
     *
     * @return 连接对象
     */
    public static Connection getConnection() {
        Connection connection = null;
        try {
                connection = DriverManager.getConnection(url, username, password);
            }  catch (SQLException e) {
                e.printStackTrace();
            }
        return connection;
    }

    /**
     * 关闭资源
     *
     * @param rs   集合集
     * @param ps   执行sql的对象
     * @param conn 数据库连接对象
     */
    public static void close(ResultSet rs, PreparedStatement ps, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值