首页 > 数据库 >Java 中几种常用的数据库访问技术

Java 中几种常用的数据库访问技术

时间:2024-12-04 19:33:05浏览次数:12  
标签:语句 Hibernate Java 数据库 几种 SQL 连接

摘要: 本文深入探讨了 Java 中几种常用的数据库访问技术,包括 JDBC、Hibernate、MyBatis 等。详细阐述了每种技术的基本原理、核心组件、使用方法,并通过丰富的示例代码展示了它们在实际应用中的数据库交互操作。通过对这些技术的学习,读者能够全面了解 Java 与数据库交互的多种途径,根据项目需求选择合适的数据库访问技术,提升开发效率与系统性能。

一、引言

在现代软件开发中,数据库是存储和管理数据的核心组件。Java 作为一种广泛应用的编程语言,提供了多种强大的数据库访问技术,使得开发者能够方便地与各种数据库进行交互,实现数据的持久化存储、查询、更新等操作。无论是企业级应用开发、Web 应用开发还是移动应用后端开发,掌握 Java 数据库访问技术都是至关重要的。

二、JDBC(Java Database Connectivity)

JDBC 是 Java 访问数据库的基础技术,它提供了一套标准的 API,使得 Java 程序能够与各种关系型数据库进行通信。

(一)JDBC 的基本原理

JDBC 的核心在于通过驱动程序管理器(DriverManager)加载特定数据库的驱动程序,然后建立与数据库的连接(Connection)。在连接建立后,可以创建语句对象(Statement 或 PreparedStatement)来执行 SQL 语句,并通过结果集(ResultSet)获取查询结果。

(二)JDBC 的核心组件

  1. DriverManager:负责加载数据库驱动程序并管理数据库连接。例如,加载 MySQL 驱动可以使用以下代码:
Class.forName("com.mysql.cj.jdbc.Driver");
  1. Connection:代表与数据库的连接。通过DriverManager.getConnection()方法获取连接,如:
String url = "jdbc:mysql://localhost:3306/mydb";
String username = "root";
String password = "password";
Connection connection = DriverManager.getConnection(url, username, password);
  1. Statement 和 PreparedStatement
    • Statement:用于执行静态 SQL 语句。例如:
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
  • PreparedStatement:用于执行预编译的 SQL 语句,可有效防止 SQL 注入攻击并提高性能。例如:
String sql = "SELECT * FROM users WHERE username =? AND password =?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "user1");
preparedStatement.setString(2, "pass1");
ResultSet resultSet = preparedStatement.executeQuery();
  1. ResultSet:存储查询结果集。可以通过next()方法遍历结果集,并使用getXXX()方法获取具体列的值,如:
while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String username = resultSet.getString("username");
    System.out.println("ID: " + id + ", Username: " + username);
}

(三)JDBC 的优缺点

  • 优点
    • 是 Java 访问数据库的标准方式,几乎所有数据库都提供了 JDBC 驱动。
    • 提供了对数据库操作的细粒度控制,开发者可以灵活地编写 SQL 语句。
  • 缺点
    • 编写大量的样板代码,如加载驱动、创建连接、处理结果集等,开发效率较低。
    • 对 SQL 语句的依赖度高,数据库迁移时可能需要修改大量 SQL 代码。

三、Hibernate

Hibernate 是一个对象关系映射(ORM)框架,它将 Java 对象映射到数据库表,使得开发者可以使用面向对象的方式操作数据库,而无需编写大量的 SQL 语句。

(一)Hibernate 的基本原理

Hibernate 通过配置文件(如hibernate.cfg.xml)或注解来定义对象与表的映射关系。在运行时,它根据这些映射关系自动生成 SQL 语句,执行数据库操作,并将结果映射回 Java 对象。

(二)Hibernate 的核心组件

  1. SessionFactory:是线程安全的对象,用于创建 Session 实例。通常在应用启动时创建并初始化,配置示例如下:
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">password</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
        <mapping class="com.example.User"/>
    </session-factory>
</hibernate-configuration>

在 Java 代码中获取SessionFactory

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
  1. Session:代表与数据库的一次会话,通过SessionFactory.openSession()获取。它提供了各种数据库操作方法,如save()update()delete()get()load()等。例如:
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = new User("user2", "pass2");
session.save(user);
transaction.commit();
session.close();
  1. Entity:即 Java 实体类,通过注解或 XML 配置与数据库表映射。例如:
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String username;
    private String password;
    // 构造函数、getter和setter方法等
}

(三)Hibernate 的优缺点

  • 优点
    • 大大简化了数据库操作代码,提高了开发效率,开发者无需编写复杂的 SQL 语句。
    • 支持多种数据库,方便数据库迁移,只需修改配置文件中的数据库连接信息。
    • 提供了一级缓存和二级缓存机制,能够提高数据访问性能。
  • 缺点
    • 学习曲线较陡,需要理解 ORM 的概念和 Hibernate 的配置及使用规则。
    • 由于自动生成 SQL 语句,在某些复杂查询场景下,可能生成的 SQL 效率不高,需要开发者进行优化或使用原生 SQL。

