JAVA进阶 JDBC技术学习笔记(二)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: JAVA进阶 JDBC技术学习笔记(二)

三、JDBC编写步骤

我们可以通过DriverManager对象下的getConnection()方法创建与当前数据库的连接,得到connection对象。得到该对象表示完成和数据库的一次连接。创建好连接之后需要使用Connection对象创建statement对象或者是PreparedStatement对象发送SQL语句,如果执行的语句是查询语句的话返回一个resultSet对象。

3.1获取连接

package cn.it.bz.JDBC;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
//获取数据库连接
public class GetConnection {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //连接MySQL的url、username、password
        String url = "jdbc:mysql://localhost:3306/test?&useSSL=false&serverTimezone=UTC";
        String username = "root";
        String password = "123456";
            //通过反射实现数据库驱动对象的加载和注册
            Class.forName("com.mysql.cj.jdbc.Driver");
        /*在加载com.mysql.jdbc.Driver类信息时,会执行静态块中的代码。
        在静态块中,数据库驱动会实例化自己并通过DriverManager的registerDriver方法,
        将自己注册DriverManager驱动管理器中.*/
             // 获取数据库连接对象
            Connection conn = DriverManager.getConnection(url, username, password);
            System.out.println(conn);
    }
}

3.1.1Properties文件的使用

properties文件介绍

后缀properties的文件是一种属性文件。这种文件以key=value格式存储内容。Java中可以使用Properties工具类来读取这个文件。项目中会将一些配置信息放到properties文件中,所以properties文件经常作为配置文件来使用。

Properties工具类

Properties工具类,位于java.util包中,该工具类继承自Hashtable<Object,Object>。通过Properties工具类可以读取.properties类型的配置文件。

工具类中常用方法

load(InputStream is):通过给定的输入流对象读取properties文件并解析,将解析的结果放在Properties工具类存储。

getProperty(String key):根据key获取对应的value

注意

如果properties文件中含有中文那么需要对idea进行设置。

使用properties文件

package cn.it.bz.JDBC;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
//读取配置文件信息
public class PropertiesTest {
    public static void main(String[] args) throws IOException {
        //实例化操作配置文件的对象
        Properties prop = new Properties();
        //获取能读取配置文件的输入流对象
        InputStream resourceAsStream = PropertiesTest.class.getClassLoader().getResourceAsStream("cn/it/bz/JDBC/JDBC.properties");
        //通过Properties工具类读取已经转换为输入流的JDBC.properties文件并解析
        prop.load(resourceAsStream);
        //解析后的文件放在Properties工具类中,
        String name = prop.getProperty("name");
        System.out.println(name);
        String name1 = prop.getProperty("name1");
        System.out.println(name1);
    }
}

3.1.2优化获取数据库连接

# 连接MySQL的url、username、password、driverName
url = jdbc:mysql://localhost:3306/test?&useSSL=false&serverTimezone=UTC
username = root
password = 123456
driverName = com.mysql.cj.jdbc.Driver
package cn.it.bz.JDBC;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class GetConnection2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        //实例化配置文件工具类
        Properties props = new Properties();
        //通过类加载器获取配置文件的字节输入流数据
        InputStream resourceAsStream = GetConnection2.class.getClassLoader().getResourceAsStream("cn/it/bz/JDBC/JDBC.properties");
        //读取并解析文件
        props.load(resourceAsStream);
        //获取连接数据库的url
        String url = props.getProperty("url");
        //获取连接数据库的用户名
        String username = props.getProperty("username");
        //获取连接数据库的密码
        String password = props.getProperty("password");
        //获取连接数据库驱动的全名
        String driverName = props.getProperty("driverName");
        //加载并注册驱动
        Class.forName(driverName);
        //获取连接数据库的对象
        Connection conn = DriverManager.getConnection(url, username, password);
        System.out.println(conn);
    }
}

3.1.3封装JDBC工具类

