首页 > 数据库 >JDBC连接数据库

JDBC连接数据库

时间:2024-08-30 11:22:40浏览次数:12  
标签:JDBC sta 数据库 name String set SQL 连接 con

什么是JDBC

JDBC(Java Database Connectivity)是Java语言中用于连接和操作数据库的一组API。它允许Java程序通过标准的数据库连接方式,与不同种类的关系型数据库进行通信和交互。

JDBC提供了一种统一的编程接口,使得开发人员可以使用相同的代码来访问不同的数据库。它提供了一组类和接口,用于建立数据库连接、执行SQL查询和更新语句、处理事务以及处理数据库结果集等操作。

通过JDBC,开发人员可以使用Java程序连接各种数据库系统,如MySQL、Oracle、SQL Server等,并执行各种数据库操作,如查询数据、插入、更新和删除数据等。JDBC还提供了对事务处理的支持,可以确保数据库操作的原子性、一致性、隔离性和持久性。


JDBC的使用

导入依赖

创建Maven项目并在pom.xml导入MySQL连接依赖

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

连接数据库的6个步骤

1.加载驱动

        //1-加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

2.创建连接

        //2-创建连接
        String url="jdbc:mysql://localhost:3306/easydata";
        String username="root";
        String userpass="123456";
        Connection con= DriverManager.getConnection(url,username,userpass);

3.获取执行对象

        //3-获取执行对象
        Statement sta=con.createStatement();

4.执行SQL语句

        //4-执行SQL语句
        String sql="select * from staff";
        ResultSet set = sta.executeQuery(sql);

5.解析处理结果

        //5-解析处理结果
        while (set.next()){
            //获取每一行数据
            //1.通过列名获取 2.通过列的位置获取
            int id = set.getInt(1);
            System.out.print(id+" ");
            String name= set.getString("name");
            System.out.println(name);
        }

6.关闭资源

        //6-关闭资源
        set.close();
        sta.close();
        con.close();

完整代码:

public class EasyJDBC {
    //JDBC
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1-加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2-创建连接
        String url="jdbc:mysql://localhost:3306/easydata";
        String username="root";
        String userpass="123456";
        Connection con= DriverManager.getConnection(url,username,userpass);
        //3-获取执行对象
        Statement sta=con.createStatement();
        //4-执行SQL语句
        String sql="select * from staff";
        ResultSet set = sta.executeQuery(sql);
        //5-解析处理结果
        while (set.next()){
            //获取每一行数据
            //1.通过列名获取 2.通过列的位置获取
            int id = set.getInt(1);
            System.out.print(id+" ");
            String name= set.getString("name");
            System.out.println(name);
        }
        //6-关闭资源
        set.close();
        sta.close();
        con.close();
    }
}


JDBC封装

JDBC的操作通常包括加载驱动程序、建立连接、创建Statement对象、执行SQL语句、处理结果集和关闭连接六个步骤。为了避免在操作数据库时出现大量的重复代码,对JDBC进行封装是一个非常常见的做法。通过对JDBC进行封装,可以大大简化数据库操作的代码,提高代码的可读性和可维护性,使代码更符合面向对象的设计原则。

创建一个JDBC封装工具类:

1.封装获取连接

    public static Connection getCon() throws ClassNotFoundException, SQLException {
        //1-加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2-创建连接
        String url="jdbc:mysql://localhost:3306/easydata";
        String username="root";
        String userpass="123456";
        Connection con= DriverManager.getConnection(url,username,userpass);
        return con;
    }

2.封装执行对象

    public static Statement getStatement(Connection con) throws SQLException {
        Statement sta=con.createStatement();
        return sta;
    }

3.反射处理数据

