首页 > 基础资料 博客日记
Java 中连接数据库方式详解
2025-01-03 09:00:07基础资料围观820次
目录
一、JDBC(Java Database Connectivity)
一、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();
}
}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: