Java入门11(JDBC)

这篇具有很好参考价值的文章主要介绍了Java入门11(JDBC)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JDBC


驱动加载 => 连接创建 => 创建编译 / 预编译语句 => 获取结果集 => 遍历结果集 => 返回结果集

接口
Driver 驱动
Connection 连接
Statement 操作
ResultSet 结果集
  1. 具体的实现不需要由Java的公司自己提供

  2. 所有开发者使用JDBC的规范都被统一定义

连接数据库(mysql)

统一资源定位符URL:jdbc:mysql:// + ip地址 + 端口 + 访问的数据库 + 请求参数(配置信息)

mysql驱动类的完整路径:com.mysql.jdbc.Driver

public class DBUtil {
    // 定义用户名
    private static final String USER_NAME = "root";
    // 定义密码
    private static final String PASSWORD = "123456";
    // URL--统一资源定位符
    // jdbc:mysql:// + ip地址 + 端口 + 访问的数据库 + 请求参数(配置信息)
    private static final String URL = "jdbc:mysql://localhost:3306/iWeb?characterEncoding=utf8";

    // 加载驱动(静态代码块)
    static {
        // mysql驱动类的完整路径
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("驱动加载失败!");
        }
    }

    // 定义一个获取数据库连接的方法
    public static Connection getConnection(){
        try {
            return DriverManager.getConnection(URL,USER_NAME,PASSWORD);
        } catch (SQLException e) {
            System.out.println("连接获取失败!");
            return null;
        }
    }
}
// 连接测试
public static void main(String[] args) {
    // 定义sql语句
    String sql = "insert into student(name) values('robot03')";
    // try-with 代码块,在try后额外提供一个括号,括号里面的资源在try-catch结束后自动释放
    // 只有实现了AutoCloseable接口的类,才支持使用try-with自动关闭

    // 获取数据库连接 + 生成statement编译语句
    try(Connection connection = DBUtil.getConnection();
        Statement statement = connection.createStatement()) {
        // 执行语句
        statement.execute(sql);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

代码封装(DAO)& CRUD

​ DAO层:负责提供JDBC支持,提供对应的DAO接口和实现类

​ ORM(object relation model):对象应用模型,对数据库对象的映射文章来源地址https://www.toymoban.com/news/detail-541490.html

// 测试表对应的JavaBean
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private long id;
    private String name;
    private String gender;
    private String address;
    private long phone;
}

增(insert)

// 增(insert)
public void insert(Student student) {
    // 空值判断
    if(student == null || student.getName() == null || "".equals(student.getName())){
        System.out.println("参数有误!");
        return;
    }
    String sql = "insert into student(NAME,GENDER,ADDRESS,PHONE) values(?,?,?,?)";
    try(Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement(sql)){
        // 添加参数
        preparedStatement.setString(1,student.getName());
        preparedStatement.setString(2,student.getGender());
        preparedStatement.setString(3,student.getAddress());
        preparedStatement.setInt(4,student.getPhone());
        // 执行语句
        preparedStatement.execute();
    }catch(SQLException e){
        e.printStackTrace();
    }
}

删(delete)

// 删(delete)
public void delete(Student student) {
    String sql = "delete from student where 1=1";
    if(student == null){
        System.out.println("参数有误!");
        return;
    }
    if(student.getId() > 0 && (student.getName() == null || "".equals(student.getName()))){
        // 使用 PreparedStatement 进行参数传递,只需要将 sql 中的参数标记为 ? 即可
        sql = sql +" and id = ?";
        // 使用预编译对象的时候,在创建对象时就需要传入sql
        try(Connection connection = DBUtil.getConnection();
            PreparedStatement preparedStatement = connection.prepareStatement(sql)){
            // 数字代表参数序号
            preparedStatement.setInt(1, student.getId());
            // 执行sql语句
            preparedStatement.execute();
        }catch(SQLException e){
            e.printStackTrace();
        }
    } else if (student.getId() <= 0 && student.getName() != null && (!"".equals(student.getName()))) {
        sql = sql +" and NAME = ?";
        try(Connection connection = DBUtil.getConnection();
            PreparedStatement preparedStatement = connection.prepareStatement(sql)){
            // 数字代表参数序号
            preparedStatement.setString(1, student.getName());
            // 执行sql语句
            preparedStatement.execute();
        }catch(SQLException e){
            e.printStackTrace();
        }
    }else {
        System.out.println("参数有误!");
    }
}

改(update)

public void update(Student student) {
    String sql = "update student set name = ? where id = ?";
    // 空值判断
    if(student == null || student.getName() == null || "".equals(student.getName())){
        System.out.println("参数有误!");
        return;
    }
    try(Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement(sql)){
        // 传参
        preparedStatement.setString(1,student.getName());
        preparedStatement.setInt(2,student.getId());
        // 执行sql语句
        preparedStatement.execute();
    }catch(SQLException e){
        e.printStackTrace();
    }
}

查(select)

// 普通查询
public Collection<Student> listByPage(int start, int count) {
    List<Student> result = new ArrayList<>();
    String sql = "select * from student limit ?,?";
    try(Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement(sql)){
        // 传参
        preparedStatement.setInt(1,start);
        preparedStatement.setInt(2,count);
        // 执行查询语句的时候,需要使用 ResultSet 接收结果
        ResultSet resultSet = preparedStatement.executeQuery();
        while(resultSet.next()){
            result.add(new Student(resultSet.getInt("id"),resultSet.getString("name"), resultSet.getString("gender"),resultSet.getString("address"),resultSet.getInt("phone")));
        }
    }catch(SQLException e){
        e.printStackTrace();
    }
    if(result.size() == 0){
        return null;
    }else{
        return result;
    }
}

// 模糊查询(字符串拼接)
public Collection<Student> listWithNameLike(String key) {
    List<Student> result = new ArrayList<>();
    String sql = "select * from student where name like ?";
    try(Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement(sql)){
        // 传参
        preparedStatement.setString(1,"%" + key + "%");
        // 接收结果
        ResultSet resultSet = preparedStatement.executeQuery();
        while(resultSet.next()){
            result.add(new Student(resultSet.getInt("id"),resultSet.getString("name"), resultSet.getString("gender"),resultSet.getString("address"),resultSet.getInt("phone")));
        }
    }catch(SQLException e){
        e.printStackTrace();
    }
    if(result.size() == 0){
        return null;
    }else{
        return result;
    }
}

preparedStatement 🌞 和 statement 💩的区别:

  1. 参数传递的区别,preparedStatement 更加方便,可读性更强
  2. 性能差异,statement 先传参再编译(每次执行语句都需要进行一次编译),preparedStatement 先编译后传参(相同的语句只需要编译一次),相比较 preparedStatement 性能更好👍
  3. 🔒安全问题,statement 存在 sql 注入!!!!

Junit 单元测试

public class TestStudentDAO {
    private StudentDAO studentDAO;
    @Before
    // 被该注解修饰的方法会在所有@Test修饰的方法执行之前执行,一般用于资源加载
    public void init(){
        studentDAO = new StudentDAOImpl();
        System.out.println("假装资源被初始化。。。");
    }

    @After
    // 被该注解修饰的方法会在所有@Test修饰的方法执行之后执行,一般用于资源释放
    public void destroy(){
        System.out.println("假装资源被销毁。。。");
    }

    @Test
    public void test(){
        Collection<Student> students = studentDAO.listAll();
        // 断言类
        // 判断是否不为空
        Assert.assertFalse(students.isEmpty());
        // 判断大小是否和预期值一样
        Assert.assertEquals(3,students.size());
    }
}

到了这里,关于Java入门11(JDBC)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java】JDBC的使用

    数据修改成功。 Driver Manager的作用: 注册驱动 获取数据库连接 静态代码块会进行注册驱动。 不使用SSL Connection作用: 获取执行SQL的对象 管理事务 获取执行SQL的对象 普通执行SQL对象 预编译SQL的执行SQL对象:防止SQL注入 执行存储过程的对象 事务管理 MySQL事务管理 JDBC事务管

    2024年01月20日
    浏览(21)
  • Java JDBC

    DriverManager 类 用于管理 JDBC 驱动的服务类。程序中使用该类的主要功能是获取 Connection 对象 public static synchronized Connection getConnection(String url,String user,String pass) throws SQLException 获取url 对应的数据库连接 Connection 代表数据库连接对象, 每个 Connection 代表一个物理连接会话 该接口

    2024年02月06日
    浏览(19)
  • Java的JDBC编程

    JDBC ,即 Java Database Connectivity , java 数据库连接。是一种用于执行 SQL 语句的 Java API ,它是 Java中的数据库连接规范。这个 API 由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为 Java 开发人员操作数据库提供了一个标准的API ,可以为多种关系数据库提供统一访问。 JDBC 为多

    2024年02月01日
    浏览(14)
  • Java JDBC 详解

    目录 2、Java JDBC 的核心组件有哪些? 3、如何使用JDBC API? 4、DriverManager 和 DataSource 的区别 5、如何使用DataSource进行数据库连接?         Java JDBC (Java Database Connectivity)是Java语言中用于访问数据库的API。JDBC API提供了一组标准的接口,允许Java应用程序通过使用标准SQL查询语

    2024年02月02日
    浏览(28)
  • JAVA基础-JDBC

    本博客记录JAVA基础JDBC部分的学习内容 JDBC : JAVA链接数据库,是JAVA链接数据库的技术的统称,包含如下两部分: 1. JAVA提供的JDBC规范(即各种数据库接口)存储在java.sql 和 javax.sql中的api 2. 各个数据库提供的jar包 jar包的定义与使用 mac下MYSQL安装 MYSQL WORKBENCH工具使用 JDBC课程笔

    2024年02月10日
    浏览(30)
  • 6.Java的JDBC编程

    大家好,我是晓星航。今天为大家带来的是 Java的JDBC编程 相关的讲解!😀 编程语言,如Java,C、C++、Python等 数据库,如Oracle,MySQL,SQL Server等 数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:**MySQL提供了Java的驱动包mysql-connector-java,需

    2024年02月11日
    浏览(8)
  • 【Java】学JDBC看这篇文章就够了—JDBC保姆级教程

    目录 一、JDBC概述 基本介绍 JDBC相关API 二、连接mysql数据库 准备工作 JDBC程序编写步骤 五种连接数据库的方式  三、ResultSet(结果集) 基本介绍 四、Statement 和 PreparedStatement Statement PreparedStatement  五、事务 基本介绍 六、批处理 基本介绍 七、数据库连接池 传统获取Connectio

    2023年04月24日
    浏览(32)
  • 【MySQL】 Java的JDBC编程

    本节目标 数据库驱动 JDBC的概念及作用 掌握JDBC的工作原理 掌握JDBC中几个常用接口和类 掌握基于数据库的应用程序开发流程 编程语言,如Java,C、C++、Python等,博主用的是java; 数据库,如Oracle,MySQL,SQL Server等,博主用的是MySQL; 数据库驱动包:不同的数据库,对应不同的

    2024年02月08日
    浏览(25)
  • 【MySQL】Java的JDBC编程

    编程语言,如Java,C、C++、Python等 数据库,如Oracle,MySQL,SQL Server等 数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提 供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的, 要基于Java操作Oracle数据库则需

    2024年02月20日
    浏览(25)
  • java-初识Servlet,Tomcat,JDBC

    java入门须知的重要概念/名词/技术 等 Servlet是Java Web开发中的一个核心组件,它是 基于Java语言编写的服务器端程序,可以接收Web容器(如Tomcat)发送过来的HTTP请求 ,并向客户端发送HTTP响应。Servlet通常用来处理动态Web页面、Web表单数据、管理会话(session)等任务。 实际上,

    2024年02月11日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包