Hibernate持久化操作的步骤,并与JDBC类比

本文详细介绍了如何使用Hibernate框架进行基本的数据库操作,包括配置文件的读取、SessionFactory的创建、Session的打开、事务的管理以及持久化操作的具体实现。

//1、读取并解析配置文件  <--------->相当于使用DataSource获取连接前读取DataSource的配置文件

Configuration  conf = new Configuration().configure();

 

//2、读取并解析映射信息,创建SessionFactory<------->相当于创建DataSource对象

SessionFactory sf = conf.buildSessionFactory();

 

//3、打开session   <--------------->相当于JDBC获得连接

Session session = sf.openSession();

 

//4。开启一个事务(增删改操作必须,查询操作可选)   <---------->JDBC开启事务

Transaction tx = null;

try{

     tx = session.begionTransaction();

 

//5、持久化操作 <----------->JDBC这一步也是持久化操作

        User user = new User();

       user.setUname("user");

       user.setUpass("password");

   

    session.save(user);

 

//6、提交事务

tx.commit();

 

}catch(Exception e){

     if(null != tx )  {tx.rollback();}

        e.printStackTrace();

}finally{

 

//关闭session

     session.close();

}

<think>好的,我现在需要帮助用户了解Java基础知识中的JDBC。首先,用户之前已经询问过构造方法的作用,现在转向JDBC,可能是在学习Java的数据库连接部分。用户可能是学生或者刚入门的开发者,想要掌握如何使用Java操作数据库。 接下来,我要确定JDBC的核心内容。JDBC是Java Database Connectivity,用于连接操作数据库的API。需要涵盖基本概念、工作原理、关键组件以及使用步骤。用户可能需要实际例子来理解如何编写代码,所以应该包括一个简单的示例代码,解释每个步骤的作用。 然后,用户可能想知道JDBC的优缺点,以及使用时的注意事项。比如驱动类型、资源管理、SQL注入等问题。这部分能帮助用户避免常见错误,写出更健壮的代码。 还要考虑用户可能的疑问,比如不同的驱动类型有什么区别,为什么需要关闭连接,如何防止SQL注入。在回答中需要简明扼要地解释这些点,确保用户理解最佳实践。 另外,用户之前的问题涉及构造方法,可能对面向对象的概念比较熟悉,所以在解释JDBC时可以适当结合对象的概念,比如Connection对象、Statement对象等,帮助用户建立联系。 最后,结构要清晰,分点说明,使用代码示例表格对比,便于用户理解。同时,使用中文,避免技术术语过于晦涩,保持口语化但专业。需要确保信息准确,比如JDBC的流程步骤、驱动类型分类,以及示例代码的正确性。</think>以下是关于**JDBC(Java Database Connectivity)**的详细介绍,从基础概念到实际应用全面解析: --- ### 一、JDBC核心概念 1. **本质定位** - Java标准API(`java.sql``javax.sql`包) - 提供**统一接口**操作各种关系型数据库(MySQL/Oracle/SQL Server等) - 类比JDBC ≈ Java操作数据库的"万能驱动" 2. **核心作用** - 建立Java程序数据库的连接 - 发送SQL语句 - 处理返回结果 3. **架构分层** ``` Java应用程序 → JDBC API → JDBC驱动管理器 → 数据库驱动 → 数据库 ``` --- ### 二、JDBC工作原理 #### 关键组件关系图 ```mermaid graph TD A[Java程序] --> B[JDBC接口] B --> C[JDBC驱动] C --> D[具体数据库] ``` #### 核心接口 | 接口 | 作用 | |-------------------|--------------------------------------------------------------------| | `DriverManager` | 管理数据库驱动,获取Connection对象 | | `Connection` | 数据库连接对象,创建Statement | | `Statement` | 执行静态SQL语句 | | `PreparedStatement` | 预编译SQL语句(**防SQL注入**,性能更优) | | `ResultSet` | 结果集对象,存储查询结果 | --- ### 三、JDBC使用步骤(以MySQL为例) #### 1. 基础操作流程 ```java // 1. 加载驱动(MySQL 8.0+) Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 建立连接 String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC"; Connection conn = DriverManager.getConnection(url, "root", "password"); // 3. 创建Statement Statement stmt = conn.createStatement(); // 4. 执行SQL ResultSet rs = stmt.executeQuery("SELECT * FROM users"); // 5. 处理结果集 while(rs.next()) { System.out.println(rs.getString("username") + " : " + rs.getInt("age")); } // 6. 关闭资源(倒序关闭) rs.close(); stmt.close(); conn.close(); ``` #### 2. 事务控制示例 ```java try { conn.setAutoCommit(false); // 关闭自动提交 // 执行多个DML操作 stmt.executeUpdate("UPDATE account SET balance = balance - 100 WHERE id = 1"); stmt.executeUpdate("UPDATE account SET balance = balance + 100 WHERE id = 2"); conn.commit(); // 提交事务 } catch (SQLException e) { conn.rollback(); // 回滚事务 } ``` --- ### 四、JDBC进阶技术 #### 1. 使用PreparedStatement(推荐方式) ```java String sql = "INSERT INTO users(name, email) VALUES(?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "李四"); // 参数索引从1开始 pstmt.setString(2, "lisi@example.com"); pstmt.executeUpdate(); ``` #### 2. 连接池技术 | 技术对比 | 传统JDBC | 连接池(如HikariCP/Druid) | |------------------|----------------------------------|----------------------------------| | 连接创建方式 | 每次新建物理连接 | 复用预先创建的连接 | | 性能 | 高开销 | 高性能 | | 适用场景 | 低频操作 | 高发场景 | --- ### 五、JDBC驱动类型 | 类型 | 描述 | |--------------------|--------------------------------------------------------------------| | Type 1: JDBC-ODBC桥 | 通过ODBC驱动连接(已淘汰) | | Type 2: 本地API驱动 | 部分Java+本地代码实现(如Oracle OCI) | | Type 3: 网络协议驱动 | 通过中间件转换协议(较少使用) | | Type 4: 纯Java驱动 | **主流选择**,完全Java实现(如MySQL Connector/J) | --- ### 六、最佳实践建议 1. **资源释放** - 必须使用`try-with-resources`或`finally`块确保关闭连接 - 示例: ```java try (Connection conn = DriverManager.getConnection(url); PreparedStatement pstmt = conn.prepareStatement(sql)) { // 操作代码 } // 自动关闭资源 ``` 2. **SQL注入防御** - **必须使用**`PreparedStatement`代替字符串拼接 - 错误示例: ```java // 危险!可通过输入 " OR 1=1 -- 注入 String sql = "SELECT * FROM users WHERE name = '" + inputName + "'"; ``` 3. **连接管理** - 生产环境**必须使用连接池** - 推荐库:HikariCP(性能最优)、Alibaba Druid(监控功能强) --- ### 七、常见异常处理 | 异常类型 | 常见原因 | 解决方案 | |------------------------|---------------------------------|---------------------------------| | `ClassNotFoundException` | 未导入驱动jar包 | 检查项目依赖,添加对应数据库驱动 | | `SQLException` | 连接参数错误/SQL语法错误 | 检查URL/用户名密码,验证SQL语句 | | `Connection timeout` | 网络不通/数据库服务未启动 | 检查数据库状态防火墙设置 | --- > **关键理解**:JDBC是Java操作数据库的基石,其核心价值在于通过统一API屏蔽不同数据库的底层差异。掌握JDBC不仅能直接操作数据库,更是理解后续持久层框架(如MyBatis、Hibernate)的基础。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值