首页 > 其他分享 >jdbc

jdbc

时间:2023-10-10 17:55:52浏览次数:33  
标签:jdbc sql ResultSet connection statement mysql 执行

  1. 创建工程,导入驱动jar包
  2. 注册驱动
  3. 获取连接
  4. 定义sql
  5. 获取执行sql的对象
  6. 执行sql
  7. 处理结果
  8. 释放资源

1、DriverManager:驱动管理类

  • 注册驱动

mysql5之后驱动包可省略,自动加载META包中的驱动类

  • 获取数据库连接

禁用安全连接方式,解决警告提示:useSSL=false

2、Connection:数据库连接对象

  • 获取执行sql的对象Statement

普通执行SQL对象

statement createStatement()

预编译sql,防止sql注入

PreparedStatement preparedStatement(sql)

执行存储过程的对象

CallableStatement prepareCall(sql)
  • 管理事务

Connection接口定义了三个对应方法

开启事物

setAutoCommit

提交事务

commit()

回滚事务

rollback()
try{
    //开启事物
    connection.setAutoCommit(false);
    //执行sql
    //处理结果
    //提交
    connection.commit()
}catch(e){
    connection.rollback();
    e.print
}

mysql事物管理:

开启事物:BEGIN;/START TRANSACTION;

提交:COMMIT;

回滚:ROLLBACK;

mysql默认自动提交事务

3、Statement:执行sql语句

  • 执行DML,DDL
int executeUpdate(sql)

返回影响的行数,DDL执行成功也可能返回0

  • 执行DQL
ResultSet executeQuery(sql)

返回ResultSet结果集对象

4、ResultSet:封装查询结果

ResultSet statement.executeQuery(sql)
  • 将光标从当前位置向前移动一行

  • 判断当前行是否为有效行

boolean next()
  • 获取数据
int getInt(参数)  //列编号,从1开始
String getString(参数)   //列名

使用

while(result.next()){
	int getInt(参数);
}

结果封装对象

List<User> list = new ArrayList<>(); 
while(result.next()){
    User user = new User();
	int id =  result.getInt(参数);
    user.setId(id);
    list.add(user);
}

5、PreparedStatement:预编译sql并执行

sql注入是通过输入来修改事先定义好的sql语句,执行代码对服务器进行攻击

预编译SQL,性能更高

防止SQL注入: 将敏感字符进行转义


使用

  1. 获取PrepareStatement对象

    String sql = "select * from tb where id = ?";
    
    PreparedStatement preparedStatement = connection.preparedStatement(sql);
    
  2. 设置参数

    //给?复制
    preparedStatement.setInt(位置,值)
    
  3. 执行sql

    ResultSet resultSet = preparedStatement.executeQuery();
    

java代码--->sql,mysql开始检查sql语法--->编译sql为可执行函数--->执行sql--->返回结果

开启:

useServerPrepStmts=true
  1. 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
  2. 执行时就不用再进行这些步骤了,速度更快
  3. 如果sql模板一样,则只需要进行一次检查、编译

配置mysql执行日志:

log-output=FILE
general-log=1
general_log_file="D:\mysql.log"
slow_query_log=1
slow_query_log_file="D:\mysql_slow.log"
long_query_time=2

数据库连接池

在一个容器提前申请很多连接,分配管理连接

资源重用、提升系统响应速度、避免数据库连接遗漏

标准接口DataSource,可以获取连接

Connection getConnection()

使用

  1. 导入jar包

  2. 定义配置文件、加载配置文件

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://...
    username=root
    password=1234
    initialSize=5
    maxActive=10
    maxWait=3000
    
    Properties properties = new Properties();
    properties.load(new FileInputStream("路径"));
    
  3. 获取数据库连接池对象、获取连接

    DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
    Connection connection = dataSource.getConnection();
    

增删改查

查询所有:

  1. 创建实体类

    1. 类型和名称与数据库表里的字段类似
    2. 驼峰命名
    3. int默认值是0,尽量用Integer;包装类是对象,默认值是null
    4. get、set、toString
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    
    // 注册驱动
    Class.forName("com.mysql.cj.jdbc.Driver");
    
  2. 获取Connection

    // 获取连接
    String url = "jdbc:mysql://localhost:3306/practice";
    String username = "root";
    String password = "1234";
    Connection connection = DriverManager.getConnection(url, username, password);
    
  3. 定义sql

    String sql = "";
    
  4. 获取PrepareStatement对象执行 SQL

    Statement statement = connection.createStatement();
    
    PrepareStatement prepareStatement = connection.prepareStatement(sql)
    
  5. 设置参数

  6. 执行sql,并获取结果集

    ResultSet resultSet = statement.executeQuery(sql);
    
  7. 处理结果

    //创建集合
    List<User> list = new ArrayList<>();
    
    // 处理结果集
    while (resultSet.next()) {
        
        //获取数据
        int userId = resultSet.getInt("userid");	//根据列名获取数据
        
    	//封装对象
        User user = new User();
        user.setUserid(userId);
        
        //装载集合
        list.add(user);
    
        System.out.println("User ID: " + userId);
    }
    System.out.println(list);
    
  8. 释放资源

    resultSet.close();
    statement.close();
    connection.close();
    