package cn.it.bz.JDBC;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
//数据库连接工具(工具类的异常不能往外抛出)
public class JdbcUtils {
   private static String url = null;
   private static String username = null;
   private static String password = null;
    //类加载的时候执行,只进行一次加载,适合读取配置文件的IO操作。
    static {
        Properties prop = new Properties();
        try {
            InputStream resourceAsStream = JdbcUtils.class.getClassLoader().getResourceAsStream("cn/it/bz/JDBC/JDBC.properties");
            prop.load(resourceAsStream);
            //获取配置文件中的连接数据库的url
            url = prop.getProperty("url");
            //获取配置文件中的连接数据库的用户名
            username = prop.getProperty("username");
            //获取配置文件中的连接数据库的密码
            password = prop.getProperty("password");
            //获取驱动程序的全名
            String  driverName = prop.getProperty("driverName");
            //实例化驱动
            Class.forName(driverName);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //获取数据库连接对象
    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url, username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    //关闭数据库连接对象
    public static void closeConnection(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
     //提交事务
    public  static void commit(Connection conn) {
        if (conn != null) {
            try {
                conn.commit();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //事务回滚
    public static void rollback(Connection conn) {
        if (conn != null) {
            try {
                conn.rollback();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //关闭statement对象(preparedStatement)
    public static void closeStatement(Statement stmt) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //关闭resultSet
    public static void closeResultSet(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //关闭DML操作时的资源
    public static void closeDMLResource(Statement ps, Connection con){
        closeStatement(ps);//先关闭statement对象
        closeConnection(con);//再关闭Connection对象
    }
    //关闭DQL时的资源
    public static void closeDQLResource(Connection conn, Statement stmt, ResultSet rs) {
        closeResultSet(rs);//先关闭ResultSet
        closeStatement(stmt);//再关闭Statement
        closeConnection(conn);//最后关闭Connection
    }
}

3.2发送SQL、处理结果

3.2.1通过Statement添加、修改、删除数据

package cn.it.bz.JDBC;
import java.sql.Connection;
import java.sql.Statement;
public class TestStatement {
    //添加用户
    public void insertUser(String username,int userAge) {
        Connection conn = null;
        Statement stmt = null;
        try {
            //获取数据库连接对象
            conn = JdbcUtils.getConnection();
            //获取statement对象
            stmt = conn.createStatement();
            //定义需要statement对象执行的sql
            String sql = "insert into users values(default,'"+username + "',"+userAge + ")";
            //执行该sql;true表示添加成功,false表示添加失败
            boolean execute = stmt.execute(sql);
            System.out.println(execute);
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            //关闭连接(先关闭Statement,再关闭Connection)
            JdbcUtils.closeDMLResource(stmt,conn);
        }
    }
    //修改数据
    public void updateUser(int id,String username, int userAge) {
        Connection conn = null;
        Statement stmt = null;
        try {
            conn = JdbcUtils.getConnection();
            stmt = conn.createStatement();
            String sql = "update users set username='"+username + "',userage="+userAge + " where userid=" + id;
            int i = stmt.executeUpdate(sql);
            System.out.println(i);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.closeDMLResource(stmt, conn);
        }
    }
    //删除数据
    public void deleteUser(int id) {
        Connection conn = null;
        Statement stmt = null;
        try {
            conn = JdbcUtils.getConnection();
            stmt = conn.createStatement();
            String sql = "delete from users where userid="+id;
            int i = stmt.executeUpdate(sql);
            System.out.println(i);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.closeDMLResource(stmt, conn);
        }
    }
    public static void main(String[] args) {
        TestStatement testStatement = new TestStatement();
        testStatement.insertUser("zhangsan", 18);
        testStatement.updateUser(1, "lisi", 20);
        testStatement.deleteUser(1);
    }
}

3.2.2通过PreparedStatement添加、修改、删除数据

package cn.it.bz.JDBC;
import java.sql.Connection;
import java.sql.PreparedStatement;
public class TestPreparedStatement {
   //添加数据
    public void insertUser(String username, int userAge){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            // 获取数据库连接
            conn = JdbcUtils.getConnection();
            //定义sql,?是参数占位符位置是从1开始计算的。
            String sql = "insert into users values(default,?,?)";
            //完成参数绑定
            ps = conn.prepareStatement(sql);
            ps.setString(1, username);
            ps.setInt(2, userAge);
            int i = ps.executeUpdate();
            System.out.println(i);
        }catch (Exception exception){
             exception.printStackTrace();
        }finally {
            //PreparedStatement是Statement的子接口
            JdbcUtils.closeDMLResource(ps,conn);
        }
    }
    //修改数据
    public void updateUser(int id, String username, int userAge) {
        Connection con = null;
        PreparedStatement ps = null;
        try {
            con = JdbcUtils.getConnection();
            String sql = "update users set username=?,userage=? where userid=?";
            ps = con.prepareStatement(sql);
            ps.setString(1, username);
            ps.setInt(2, userAge);
            ps.setInt(3, id);
            int i = ps.executeUpdate();
            System.out.println(i);
        }catch (Exception exception) {
            exception.printStackTrace();
        }finally {
             JdbcUtils.closeDMLResource(ps, con);
        }
    }
    //删除数据
    public void deleteUser(int id) {
        Connection con = null;
        PreparedStatement ps = null;
        try {
            con = JdbcUtils.getConnection();
            String sql = "delete from users where userid=?";
            ps = con.prepareStatement(sql);
            ps.setInt(1, id);
            int i = ps.executeUpdate();
            System.out.println(i);
        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            JdbcUtils.closeDMLResource(ps, con);
        }
    }
    public static void main(String[] args) {
          TestPreparedStatement testPreparedStatement = new TestPreparedStatement();
          testPreparedStatement.insertUser("Java",123);
          testPreparedStatement.updateUser(3, "Tom", 20);
          testPreparedStatement.deleteUser(3);
    }
}

3.2.3ResultSet的使用

ResultSet接口的特点

ResultSet用来存放数据库查询操作获得结果集,通过对ResultSet的操作可以获取查询到的结果集数据。

注意:

ResultSet 对象中存放的并不是我们查询到的所有的结果集。它采用分块加载的方式来载入结果集数据,防止大量数据涌入到内存。

ResultSet特点

  • ResultSet 对象具有指向其当前数据行的指针。最初,指针被置于第一行之前。next 方法将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。
  • 默认的 ResultSet 对象仅有一个向前移动的指针。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。
  • ResultSet 接口提供用于获取当前行检索列值的获取方法(getBoolean、getLong 等)。可以使用列的索引位置或列的名称检索值。

ResultSet使用原理

3.2.4通过ResultSet获取查询结果

package cn.it.bz.JDBC;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestResultSet {
    //查询所有用户
    public ResultSet getAllUsers(){
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet resultSet = null;
        try {
           //获取Connection对象
            con = JdbcUtils.getConnection();
            String sql = "select * from users";
            ps = con.prepareStatement(sql);
            resultSet = ps.executeQuery();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return resultSet;
    }
    public static void main(String[] args) throws SQLException {
        TestResultSet testResultSet = new TestResultSet();
        ResultSet allUsers = testResultSet.getAllUsers();
        while (allUsers.next()) {
            System.out.println(allUsers.getInt("userid"));
            System.out.println(allUsers.getString("username"));
            System.out.println(allUsers.getString("userAge"));
        }
    }
}

四、ORM编程思想

4.1ORM简介

对象关系映射(英语:Object Relational Mapping,简称ORM,或O/R mapping)是一种为了解决面向对象语言与关系数据库存在的互不匹配的现象。

4.2实体类

实体类就是一个定义了属性,拥有getter、setter、无参构造方法(基本必备)的一个类。实体类可以在数据传输过程中对数据进行封装,相当于一个“工具”、“容器”、“载体”,能存储、传输数据,能管理数据。

实体类特点:

  1. 实体类名,尽量和数据库中的表名一一对应
  2. 实体类中的属性对应数据库表中的字段,相关的命名最好也一一对应
  3. 实体类内方法主要有,getter、setter方法,用于设置、获取数据
  4. 实体类属性一般为private类型,方法为public类型
  5. 实体类应该有,无参、有参构造方法

4.3ORM的使用

   List<Users> usersList = new ArrayList<Users>();
        while (allUsers.next()) {
            //ORM映射
            Users users = new Users();
            users.setUserid(allUsers.getInt("userid"));
            users.setUsername(allUsers.getString("username"));
            users.setUserage(allUsers.getInt("userage"));
            usersList.add(users);
        }



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
19 1
|
17天前
|
SQL 监控 Java
技术前沿:Java连接池技术的最新发展与应用
本文探讨了Java连接池技术的最新发展与应用,包括高性能与低延迟、智能化管理和监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,为开发者提供了一份详尽的技术指南。
23 7
|
19天前
|
移动开发 前端开发 Java
过时的Java技术盘点:避免在这些领域浪费时间
【10月更文挑战第14天】 在快速发展的Java生态系统中,新技术层出不穷,而一些旧技术则逐渐被淘汰。对于Java开发者来说,了解哪些技术已经过时是至关重要的,这可以帮助他们避免在这些领域浪费时间,并将精力集中在更有前景的技术上。本文将盘点一些已经或即将被淘汰的Java技术,为开发者提供指导。
48 7
|
15天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
30 3
|
15天前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
9 2
|
17天前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
23 4
|
14天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
16 1
|
15天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
30 1
|
17天前
|
SQL Java 数据库连接
打破瓶颈:利用Java连接池技术提升数据库访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,避免了频繁的连接建立和断开,显著提升了数据库访问效率。常见的连接池库包括HikariCP、C3P0和DBCP,它们提供了丰富的配置选项和强大的功能,帮助优化应用性能。
35 2
|
19天前
|
前端开发 Java API
过时Java技术的退役:这些技能你不再需要掌握!
【10月更文挑战第22天】 在快速变化的技术领域,一些曾经流行的Java技术已经逐渐被淘汰,不再适用于现代软件开发。了解这些过时的技术对于新手开发者来说尤为重要,以避免浪费时间和精力学习不再被行业所需的技能。本文将探讨一些已经或即将被淘汰的Java技术,帮助你调整学习路径,专注于那些更有价值的技术。
30 1