四、MyBatis

MyBatis 是一款优秀的持久层框架,它既支持使用 XML 配置文件编写 SQL 语句,也支持使用注解来映射 SQL 语句和 Java 方法,提供了灵活的数据库访问方式。

(一)MyBatis 的基本原理

MyBatis 通过配置文件(如mybatis-config.xml)配置数据库连接信息、映射器(Mapper)等。开发者编写 SQL 语句在 XML 文件中或者使用注解,MyBatis 根据配置将 Java 方法调用转换为对应的 SQL 语句执行,并将结果映射为 Java 对象返回。

(二)MyBatis 的核心组件

  1. SqlSessionFactory:类似于 Hibernate 的SessionFactory,用于创建SqlSession。配置示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/UserMapper.xml"/>
    </mappers>
</configuration>

在 Java 代码中获取SqlSessionFactory

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  1. SqlSession:用于执行 SQL 语句,通过SqlSessionFactory.openSession()获取。例如:
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    User user = userMapper.getUserById(1);
    System.out.println(user.getUsername());
} finally {
    sqlSession.close();
}
  1. Mapper:可以是 XML 文件中的映射器或者使用注解的接口。例如,XML 映射器:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.UserMapper">
    <select id="getUserById" resultType="com.example.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

或者使用注解的接口:

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);
}

(三)MyBatis 的优缺点

  • 优点
    • 融合了 JDBC 的灵活性和 Hibernate 的便利性,既可以编写原生 SQL 语句,又能享受简单的配置和对象映射。
    • 支持动态 SQL,能够根据不同条件生成不同的 SQL 语句,满足复杂的查询需求。
    • 易于集成到现有的项目中,对代码的侵入性较小。
  • 缺点
    • 对于复杂的关联查询和缓存管理,需要开发者有一定的经验和深入的理解才能配置好。
    • 相比 Hibernate,在对象关系映射的自动化程度上稍低,一些复杂的映射关系可能需要更多的手动配置。

五、JPA(Java Persistence API)

JPA 是 Java EE 规范中的一部分,它定义了一套用于对象持久化的标准接口和注解,许多 ORM 框架(如 Hibernate)都实现了 JPA 规范。

(一)JPA 的基本原理

JPA 通过实体类中的注解(如@Entity@Id等)来定义对象与数据库表的映射关系。开发者使用 JPA 提供的EntityManager接口来执行数据库操作,如persist()(保存)、merge()(合并)、remove()(删除)、find()(查询)等。

(二)JPA 的核心组件

  1. EntityManagerFactory:类似于 Hibernate 的SessionFactory,用于创建EntityManager。例如:
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myPU");
  1. EntityManager:是操作数据库的核心接口。例如:
EntityManager entityManager = entityManagerFactory.createEntityManager();
Transaction transaction = entityManager.getTransaction();
transaction.begin();
User user = new User("user3", "pass3");
entityManager.persist(user);
transaction.commit();
entityManager.close();
  1. Entity:通过 JPA 注解定义的实体类,如:
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String username;
    private String password;
    // 构造函数、getter和setter方法等
}

(三)JPA 的优缺点

  • 优点
    • 作为 Java EE 规范,具有良好的标准性和可移植性,不同的 JPA 实现框架可以方便地切换。
    • 简化了持久层的开发,提供了统一的 API 进行数据库操作。
  • 缺点
    • 性能上可能不如一些专门优化过的 ORM 框架,如 Hibernate 在某些场景下的缓存机制可能更优。
    • 对于一些特定数据库的高级特性支持可能需要额外的配置或扩展。

六、数据库连接池技术

在实际应用中,频繁地创建和销毁数据库连接是非常耗时和资源浪费的操作。数据库连接池技术应运而生,它预先创建一定数量的数据库连接并维护在一个池中,当应用程序需要访问数据库时,从池中获取连接,使用完毕后归还连接到池中,而不是直接关闭连接。

(一)常见的数据库连接池

  1. C3P0:是一个开源的数据库连接池,配置灵活,支持多种数据库。例如在 Hibernate 中使用 C3P0 的配置:
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.max_size">20</property>
        <property name="hibernate.c3p0.timeout">300</property>
        <property name="hibernate.c3p0.max_statements">50</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        <!-- 其他数据库连接配置 -->
    </session-factory>
</hibernate-configuration>
  1. Druid:阿里巴巴开源的高性能数据库连接池,具有强大的监控功能。在 Spring Boot 项目中使用 Druid 的配置如下:
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20

(二)数据库连接池的优势

  • 提高性能:减少了连接创建和销毁的开销,提高了数据库访问的响应速度。
  • 资源管理:更好地管理数据库连接资源,避免因连接过多导致数据库服务器压力过大或连接泄漏等问题。
  • 可监控性:一些连接池提供了监控功能,能够实时了解连接池的状态、连接使用情况等,便于性能调优和故障排查。

