Java之JDBC与数据库编程!
开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
JDBC(Java Database Connectivity)是Java用于访问和操作关系型数据库的API。通过JDBC,Java应用程序能够与数据库进行连接、执行SQL查询、更新数据,并处理结果集。本文将介绍JDBC的基本概念、驱动程序、数据库连接池、SQL查询与事务管理等内容,并探讨Spring JDBC与MyBatis的集成。
1. JDBC简介与驱动程序
JDBC简介
JDBC是Java提供的标准接口,允许Java程序与各种关系型数据库进行交互。JDBC通过提供一组接口和类,允许开发者以数据库独立的方式进行数据库的连接、查询、更新等操作。
JDBC的核心概念包括:
- Connection:数据库连接,用于与数据库建立通信。
- Statement:SQL语句的执行接口。
- ResultSet:存储查询结果的对象。
- SQLException:处理SQL错误的异常。
JDBC驱动程序
JDBC驱动程序是Java程序与数据库之间通信的桥梁。JDBC驱动程序根据数据库类型提供不同的实现。常见的JDBC驱动程序有四种类型:
- 类型1(JDBC-ODBC桥接驱动程序):通过ODBC与数据库连接,速度较慢,不推荐使用。
- 类型2(本地API驱动程序):通过数据库的本地API与数据库通信。
- 类型3(网络协议驱动程序):通过中间层的服务与数据库通信,适合跨平台应用。
- 类型4(原生协议驱动程序):直接使用数据库的原生协议与数据库通信,性能最好,常用的驱动程序大多数属于这种类型。
常见的数据库驱动:
- MySQL:
com.mysql.cj.jdbc.Driver
- PostgreSQL:
org.postgresql.Driver
- Oracle:
oracle.jdbc.driver.OracleDriver
示例:
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";
Connection connection = DriverManager.getConnection(url, user, password);
2. 数据库连接池(BasicDataSource、C3P0、Druid)
数据库连接池简介
数据库连接池是为了提高数据库访问性能而设计的技术。每次创建数据库连接都需要消耗大量资源,因此使用连接池可以复用连接,减少资源消耗,提高效率。
常见的连接池框架有:
- BasicDataSource:Apache Commons DBCP提供的连接池实现。
- C3P0:一个功能强大的数据库连接池实现,支持自动回收和连接测试等功能。
- Druid:阿里巴巴开发的数据库连接池,性能和功能都非常强大,支持监控和配置优化。
使用示例
BasicDataSource
import org.apache.commons.dbcp2.BasicDataSource;
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
dataSource.setUsername("root");
dataSource.setPassword("password");
Connection connection = dataSource.getConnection();
C3P0
import com.mchange.v2.c3p0.ComboPooledDataSource;
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");
dataSource.setUser("root");
dataSource.setPassword("password");
Connection connection = dataSource.getConnection();
Druid
import com.alibaba.druid.pool.DruidDataSource;
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
dataSource.setUsername("root");
dataSource.setPassword("password");
Connection connection = dataSource.getConnection();
3. SQL查询与PreparedStatement
SQL查询
使用JDBC执行SQL查询时,通常使用Statement
对象执行静态的SQL语句。
示例:
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
while (resultSet.next()) {
String username = resultSet.getString("username");
System.out.println(username);
}
PreparedStatement
PreparedStatement
是Statement
的一个扩展,适用于执行带有参数的SQL语句。PreparedStatement
不仅能够提高执行效率,还能够防止SQL注入攻击。
示例:
String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "john_doe");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
String username = resultSet.getString("username");
System.out.println(username);
}
使用PreparedStatement
执行更新操作
String sql = "UPDATE users SET password = ? WHERE username = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "new_password");
preparedStatement.setString(2, "john_doe");
int rowsAffected = preparedStatement.executeUpdate();
System.out.println("Rows affected: " + rowsAffected);
4. 事务管理与事务隔离
事务管理
事务是数据库中的一个重要概念,用于确保一组操作要么全部成功,要么全部失败。JDBC提供了事务管理功能,通过Connection
对象的setAutoCommit()
方法来控制事务的提交与回滚。
- 开启事务:通过
setAutoCommit(false)
禁用自动提交,手动管理事务。 - 提交事务:使用
commit()
方法提交事务。 - 回滚事务:使用
rollback()
方法回滚事务。
示例:
connection.setAutoCommit(false);
try {
Statement statement = connection.createStatement();
statement.executeUpdate("UPDATE account SET balance = balance - 100 WHERE account_id = 1");
statement.executeUpdate("UPDATE account SET balance = balance + 100 WHERE account_id = 2");
connection.commit(); // 提交事务
} catch (SQLException e) {
connection.rollback(); // 发生错误时回滚事务
e.printStackTrace();
} finally {
connection.setAutoCommit(true); // 恢复自动提交
}
事务隔离
事务隔离级别决定了事务之间的可见性,JDBC支持四种事务隔离级别:
- READ_UNCOMMITTED:最低级别,允许读取未提交的数据(脏读)。
- READ_COMMITTED:读取已提交的数据,防止脏读。
- REPEATABLE_READ:确保在事务期间多次读取的数据一致,防止不可重复读。
- SERIALIZABLE:最高级别,完全隔离,防止幻读。
设置事务隔离级别:
connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
5. Spring JDBC与MyBatis的集成
Spring JDBC
Spring JDBC是Spring框架提供的一套简化JDBC操作的API,目的是减少开发者手动管理JDBC资源的工作量。它通过JdbcTemplate
类封装了JDBC的各种操作,使得数据库操作更加简洁和高效。
Spring JDBC的基本使用:
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
public class UserDao {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public void addUser(String username, String password) {
String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
jdbcTemplate.update(sql, username, password);
}
}
MyBatis
MyBatis是一个优秀的持久层框架,通过XML或注解方式将SQL语句与Java对象进行映射。与JDBC相比,MyBatis简化了SQL查询的执行和结果的映射,提高了开发效率。
配置MyBatis
- MyBatis配置文件:配置数据源、事务管理等。
- 映射器文件:通过XML或注解来配置SQL语句和Java对象的映射。
- Mapper接口:通过接口定义数据库操作方法。
MyBatis集成示例:
<!-- MyBatis配置文件 -->
<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/mydatabase"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
</configuration>
Mapper接口:
public interface UserMapper {
@Select("SELECT * FROM users WHERE username = #{username}")
User findUserByUsername(String username);
}
Spring与MyBatis集成:
Spring和MyBatis集成可以通过Spring的SqlSessionFactory
和JdbcTemplate
进行事务管理和数据库操作。
总结
JDBC与数据库编程是Java开发中不可或缺的技能。掌握JDBC的基本操作、数据库连接池的使用、SQL查询与事务管理是高效开发的基础。此外,Spring JDBC和MyBatis的集成使得开发者能够更加轻松地处理数据库交互,减少了直接使用JDBC的繁琐过程。理解并应用这些技术,可以提高数据库操作的效率与代码的可维护性。
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!
- 点赞
- 收藏
- 关注作者
评论(0)