通过反射将获取的数据注入到对象中可以实现数据库与Java对象之间的转换,使得程序在处理数据库数据时更加灵活、高效。

    //反射处理数据
    public static <T> List<T> dataToObj(ResultSet rs,Class<T> clazz){
        //声明一个结果集合,如果rs中一行数据也没有 返回null
        List<T> result=null;

        T obj=null;
        //存放所有属性的名称
        List<String> fnameList=new ArrayList();
        //所有属性的对象
        Field[] f_arr=clazz.getDeclaredFields();
        for (Field fitem:f_arr){
            //获取属性名存入链表
            fnameList.add(fitem.getName());
            //设置属性可访问
            fitem.setAccessible(true);
        }

        try {
            while (rs.next()) {
                if (result == null) {
                    result = new ArrayList();
                }
                //通过类对象实例化一个该类的对象
                obj=clazz.newInstance();
                //约束属性名和列名一样就映射
                //遍历所有属性
                //从rs中取出对应属性名的数据存入obj对象中
                for(int i=0;i<fnameList.size();i++){
                    //属性名==列名
                    String fname=fnameList.get(i);
                    //检查类中的属性 是什么类型  int String Object
                    if (int.class==f_arr[i].getType()){
                        int val=rs.getInt(fname);
                        //将val设置到obj对象上
                        f_arr[i].set(obj,val);
                    }else if (String.class==f_arr[i].getType()){
                        String val=rs.getString(fname);
                        //将val设置到obj对象上
                        f_arr[i].set(obj,val);
                    }else {
                        Object val=rs.getObject(fname);
                        //将val设置到obj对象上
                        f_arr[i].set(obj,val);
                    }
                }
                result.add(obj);


            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

4.封装关闭资源

    public static void close(Connection con,Statement sta,ResultSet rs){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if(sta!=null){
            try {
                sta.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if(con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

5.封装查询过程

    public static <T> List<T> query(String sql,Class<T> clazz) throws SQLException {
        Connection con=null;
        Statement sta=null;
        ResultSet rs=null;
        //解析结果
        List<T> result=null;

        try {
            con=getCon();
            sta=getStatement(con);
            rs=sta.executeQuery(sql);
            result=dataToObj(rs,clazz);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //关闭资源
            close(con,sta,rs);
        }

        return result;
    }

测试类

public class EasyJDBCTest {
    public static void main(String[] args) throws SQLException {
        List<Staff> list=JDBC.query("select * from staff",Staff.class);
        for (Staff staff:list){
            System.out.println(staff);
        }
    }
}

class Staff{
    private int id;
    private String code;
    private String name;
    private BigDecimal salary;

    @Override
    public String toString() {
        return "Staff{" +
                "id=" + id +
                ", code='" + code + '\'' +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                '}';
    }
}


预编译执行对象

SQL执行过程分为编译和执行,使用PreparedStatement的作用:预编译SQL语句并执行

1.可以加快批处理        2.有效预防SQL注入

什么是SQL注入

SQL注入是用户向SQL传入特殊的参数导致SQL语义发生变化,从而获取非法数据,是一种通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。

避免SQL注入主要的方式有:1.参数检查         2.预编译

    public static void query(String name) throws ClassNotFoundException, SQLException {
        //1-加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2-创建连接
        String url="jdbc:mysql://localhost:3306/easydata";
        String username="root";
        String userpass="123456";
        Connection con= DriverManager.getConnection(url,username,userpass);
        //3-获取执行对象
        Statement sta=con.createStatement();
        //4-执行SQL语句
        String sql="select * from staff where name='"+name+"'";
        System.out.println(sql);
        ResultSet set = sta.executeQuery(sql);
        //5-解析处理结果
        while (set.next()){
            //获取每一行数据
            //1.通过列名获取 2.通过列的位置获取
            int id = set.getInt(1);
            System.out.print(id+" ");
            String staffname= set.getString("name");
            System.out.println(staffname);
        }
        //6-关闭资源
        set.close();
        sta.close();
        con.close();
    }

正常传入一个姓名查询:

SQL注入示例:

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        //query("李思思");
        query("' or '1'='1");
    }


使用预编译执行

使用预编译执行对象,在SQL语句中使用问号 作为占位符,传入时指定第几个占位符赋值

//        Statement sta=con.createStatement();
//        String sql="select * from staff where name='"+name+"'";
//        System.out.println(sql);

        PreparedStatement sta=con.prepareStatement("select * from staff where name=?");
        sta.setString(1,name);
        ResultSet set = sta.executeQuery();

标签:JDBC,sta,数据库,name,String,set,SQL,连接,con
From: https://blog.csdn.net/qq_63161848/article/details/141678988

相关文章

  • Oracle 11g 数据库内存原理
    转自:1、https://blog.csdn.net/ly7472712/article/details/1162393882、https://www.cnblogs.com/prognani/archive/2012/05/14/2500679.htmlOracle11g数据库内存管理-----------------------------------------------------------------------------一、Oracle数据库内......
  • [转帖]11GR2数据库审计日志自动清理
    审计日志如果把SYSTEM表空间撑爆,也会导致数据库停摆,且11g默认审计是开启状态。今天就遇到了这样的情况,写了下面脚本来实现自动清理工作,记录操作过程。TRUNCATETABLESYS.AUD$REUSESTORAGE;--对于已经被审计日志撑爆的数据库或者初始化清理工作时报错ORA-46267,强烈建议用......
  • mybatis 实体类排除数据库字段映射
    1,使用关键字:"transient"transient关键字就是当对象存储时,它的值不需要维持,不需要序列化这个字段=====使用方式====private  transient  String userName2,使用关键字"static"和transient一样,使用这个修饰的变量也不会被序列化,所以在纯数存的时候也不会报错=====使......
  • openGauss-分布式数据库能力
    openGauss-分布式数据库能力可获得性本特性自openGauss2.1.0版本开始引入。特性简介基于分布式中间件shardingsphere使openGauss具备分布式数据库能力。使用32个鲲鹏920(128核)节点组网(1*shardingsphere-proxy,11*shardingsphere-jdbc,20*openGauss)时,完美sharding性能>21......
  • 批量杀死MySQL连接的几种方法
    一:通过information_schema.processlist表中的连接信息生成需要处理掉的MySQL连接的语句临时文件,然后执行临时文件中生成的指令。 mysql>selectconcat('KILL',id,';')frominformation_schema.processlistwhereuser='root';+------------------------+|concat('K......
  • HTB-Mongod(MongoDb数据库)
    前言各位师傅大家好,我是qmx_07,今天给大家讲解Mongod靶场Mongod渗透过程RustScan介绍:Rustscan是一款用Rust语言开发的高速端口扫描器,它可以在3秒内扫描所有65535个端口,并支持脚本引擎和自适应学习功能,并且可以和nmap进行联动可以简单理解成多线程的nmap扫描器RustSc......
  • 科普文:软件架构数据库系列之【MySQL存储引擎InnoDB】
    概叙科普文:软件架构数据库系列之【MySQL前世今生及其体系结构概叙】-CSDN博客前面我们梳理了MySQL体系结构,涉及到innodb的并未进行详细说明,故在此文中进行补充说明。为了更好的理解Innodb,这里还是和前面MySQL体系结构一文中一样,保持一样的结构。重复的章节就不再描述,重点描......
  • sqlsugar 封装 单例模式 多数据库
    #PlayGround\.config\dotnet-tools.json{"version":1,"isRoot":true,"tools":{"csharpier":{"version":"0.29.1","commands":["dotnet-csharpi......
  • MYSQL数据库(三)
    三、查询机制select*from表名[连接查询][限定查询][分组查询][排序查询]1.简单查询select*from表名where条件;查询满足条件的所有信息select字段,字段from表名where条件;查询满足条件的所有指定字段信息(1)DISTINCT去重关键字(2)限定查询bet......
  • 简单介绍数据库
    基本概念数据库(DataBase,DB)定义数据库是相互关联的数据项的集合简单来说,就是存储数据的地方特点结构化:数据通常以表格、行和列的形式组织持久性:数据长期保存,防止丢失数据关联:数据项之间可以定义关系即不同的表格之间通过相同的信息联系起来,这个相同的信息就叫做......