zoukankan      html  css  js  c++  java
  • JDBC的介绍

    JDBC详解

    1、JDBC是什么?

    JDBC(JAVA DataBase Connection)即JAVA数据库连接技术,JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据。 
    JDBC库中所包含的API通常与数据库使用于:

    • 连接到数据库
    • 创建SQL语句
    • 在数据库中执行SQL查询
    • 查看和修改数据库中的数据记录

    2、数据库驱动与常用接口

    JDBC API使用数据库驱动连接操作数据库,其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。 
    我使用的是MySql数据库,所以使用MySql提供的数据库驱动包mysql-connector-java-5.1.40-bin.jar。 
    驱动包一般会提供很多操作数据库的接口,常用的有:

    • Driver接口:在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法,MySql驱动装载方法为:Class.forName(“com.mysql.jdbc.Driver”);
    • Connection接口:Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法可以获取相应的数据库连接。MySql数据库连接获取方法为:Connection conn = DriverManager.getConnection(“jdbc:mysql://host:port/database”, “user”, “password”)。该接口包含了几个常用的方法: 
      1、createStatement():创建向数据库发送sql语句的statement对象; 
      2、preparedStatement(sql) :创建向数据库发送预编译sql的PreparedSatement对象; 
      3、setAutoCommit(boolean):设置数据库事务是否自动提交; 
      4、commit():提交事务; 
      5、rollback():事务回滚。
    • Statement接口:用于执行静态SQL语句并返回它所生成结果的对象。一般有三种Statement对象: 
      1、Statement:由createStatement创建,用于发送简单的SQL语句(不带参数); 
      2、PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement; 
      3、CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。 
      以下是几个常用的Statement方法: 
      1、execute(String sql):运行语句,返回是否有结果集; 
      2、executeQuery(String sql):运行select语句,返回ResultSet结果集; 
      3、executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数; 
      4、addBatch(String sql) :把多条sql语句放到一个批处理中; 
      5、executeBatch():向数据库发送一批sql语句执行。
    • ResultSet接口:ResultSet提供检索不同类型字段的方法,常用的有: 
      1、getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象; 
      2、getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象; 
      3、getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据; 
      4、getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据; 
      5、getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。 
      相比于以上方法,ResultSet接口提供了更常用的对于结果集的处理方法: 
      1、next():移动到下一行; 
      2、previous():移动到前一行; 
      3、absolute(int row):移动到指定行; 
      4、beforeFirst():移动resultSet的最前面; 
      5、afterLast() :移动到resultSet的最后面。

    3、JDBC使用步骤

    JDBC标准流程为:加载JDBC驱动程序→建立数据库连接Connection→创建执行SQL的语句Statement→处理执行结果ResultSet→释放资源,其中释放资源顺序为:ResultSet→Statement→Connection。 
    以下是我的一个JDBC小程序,作为一个基本例子: 
    首先创建要是用的数据库表:

    create database db_test;
    use db_test;
    create table person(
        id int primary key,
        name varchar(20),
        job varchar(20)
    );
    
    insert into person values(1001,'zhangsan','teacher');

    创建对应的java项目并将MySql添加到classpath,我这里因为使用了spring-boot,所以很方便不用去手动添加了。创建Person类与对应的测试类,可以写个main方法方便测试:

    public class Person {
        private Integer id;
        private String name;
        private String teacher;
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public void setTeacher(String teacher) {
            this.teacher = teacher;
        }
    
        public String getName() {
            return name;
        }
    
        public Integer getId() {
            return id;
        }
    
        public String getTeacher() {
            return teacher;
        }
    }
    import java.sql.*;
    
    public class PersonTest {
        public static void main(String[] arrgs){
            Person p1 = new Person();
            p1.setId(1002);
            p1.setName("lisi");
            p1.setJob("student");
            Person p2 = new Person();
            p2.setId(1001);
            p2.setName("wangwu");
            p2.setJob("teacher");
            getAll();
            update(p2);
            getAll();
            insert(p1);
            getAll();
        }
    
        /**
         * 获取数据库连接方法
         * @return
         */
        private static Connection getConn(){
            String driver = "com.mysql.jdbc.Driver";
            //后面的一串表示关闭ssl协议
            String url = "jdbc:mysql://192.168.1.110:3306/db_test?useUnicode=true&characterEncoding=utf-8&useSSL=false";
            String username = "root";
            String password = "123456";
            Connection connection = null;
    
            try {
                //加载驱动
                Class.forName(driver);
                //获取数据库连接
                connection = (Connection) DriverManager.getConnection(url, username, password);
            }catch (SQLException e){
                e.printStackTrace();
            }catch (ClassNotFoundException e){
                e.printStackTrace();
            }
            return connection;
        }
    
        /**
         * 插入方法
         * @param person
         * @return
         */
        private static int insert(Person person){
            Connection connection = getConn();
            int i = 0;
            String sql = "insert into person (id,name,job) values(?,?,?);";
            PreparedStatement pstmt;
            try {
                //从连接获取PreparedStatement对象
                pstmt = (PreparedStatement) connection.prepareStatement(sql);
                //组装sql
                pstmt.setInt(1, person.getId());
                pstmt.setString(2, person.getName());
                pstmt.setString(3, person.getJob());
                //执行sql
                i = pstmt.executeUpdate();
                //关闭连接
                pstmt.close();
                connection.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
            return i;
        }
    
        /**
         * 更新方法
         * @param person
         * @return
         */
        private static int update(Person person) {
            Connection conn = getConn();
            int i = 0;
            String sql = "update person set name='" + person.getName() + "' where id='" + person.getId() + "'";
            PreparedStatement pstmt;
            try {
                pstmt = (PreparedStatement) conn.prepareStatement(sql);
                i = pstmt.executeUpdate();
                System.out.println("resutl: " + i);
                pstmt.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return i;
        }
    
        private static Integer getAll() {
            Connection conn = getConn();
            String sql = "select * from person";
            PreparedStatement pstmt;
            try {
                pstmt = (PreparedStatement)conn.prepareStatement(sql);
                ResultSet rs = pstmt.executeQuery();
                int col = rs.getMetaData().getColumnCount();
                System.out.println("============================");
                while (rs.next()) {
                    for (int i = 1; i <= col; i++) {
                        System.out.print(rs.getString(i) + "	");
                        if ((i == 2) && (rs.getString(i).length() < 8)) {
                            System.out.print("	");
                        }
                    }
                    System.out.println("");
                }
                System.out.println("============================");
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        private static int delete(Integer id) {
            Connection conn = getConn();
            int i = 0;
            String sql = "delete from person where id='" + id + "'";
            PreparedStatement pstmt;
            try {
                pstmt = (PreparedStatement) conn.prepareStatement(sql);
                i = pstmt.executeUpdate();
                System.out.println("resutl: " + i);
                pstmt.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return i;
        }
    
    }

    最后结果如下图: 
    这里写图片描述

  • 相关阅读:
    一台计算机安装两个版本的MySQL
    用php实现显示上个月的最后一天
    SQL 如何去掉字段中千位的逗号(比如set @= '1,320.00' 想得到@= '1320.00' )
    jsp表单提交中的逻辑判断
    将两个字段中的值合并到一个字段中
    vue判断开始日期不能大于截至日期
    mySql中The user specified as a definer ('root'@'%') does not exist
    mysql GROUP_CONCAT给每个值加上单引号后再拼接
    javascript如何获取复选框中的值?
    mybatis中的useGeneratedKeys="true"
  • 原文地址:https://www.cnblogs.com/gaochsh/p/jdbc.html
Copyright © 2011-2022 走看看