jdbc

  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);
    
posted @ 2023-10-10 17:49  lmcool-  阅读(23)  评论(0)    收藏  举报