JDBC


一:JDBC简介

Java数据库连接(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

注意:JDBC仅仅是一个规范而不是一个实现。意思是各种不同类型的数据库都依这种规范有相应的实现,它们之间的具体实现都是由java类和接口组成。
在这里插入图片描述

二:JDBC编程

1.引入依赖驱动包

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.9</version>
    </dependency>

2.参数配置

//参数配置
    private final String jdbcDriver = "com.mysql.jdbc.Driver"; //jdbc 驱动
    private final String url = "jdbc:mysql://127.0.0.1:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
    private final String userName = "root";
    private final String password = "123456";
  • jdbcDriver :使用jdbc时所需要的驱动
  • userName:登录数据库时所需要的用户名
  • password:登录数据库时所需要的密码
  • url:确定我们所需要连接的数据库
    • jdbc:mysql:和mysql建立连接时使用的协议
    • 127.0.0.1:mysql服务器所在的ip地址(此处为本机)
    • 3306:mysql服务器所在的端口号(此处为MySQL的默认端口)
    • school:即需要操作的数据库名

3.加载驱动

Class.forName(jdbcDriver); //加载驱动

4.获得数据库连接

connection = DriverManager.getConnection(url,useName,password); //建立连接

5.操作数据库

JDBC提供了两种操作数据库的对象:StatementPreparedStatement

注意:

当同结构的SQL语句执行多次时,使用PrePareStatement创建对象的执行效率要比使用Statement创建对象的效率高得多。原因是用PrePareStatement创建对象只编译一次,下一次传值只从解析树之后的操作进行,而使用Statement创建对象每次都需要从头编译。
但并不是使用PrePareStatement创建对象的执行效率总比使用Statement创建对象的效率高,当一个结构的SQL语句只执行一次时,用Statement创建对象的执行效率要比使用PrePareStatement创建对象的效率高,原因是用Statement创建对象会直接执行完一条SQL语句,而用PrePareStatement创建对象会在判断SQL语句没有问题后停止线程等待参数传递,此时会使效率低下。
因此在不同的使用场景下要使用不同的对象。其实在实际操作过程中,更多的是使用PrePareStatement创建对象,原因是使用Statement创建对象容易产生SQL注入异常

在这里插入图片描述
总结:
PreparedStatement和statement的区别:

  1. PreparedStatement 代码结构可读性更高,编码的复杂程度更小
  2. 执行效率
    (1)如果同结构的sql语句只执行一次 statement 效率更高
    (2)如果同结构的sql语句执行多次 PreparedStatement 效率更高
  3. PreparedStatement能避免sql注入的问题

还需要注意:

  • 对数据造成改变的,如insert、update、delete,我们使用的是executeUpdate()方法。
  • 对数据不造成改变的,如select,我们使用的是executeQuery()方法。
  • 当我们进行select查询语句时,jdbc会给我们返回ResultSet类型的集合,即查询到的结果集的集合。此时,我们需要通过遍历集合的方法达到查询的操作,例如:while (resultSet.next());判断集合中是否还有数据
Statement statement = connection.createStatement();
            String sql = "SELECT * FROM Student where  SID=1  ";
            ResultSet rs =statement.executeQuery(sql);

            while (rs.next())
            {
                String title = rs.getString("SID");
                String author = rs.getString("Sname");
                System.out.println(title+":"+author);
            }

6.关闭资源

      rs.close();
      statement.close();
      connection.close();

完整代码如下:

public class JDBCDemo {
    /**
     * 1、引入依赖驱动包
     *    mysql-connector-java
     * 2、加载驱动
     *    Class.forName("");
     * 3、连接数据库,获取Connection
     *    url:jdbc:mysql/ip+port(3306)/数据库名
     *    username:
     *    password:
     *   Connection connection = DriverManager.getConnetion();
     *
     * 4、获取Statement对象
     * Statement statement = connection.createStatement();
     *
     * 5、执行数据库的操作(CRUD)
     *   statement.executorQuery();
     *
     * 6、获取结果集:ResultSet
     *
     * 7、关闭资源
     * statement.close();
     * connection.close();
     */

    //第一步:导入jar包

    //第二步:说明JDBC驱动的名称和数据库的地址
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/school";

    //第三步:说明数据库的认证账户及密码
    static final String USER = "root";
    static final String PASS = "123456";

    public static void main(String[] args) {
        //第四步:加载数据库驱动.通常使用Class.forClass(String driverName);加载
        try {
            Class.forName(JDBC_DRIVER);
        } catch (ClassNotFoundException e) {
            //这里会发生类没有找到的异常!
            e.printStackTrace();
        }
        //第五步:获得数据库连接
        try {
            //获取连接
            Connection connection =  DriverManager.getConnection(DB_URL,USER,PASS);
            //第六步:执行查询语句
            Statement statement = connection.createStatement();
            String sql = "SELECT * FROM Student where  SID=1  ";
            ResultSet rs =statement.executeQuery(sql);

            while (rs.next())
            {
                String title = rs.getString("SID");
                String author = rs.getString("Sname");
                System.out.println(title+":"+author);
            }
            //第七步:关闭连接资源
            rs.close();
            statement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
            //这里会发生SQL异常,因为我们提供的的账户和密码不一定能连接成功
        }
    }

JDBC操作事务

public class JDBC {
    //导入jdbc的MySQL依赖 -> pom.xml
    //参数配置
    private String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
    private String useName;
    private String passWord;
    private String jdbcDriver = "com.mysql.jdbc.Driver"; //jdbc驱动
    private Connection connection; JDBC与MySQL所建立的连接
    //加载驱动(驱动加载完成后就可以使用JDBC了)
    //建立连接
    public void createConnection(){
        try {
            Class.forName(jdbcDriver); //加载驱动
            try {
                connection = DriverManager.getConnection(url,useName,passWord); //建立连接
                //getConnection方法就是JDBC提供给我们建立连接的方法
                //即登录到MySQL服务器的过程
                if(!connection.isClosed()){
                    //判断是否成功建立连接
                    System.out.println("连接建立成功");
                }else {
                    System.out.println("连接建立失败");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //开启或者关闭事务
    public void setAutoCommit(){
        try {
            if(!connection.isClosed()){
                if(connection.getAutoCommit()){
                    connection.setAutoCommit(false); //开启事务
                    System.out.println("当前事务已开启");
                }else {
                    connection.setAutoCommit(true); //关闭事务
                    System.out.println("当前事务已关闭");
                }
            }else {
                System.out.println("当前数据库未连接");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    //更改事务的隔离级别
    public void setTransactionIsolation(int level){
        try {
            if(!connection.getAutoCommit()){
                connection.setTransactionIsolation(level);
            }else {
                System.out.println("当前事务未开启");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    //操作数据库(增删改查操作)
    //插入数据
    public void insertTest(int id,String name){ //update delete
        String insertSql = "insert into jdbc_test values(?,?)"; //定义无参的SQL语句
        PreparedStatement pre = null;
        try {
            pre = connection.prepareStatement(insertSql); //将无参的SQL语句提交给MySQL
            //根据字段的不同数据类型给无参的SQL语句提交参数
            pre.setInt(1,id);
            pre.setString(2,name);
            pre.executeUpdate(); //执行SQL语句
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                pre.close();
                dataToDetermine();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //删除数据
    public void deleteTest(int id){
        String deleteSql = "delete from jdbc_test where id = ?";
        PreparedStatement pre = null;
        try {
            pre = connection.prepareStatement(deleteSql);
            pre.setInt(1,id);
            pre.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                pre.close();
                dataToDetermine();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //更改数据
    public void updateTest(int id,String name){
        String updateSql = "update jdbc_test set name = ? where id = ?";
        PreparedStatement pre = null;
        try {
            pre = connection.prepareStatement(updateSql);
            pre.setString(1,name);
            pre.setInt(2,id);
            pre.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                pre.close();
                dataToDetermine();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //查询数据
    public void selectTest(){
        String selectSql = "select * from jdbc_test";
        PreparedStatement pre = null;
        try {
            pre = connection.prepareStatement(selectSql);
            ResultSet resultSet = pre.executeQuery(); //resultSet查询到的结果集的集合
            //executeQuery方法是执行查询操作的专用方法
            //通过遍历集合的方法达到查询的操作
            while (resultSet.next()){ //resultSet.next()判断集合中是否还有数据
                System.out.println("id:"+resultSet.getString(1)
                        +" name:"+resultSet.getString(2));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                pre.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        System.out.println();
    }
    //当开启事务时进行提交操作
    public void dataToDetermine(){
        try {
            if(connection.getAutoCommit()){
                return;
            }else {
                System.out.print("是否正式提交SQL语句(yes/no):");
                Scanner scanner = new Scanner(System.in);
                String input = scanner.next();
                if(input.equals("yes") || input.equals("y")){
                    connection.commit();
                }else {
                    connection.rollback();
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    //关闭数据库连接
    public void closeConnection(){
        try {
            connection.close(); //当不再使用数据库时,关闭JDBC连接避免资源浪费
            if(connection.isClosed()){
                System.out.println("连接已关闭");
            }else {
                System.out.println("连接关闭失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值