添加:

  1. 编写sql

    insert into tb(name,age) values(?,?);
    
  2. 需要除了主键id之外的所有参数

    statement.setString(1,name)
    statement.setInt(2,age)
    
  3. 执行sql

    int count = statement.executeUpdate();
    
  4. 用一个boolean封装结果

    增删改没有ResultSet

    sout:(count>0);
    

根据id修改:

  1. 编写sql

    update tb
    set name=?,
    	age=?
    where id = ?
    
  2. 设置参数

    statement.setString(1,name);
    statement.setInt(2,age);
    
    
    
  3. 执行sql

    int count = statement.executeUpdate();
    

    用一个boolean封装结果

    增删改没有ResultSet

    sout:(count>0);
    

删除:

  1. 编写sql

    delete from tb where id = ?
    
  2. 设置参数

    statement.setInt(1,id);
    
  3. 执行sql

    int count = statement.executeUpdate();
    

    用一个boolean封装结果

    增删改没有ResultSet

    sout:(count>0);
    

标签:jdbc,sql,ResultSet,connection,statement,mysql,执行
From: https://www.cnblogs.com/lmcool/p/jdbc.html

相关文章

  • DataFrame通过JDBC读写数据读写到数据mysql
    #coding:utf8importtimefrompyspark.sqlimportSparkSessionfrompyspark.sql.typesimportStructType,StringType,IntegerTypeimportpandasaspdfrompyspark.sqlimportfunctionsasFif__name__=='__main__':#0.构建执行环境入口对象SparkSes......
  • sharding-jdbc分库分表
    数据库分片思想垂直切分按照业务拆分的方式称为垂直分片,又称为纵向拆分,它的核心理念是专库专用。水平切分水平分片又称为横向拆分。相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。例......
  • Sharding-JDBC教程:Spring Boot整合Sharding-JDBC实现分库分表+读写分离
    在工程的application中做sharding-jdbc的分库分表配置,代码如下:sharding.jdbc.datasource.names=ds-master-0,ds-master-1,ds-master-0-slave-0,ds-master-0-slave-1,ds-master-1-slave-0,ds-master-1-slave-1sharding.jdbc.datasource.ds-master-0.type=com.alibaba.dr......
  • Sharding-JDBC 简介
    在介绍Sharding-JDBC之前,有必要先介绍下Sharding-JDBC的大家族ShardingSphere。在介绍ShardingSphere之后,相信大家会对ShardingSphere的整体架构以及Sharding-JDBC扮演的角色会有更深的了解。ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、......
  • Sharding-JDBC
    一、什么是Sharding-JDBCSharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。二、Sharding-JDBC能做什么分库&分表读写分离分布式主键分布式事务......
  • 使用Sharding-JDBC 分库分表
    当mysql单表数据量比较大时往往需要分库分表,Sharding-JDBC是当当网开源的数据库分库分表中间件。Sharding-JDBC定位为轻量级java框架,使用客户端直连数据库,以jar包形式提供服务,无proxy代理层,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式。本文主要讲述该框架与spring+mybatis......
  • springboot -- 整合 sharding-jdbc 读写分离+分库分表配置(进阶)
    sharding-jdbc说明:1、分库分表不能中途更改,取模算法的id会出错2、不支持特殊sql,包括去重,子sql,聚合等3、查询会给所有表发查询sql,带上分库,分表的字段的查询只发一条,4、查询数据要注意使用,尽量带上分库或分表字段来查询,避免多表查询sql过多取模算法假设2个表,test_0,test_1,分......
  • jdbc-批量插入mssql数据库-原
    packagecom.swift.aaa;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassTest2{//staticintcount=......
  • jdbc-批量插入百万数据-5秒
    packagecom.swift.aaa;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjava.sql.Statement;importorg.junit.Test;publicclassAPP1{publicstaticvoidmain(String......
  • Java JDBC连接数据库的CURD操作(JDK1.8 + MySQL8.0.33 + mysql-connector-java-8.0.27-
    JDBC概述JDBC(JavaDatabaseConnectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这些类库可以以一种标准的方法、方便地访问数据库资源。JDBC为访问不同的数据库提供了一......