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

JDBC的深入浅出

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

JDBC的深入浅出

JDBC 简介

JDBC是使用java语言操作关系型数据库的一套API

官方订一起的一套操作所有关系型数据库的规则,即接口.

0 . 创建工程,导入驱动jar包

1 . 注册驱动

2 . 获取连接

3 . 定义sql语句

4 . 获取执行SQL语句

5 . 执行SQL

6 . 处理返回结果

7 . 释放资源

项目语言级别必须与所使用的jdk版本一致,不然会出现什么无效的源发行版

JDBC API 详解 DriverManager(驱动管理类)

1 . 注册驱动

       Class.forName("com.mysql.jdbc.Driver");

2 . 获取数据库连接

        //获取连接
        String url = "jdbc:mysql://localhost:3306/db1";
        String username = "root";
        String password = "qinshu123";

        Connection conn = DriverManager.getConnection(url, username, password);
url:连接路径      jdbc:mysql://ip地址:端口号/数据库?参数键值对1&参数键值对2
Connection(数据库连接对象)

1 . 获取执行SQL的对象

普通执行SQL对象

Statement createStatement()

预编译SQL的执行SQL对象:防止SQL注入

PreparedStatement prepareStatement(sql)

执行存储过程的对象

CallableStatement prepareCall(sql)

2 . 管理事务

MySQL事务管理

MySQL默认自动提交事务

JDBC事务管理:Connection接口定义了3个对应的方法

//开启事务 : setAutoCommit(boolean autoCommit):
//true为自动提交事务 FALSE为手动提交事务,即为开启事务
//提交事务 : commit()
//回滚事务 : rollback()  利用try_catch进行回滚
package com.jackqin.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;



public class JDBCDemo_1connection {
    public static void main(String[] args) throws Exception {
        //注册驱动
        //java5后可以省略
//        Class.forName("com.mysql.jdbc.Driver");


        //获取连接
        String url = "jdbc:mysql://localhost:3306/db1?useSSL = false";
        String username = "root";
        String password = "qinshu123";

        Connection conn = DriverManager.getConnection(url, username, password);


        //定义sql
        String sql1 = "update user set money = 3000 where id = 1";
        String sql2 = "update user set money = 3000 where id = 2";

        //获取执行sql对象
        Statement stmt = conn.createStatement();




        try {

            //开启事务
            conn.setAutoCommit(false);

            //执行sql
            int count1 = stmt.executeUpdate(sql1);//受影响的行数
            
            //处理结果
            System.out.println(count1);
            //执行sql
            int count2 = stmt.executeUpdate(sql2);//受影响的行数

            //处理结果
            System.out.println(count2);

            //提交事务
            conn.commit();
        } catch (Exception e) {
            //回滚事务
            conn.rollback();
            e.printStackTrace();
        }

        //提交事务

        //释放资源
        stmt.close();
        conn.close();

    }

}
Statement

1 . 执行SQL语句

        Statement stmt = conn.createStatement();


        //执行sql
        int count = stmt.executeUpdate(sql);//执行DML语句,受影响的行数

        //处理结果
        if(count > 0){
            System.out.println("修改成功");
        }else{
            System.out.println("修改失败");
        }
ResultSet(结果集对象)

1 . 封装了DQL查询语句的结果

//用循环判断游标是否最后一行末尾
while(rs.next()){
//获取数据
//获取列号从1开始*****
rs.getxxx()
}

代码如下:

package com.jackqin.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;



public class JDBCDemo_2ResultSet {
    public static void main(String[] args) throws Exception {
        //注册驱动
        //java5后可以省略
//        Class.forName("com.mysql.jdbc.Driver");


        //获取连接
        String url = "jdbc:mysql://localhost:3306/db1?useSSL = false";
        String username = "root";
        String password = "qinshu123";

        Connection conn = DriverManager.getConnection(url, username, password);


        //定义sql
        String sql = "select * from user";


        //获取执行sql对象
        Statement stmt = conn.createStatement();

        //执行
        ResultSet rs = stmt.executeQuery(sql);

        //处理结果
        //光标向下移动一行,并且盘管当前行是否有数据
        while(rs.next()){
            int id =rs.getInt(1);
            String name = rs.getString(2);
            int money = rs.getInt(3);

            System.out.println(id);
            System.out.println(name);
            System.out.println(money);

            System.out.println("-----------------------");
        }

        //释放资源
        rs.close();
        stmt.close();
        conn.close();
        

    }
}

ResultSet案例

需求:查询account账户数据,封装Account对象中,并且存储到ArrayList集合中

step1 : 创建Account类

package com.jackqin.pojo;



public class Account {
    private int id;
    private String name;
    private int 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 int getMoney() {
        return money;
    }

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

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

step2 : 查询数据,封装到Account对象中

step3 : 将Account对象存入ArrayList集合中(2和3步做查询系统常用*********)

package com.jackqin.jdbc;

import com.jackqin.pojo.Account;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;



public class JDBCDemo_2ResultSet {
    public static void main(String[] args) throws Exception {
        //注册驱动
        //java5后可以省略
//        Class.forName("com.mysql.jdbc.Driver");


        //获取连接
        String url = "jdbc:mysql://localhost:3306/db1?useSSL = false";
        String username = "root";
        String password = "qinshu123";

        Connection conn = DriverManager.getConnection(url, username, password);


        //定义sql
        String sql = "select * from user";


        //获取执行sql对象
        Statement stmt = conn.createStatement();

        //执行
        ResultSet rs = stmt.executeQuery(sql);



        //创建集合
        List list = new ArrayList<>();

        //处理结果
        //光标向下移动一行,并且盘管当前行是否有数据
        while(rs.next()){

            Account account = new Account();





            int id =rs.getInt("id");
            String name = rs.getString("name");
            int money = rs.getInt("money");

            //赋值
            account.setId(id);
            account.setName(name);
            account.setMoney(money);

            //存入集合
            list.add(account);


        }
        System.out.println(list);

        //释放资源
        rs.close();
        stmt.close();
        conn.close();


    }
}

PreparedStatement

继承Statement

1 . 预编译SQL语句并执行:预防SQL注入问题

step1 : 获取PreparedStatement对象,传入sql

eg: SQL语句中的参数值,使用?占位符代替单引号

step2 : 设置参数值

eg:就是设置?的值 setxxx(参数1,参数2)

参数1 : ?的位置编号,从1开始

参数2 : ?的值

step3 : 执行SQL

executeQuery(); //不需要传递sql

PreparedStatement原理:
1 . 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译
2 . 执行时不再执行这些步骤,速度更快
3 . 如果sql末班一样,只需要进行一次检查,编译

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

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

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