七、总结

Java 提供了多种数据库访问技术,每种技术都有其特点和适用场景。JDBC 是基础,提供了最底层的数据库访问能力;Hibernate 是功能强大的 ORM 框架,适合快速开发和对 SQL 不太熟悉的开发者;MyBatis 在灵活性和便利性之间取得了较好的平衡,适合对 SQL 有一定掌握且需要灵活定制 SQL 语句的场景;JPA 提供了统一的持久化标准;数据库连接池技术则是优化数据库连接管理的重要手段。在实际项目开发中,开发者需要根据项目的需求、性能要求、团队技术栈等因素综合考虑,选择合适的数据库访问技术,以实现高效、稳定、可维护的数据库交互功能。

标签:语句,Hibernate,Java,数据库,几种,SQL,连接
From: https://blog.csdn.net/m0_60315436/article/details/144247727

相关文章

  • Java基础——网络编程
    一、网络基础网络通信:网络通信的概念:两台设备之间通过网络实现数据传输网络通信:将数据通过网络从一台设备传输到另一台设备java.net包下提供了一系列的类和接口,供程序员使用,完成网络通信网络:概念:两台或多台设备通过一定的物理设备连接起来构成了网络根据网络的覆盖范......
  • JavaWeb:会话_过滤器_监听器
    该笔记根据尚硅谷的JavaWeb课程进行整理 一、会话(1)会话管理概述1.1.1为什么需要会话管理HTTP是无状态协议举例:张三去一家饭馆点了几道菜,觉得味道不错,第二天又去了,对老板说,还点上次的那几道菜无状态:老板没有记录张三是否来过,更没有记录他上次点了哪些菜,张三只能重新......
  • 11.Java 集合(ArrayList、Vector、LinkedList、HashSet、LinkedHashSet、TreeSet、Hash
    一、集合概述1、数组的缺点长度开始时必须指定,且一旦指定,不能更改保存的元素必须为同类型对数组数组元素进行增删较为麻烦2、集合的好处可以动态保存多个任意类型提供了一系列方便操作对象的元素3、集合体系Collection接口:单列集合Map接口:双列集合二......
  • 深入解析Java线程源码:从基础到并发控制的全面指南(一)
    一:Java线程基础和源码解析packagejava.lang;importjava.lang.ref.Reference;importjava.lang.ref.ReferenceQueue;importjava.lang.ref.WeakReference;importjava.security.AccessController;importjava.security.AccessControlContext;importjava.security.Pr......
  • windows系统下 重置mysql数据库的密码
    停掉mysql服务win+x按a进入管理员cmd,输入netstopmysql(mysql是服务名,不清楚的可以在服务中查看)2.输入mysqld爆红进入mysql安装目录输入./mysqld--console--skip-grant-tables报错要加入数据目录地址,输入.\mysqld--console--datadir="D:\Deve......
  • Java中的“接口”补充
    1.在Java中,类和类之间是只可以单继承的,而我们要实现多继承的问题是在类中无法的到解决的,我们引出的接口就可以很好的帮助我们解决这个问题,在java中式可以实现多个接口的下面通过代码进行演示1.先创建一个父类(Animal)//创建一个动物类(Animal)classAnimal{protectedSt......
  • Java中的“抽象类“详解
    1.抽象类的定义在面向对象的概念中,所有的对象都是通过,类来描述的,但是反过来,不是所有的类都是用来描述对象的,如果一个类中没有包含足够的信息来描述一个具体的对象,这样的类就是抽象类抽象类的概念是比较抽象的,比如现在有一个"父类"是"动物类",继承这个父类的子类中有"......
  • Java入门--运算符和表达式
    Java入门1、算术运算符实现对两个数的运算,程序输出效果为:请输入第一个整数:25请输入第二个整数:8两数相加的结果为:33两数相减的结果为:17两数相乘的结果为:200两数相除的结果为:3两数取余数的结果为:1以下是Java代码:publicclassCalculate{publicstaticvoidmain(......
  • MVC Angularjs Vue Javascript 显示图片
    以前写随笔,均是一篇一篇来分享,这篇现算是集结。在MVC,angularjs,Vue.js或者Javascript显示用户上传的图片。本月份以来,Insus.NET有写过,C#mvc+axios+webapi+javascripthttps://www.cnblogs.com/insus/p/18577591asp.netmvc视图传递数据至另一页的视图https://www.cnblogs.......
  • hhdb数据库介绍(10-36)
    管理分片方案在线变更提供对业务表的表类型、分片规则、分片字段、分片所属数据节点四个维度进行在线变更的支持。业务表在变更期间不会锁表,业务可对表进行正常的IUD操作。分片方案在线变更记录页面显示已执行完成或正在执行的变更任务记录,正在变更的任务允许通过【取消执......