JDBC原生操作

JDBC

原生JDBC

package com.jdbc.test;

import com.jdbc.model.Person;

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

public class JdbcTest {

    public static void main(String[] args) throws Exception {
        //第一步,加载、注册驱动
        //mysql驱动:com.mysql.jdbc.Driver
        Class.forName("com.mysql.jdbc.Driver");

        //连接参数
        //mysql连接:jdbc:mysql://ip/port/数据库名
        String url = "jdbc:mysql://192.168.1.101:3306/mytest?characterEncoding=utf-8";
        String userName = "root";
        String password = "root";

        //第二步,获取连接
        Connection connection = DriverManager.getConnection(url, userName, password);

        //执行sql,?作为占位符
        String sql = "select t.* from person t where t.id = ? and t.name = ?";

        //第三步,获取语句执行者
        //statement: 1. 参数直接嵌入sql执行,会引发sql注入;2. 执行效率低,每次执行都需要编译
        //Statement statement = connection.createStatement();

        //preparedStatement:1. 会对sql进行预编译,防止sql注入;2. 执行效率高,sql只会编译一次
        PreparedStatement preparedStatement = connection.prepareStatement(sql);


        //第四步,设置参数,替换占位符,注意:占位符角标从1开始
        int id = 1;
        String name = "张三";
        preparedStatement.setObject(1, id);
        preparedStatement.setObject(2, name);

        //第五步,执行sql,获取结果集
        ResultSet resultSet = preparedStatement.executeQuery();

        //第六步,解析结果集
        List<Person> list = new ArrayList();
        while (resultSet.next()) {
            int resultId = resultSet.getInt("id");
            String resultName = resultSet.getString("name");
            int resultAge = resultSet.getInt("age");
            int resultSex = resultSet.getInt("sex");
            list.add(Person.builder().id(resultId).name(resultName).age(resultAge).sex(resultSex).build());
        }

        System.out.println(list);
		
        
        //连接释放
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}

问题局限

1. 数据库配置信息硬编码问题
2. 频繁创建数据库连接
3. 需要手动释放连接
4. sql语句、参数设置、获取结果集参数存在硬编码
5. 需要手动封装进行结果集解析

解决方式

1. 配置文件 --解决--> 数据库配置信息硬编码问题
2. 连接池 --解决--> 解决频繁创建数据库连接;需要手动释放连接
3. 反射、内省创建结果实体 --解决--> sql语句、参数设置、获取结果集参数存在硬编码;需要手动封装进行结果集解析
上一篇:在java代码中实现对数据库事务的控制


下一篇:JDBC