Java中连接数据库方式详细步骤记录
作者:噢小程
一、JDBC(Java Database Connectivity)
这是 Java 连接数据库最基本的方式。
- 导入数据库驱动:首先需要将特定数据库的 JDBC 驱动添加到项目的依赖中。
- 加载驱动:使用
Class.forName()
方法加载数据库驱动。例如,Class.forName("com.mysql.cj.jdbc.Driver");
。 - 建立连接:使用
DriverManager.getConnection()
方法建立与数据库的连接。例如,String url = "jdbc:mysql://localhost:3306/mydb";
,String username = "root";
,String password = "password";
,Connection connection = DriverManager.getConnection(url, username, password);
。 - 执行 SQL 语句:通过
Statement
或PreparedStatement
对象执行 SQL 查询、插入、更新或删除等操作。 - 处理结果集:如果是查询操作,需要处理返回的
ResultSet
结果集。 - 关闭连接:在操作完成后,务必关闭连接、语句和结果集以释放资源。
1、添加依赖
- 确定数据库类型:首先确定你要连接的数据库类型,比如 MySQL、Oracle、SQL Server 等。不同的数据库需要不同的 JDBC 驱动。
- 添加依赖:将相应数据库的 JDBC 驱动添加到你的项目中。如果是 Maven 项目,可以在
pom.xml
文件中添加依赖;如果是 Gradle 项目,则在build.gradle
文件中添加。例如,对于 MySQL 数据库,可以添加mysql-connector-java
依赖。
2、连接数据库
Java 虚拟机能够找到并加载特定数据库的 JDBC 驱动程序
try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
3、建立连接
url
是数据库的连接字符串,其中localhost
是数据库服务器地址,3306
是 MySQL 的默认端口号,your_database_name
是你要连接的数据库名称。username
和password
分别是数据库的用户名和密码。
String url = "jdbc:mysql://localhost:3306/your_database_name"; String username = "your_username"; String password = "your_password"; try { Connection connection = DriverManager.getConnection(url, username, password); // 连接成功后可以进行后续数据库操作 } catch (SQLException e) { e.printStackTrace(); }
4、执行 SQL 语句
可以使用Statement
或PreparedStatement
来执行 SQL 语句。
Statement
示例:
try { Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table_name"); while (resultSet.next()) { // 处理结果集 int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("ID: " + id + ", Name: " + name); } } catch (SQLException e) { e.printStackTrace(); }
若使用PreparedStatement
,(可以防止 SQL 注入):
try { String sql = "SELECT * FROM your_table_name WHERE id =?"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1, 123); // 设置参数值 ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { // 处理结果集 int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("ID: " + id + ", Name: " + name); } } catch (SQLException e) { e.printStackTrace(); }
5、处理结果集
根据执行的 SQL 语句类型(查询、插入、更新、删除等),处理结果集的方式不同。
对于查询语句,使用ResultSet
的方法(如getInt
、getString
等)获取结果集中的列值。
1)查询语句处理
- 使用
ResultSet
遍历结果集:
- 当执行查询语句后,会得到一个
ResultSet
对象,它代表了从数据库返回的结果集。可以使用while
循环结合ResultSet.next()
方法来遍历结果集中的每一行数据。 - 例如:
- 当执行查询语句后,会得到一个
try { Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table_name"); while (resultSet.next()) { // 处理每一行数据 int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("ID: " + id + ", Name: " + name); } } catch (SQLException e) { e.printStackTrace(); }
- 在循环中,可以根据列名或者列索引,使用
ResultSet
的相应方法(如getInt
、getString
、getDouble
等)来获取每一列的值。列索引从 1 开始。 - 获取特定类型的数据:
- 根据数据库中列的数据类型,选择合适的
ResultSet
方法来获取值。 - 例如,如果列是整数类型,可以使用
getInt
;如果是字符串类型,可以使用getString
;如果是浮点数类型,可以使用getDouble
等。 - 同时,可以传入列名或者列索引作为参数。例如:
- 根据数据库中列的数据类型,选择合适的
int id = resultSet.getInt(1); // 通过列索引获取第一列的值(整数类型) String name = resultSet.getString("name"); // 通过列名获取名为"name"的列的值(字符串类型)
2)插入语句处理
- 执行插入语句后,通常可以获取插入行的自增主键值(如果数据库表有自增主键):
- 使用
PreparedStatement
执行插入语句,并设置返回自增主键的参数。 - 例如:
- 使用
String sql = "INSERT INTO your_table_name (column1, column2) VALUES (?,?)"; try { PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); preparedStatement.setString(1, "value1"); preparedStatement.setString(2, "value2"); int rowsInserted = preparedStatement.executeUpdate(); if (rowsInserted > 0) { // 获取自增主键 ResultSet generatedKeys = preparedStatement.getGeneratedKeys(); if (generatedKeys.next()) { int generatedId = generatedKeys.getInt(1); System.out.println("Inserted row with id: " + generatedId); } } } catch (SQLException e) { e.printStackTrace(); }
- 在执行插入操作后,通过
PreparedStatement.getGeneratedKeys()
方法可以获取包含自增主键值的ResultSet
,然后可以从这个结果集中获取插入行的主键值。
3)更新语句处理
- 执行更新语句后,通常会返回受影响的行数:
- 使用
Statement
或PreparedStatement
执行更新语句,然后通过executeUpdate
方法的返回值来判断有多少行被更新。 - 例如:
- 使用
String sql = "UPDATE your_table_name SET column1 =? WHERE column2 =?"; try { PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, "newValue1"); preparedStatement.setString(2, "conditionValue"); int rowsUpdated = preparedStatement.executeUpdate(); System.out.println("Updated " + rowsUpdated + " rows."); } catch (SQLException e) { e.printStackTrace(); }
- 如果返回值大于 0,表示有行被更新;如果返回值为 0,表示没有满足条件的行被更新。
4)删除语句处理
- 与更新语句类似,执行删除语句后也会返回受影响的行数:
- 使用
Statement
或PreparedStatement
执行删除语句,然后通过executeUpdate
方法的返回值来判断有多少行被删除。 - 例如:
- 使用
String sql = "DELETE FROM your_table_name WHERE column1 =?"; try { PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, "valueToDelete"); int rowsDeleted = preparedStatement.executeUpdate(); System.out.println("Deleted " + rowsDeleted + " rows."); } catch (SQLException e) { e.printStackTrace(); }
- 如果返回值大于 0,表示有行被删除;如果返回值为 0,表示没有满足条件的行被删除。
在处理这些 SQL 语句时,需要注意捕获SQLException
异常,以确保在出现数据库错误时能够正确处理异常情况,并进行适当的错误处理和日志记录。
6、关闭连接
在完成数据库操作后,务必关闭连接以释放资源。
try { if (connection!= null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); }
二、数据库连接池
使用数据库连接池可以提高数据库连接的性能和效率,常见的数据库连接池有 HikariCP、C3P0、Druid 等。
以 Druid 为例,首先添加 Druid 的依赖到项目中,配置连接池参数,如数据库 URL、用户名、密码、最大连接数等,通过连接池获取数据库连接进行操作。
1、添加依赖
如果是 Maven 项目,在pom.xml
中添加以下依赖:
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.12</version> </dependency>
如果是 Gradle 项目,在build.gradle
中添加:
implementation 'com.alibaba:druid:1.2.12'
2、基本使用步骤
1)配置数据源:
import com.alibaba.druid.pool.DruidDataSource; public class DruidExample { public static void main(String[] args) { // 创建 Druid 数据源对象 DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mysql://localhost:3306/your_database"); dataSource.setUsername("your_username"); dataSource.setPassword("your_password"); // 可以设置其他属性,如最大连接数、最小连接数等 dataSource.setInitialSize(5); dataSource.setMaxActive(10); } }
2)获取数据库连接:
try { Connection connection = dataSource.getConnection(); // 使用连接进行数据库操作 } catch (SQLException e) { e.printStackTrace(); }
3)关闭数据源(通常在应用程序关闭时执行)
dataSource.close();
3、监控功能
Druid 提供了强大的监控功能,可以通过以下方式访问监控页面:
- 在应用程序中配置 Druid 的监控属性:
dataSource.setFilters("stat"); dataSource.setEnable(true);
访问监控页面:默认情况下,可以通过http://localhost:8080/druid/index.html
访问 Druid 的监控页面,前提是你的应用程序在端口 8080 运行。在监控页面中,可以查看连接池的状态、SQL 执行情况等信息。
4、结合 Spring 使用
如果在 Spring 项目中使用 Druid,可以通过以下步骤进行配置:
- 在配置文件中配置数据源:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="url" value="jdbc:mysql://localhost:3306/your_database"/> <property name="username" value="your_username"/> <property name="password" value="your_password"/> <!-- 其他属性配置 --> </bean>
在代码中通过@Autowired
注入数据源:
import javax.sql.DataSource; @Service public class YourService { private DataSource dataSource; @Autowired public YourService(DataSource dataSource) { this.dataSource = dataSource; } public void doSomethingWithDatabase() { try { Connection connection = dataSource.getConnection(); // 进行数据库操作 } catch (SQLException e) { e.printStackTrace(); } } }
三、ORM框架
- Hibernate:Hibernate 是一个强大的 ORM 框架,它允许将数据库表映射为 Java 对象,简化了数据库操作。通过配置 Hibernate 的配置文件和实体类的映射文件,可以轻松地连接到数据库并进行各种数据库操作。
- MyBatis:MyBatis 也是一种常用的数据库访问框架,它通过 SQL 映射文件将 SQL 语句与 Java 方法进行映射。虽然 MyBatis 不是严格意义上的 ORM 框架,但它提供了一种方便的方式来操作数据库,同时也允许编写自定义 SQL 语句以满足复杂的业务需求。
这里以MyBatis举例:
1、添加依赖
如果是 Maven 项目,在pom.xml
中添加以下依赖:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency>
如果是 Gradle 项目,在build.gradle
中添加:
implementation 'org.mybatis:mybatis:3.5.10'
同时,如果使用数据库,还需要添加相应数据库的驱动依赖。
2、创建实体类
例如,有一个用户实体类:
public class User { private int id; private String username; private String password; // 构造函数、getter 和 setter 方法 }
3、创建映射接口
import java.util.List; public interface UserMapper { List<User> getAllUsers(); User getUserById(int id); void insertUser(User user); void updateUser(User user); void deleteUser(int id); }
4、编写 SQL 映射文件
创建一个与映射接口同名的 XML 文件,例如UserMapper.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="your.package.name.UserMapper"> <select id="getAllUsers" resultType="User"> SELECT * FROM users; </select> <select id="getUserById" parameterType="int" resultType="User"> SELECT * FROM users WHERE id = #{id}; </select> <insert id="insertUser" parameterType="User"> INSERT INTO users (username, password) VALUES (#{username}, #{password}); </insert> <update id="updateUser" parameterType="User"> UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}; </update> <delete id="deleteUser" parameterType="int"> DELETE FROM users WHERE id = #{id}; </delete> </mapper>
5、配置 MyBatis
创建mybatis-config.xml
配置文件:
<?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/your_database"/> <property name="username" value="your_username"/> <property name="password" value="your_password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="your/package/name/UserMapper.xml"/> </mappers> </configuration>
在代码中加载配置文件并使用 MyBatis:
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MyBatisExample { public static void main(String[] args) { String resource = "mybatis-config.xml"; InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); // 获取映射接口的实现 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 查询所有用户 List<User> users = userMapper.getAllUsers(); for (User user : users) { System.out.println(user.getId() + ", " + user.getUsername() + ", " + user.getPassword()); } // 插入用户 User newUser = new User(); newUser.setUsername("newUser"); newUser.setPassword("newPassword"); userMapper.insertUser(newUser); sqlSession.commit(); // 根据 ID 查询用户 User userById = userMapper.getUserById(1); System.out.println(userById.getId() + ", " + userById.getUsername() + ", " + userById.getPassword()); // 更新用户 User userToUpdate = userMapper.getUserById(2); userToUpdate.setUsername("updatedUser"); userMapper.updateUser(userToUpdate); sqlSession.commit(); // 删除用户 userMapper.deleteUser(3); sqlSession.commit(); sqlSession.close(); } catch (IOException e) { e.printStackTrace(); } } }
总结
到此这篇关于Java中连接数据库方式详细步骤的文章就介绍到这了,更多相关Java连接数据库方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!