引言
在当今的软件开发中,数据库与应用程序之间的交互至关重要。Java作为一种广泛使用的编程语言,提供了多种方式来与数据库建立联系。其中,JDBC(Java Database Connectivity)和MyBatis是两种常用的技术。为了更好地了解Java与数据库之间建立联系的过程,本文将对JDBC与MyBatis进行对比分析。
JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问。它由一组用Java语言编写的类和接口组成,是Java访问数据库的标准规范。
Connection
接口代表与特定数据库的连接,可以执行SQL语句并返回结果。通常,首先需要创建一个Connection
对象来建立与数据库的连接。Statement
接口用于执行静态SQL语句并返回结果。它可以通过Connection
对象创建,并用于执行查询和更新操作。PreparedStatement
接口扩展了Statement
接口,并允许执行参数化SQL语句。它提供了设置参数的方法,可以用于执行带有参数的查询和更新。CallableStatement
接口扩展了PreparedStatement
接口,并允许执行存储过程。它提供了设置输入参数和获取输出参数的方法。ResultSet
接口表示查询操作返回的结果集。通过ResultSet
对象,可以检索查询结果中的数据,包括获取列值、列名等。DriverManager
类是JDBC API中的核心类,用于管理数据库驱动程序。它提供了用于获取与特定数据库的连接的方法,如getConnection()
。SQLException
是JDBC API中用于表示异常的类。在执行SQL语句或与数据库交互时,可能会抛出此异常。jdbc接口方法具体介绍可参考此博客http://t.csdnimg.cn/W3wqG
Class.forName("com.mysql.jdbc.Driver");
Connection connection =
DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username",
"password");
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM user");
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
// ...
}
connection.close();
用户数据库表:
POJO类
@Data
public class User {
private Integer userId;
private String userName;
private String password;
}
DAO(数据访问对象)
public class UserDAO {
private static final String URL = "jdbc:mysql://localhost:3306/crud?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC";
private static final String USERNAME = "root";
private static final String PASSWORD = "root";
public User getUserById(int userId) {
User user=null;
String query = "SELECT * FROM user WHERE user_id = ?";
try {
// 加载MySQL数据库驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace(); // 处理异常
}
try (
Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
PreparedStatement statement = connection.prepareStatement(query)) {
// 设置查询参数
statement.setInt(1, userId);
try (ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
user = new User();
user.setUserId(resultSet.getInt("user_id")) ;
user.setUserName(resultSet.getString("user_name"));
user.setPassword(resultSet.getString("password"));
}
}
} catch (SQLException e) {
// 处理异常
e.printStackTrace();
}
// 返回用户对象
return user;
}
}
主函数运行代码:
public class Main {
public static void main(String[] args) {
//创建dao对象实例
UserDAO userDAO=new UserDAO();
//调用通过id查询对象的方法
User userById = userDAO.getUserById(1);
//输出获取结果
System.out.println(userById);
}
}
运行结果:
MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
mybatis-config.xml
和映射文件(.xml
文件)。基于上面jdbc使用的用户表以及实体类操作
业务接口以及实现类:
public interface UserService {
//查询所有用户
List selectAll();
}
public class UserServiceImpl implements UserService {
@Override
public List selectAll() {
InputStream inputStream=null;
List userList=null;
try {
//读取配置文件
inputStream= Resources.getResourceAsStream("mybatis/mybatis-config.xml");
//基于构建者模式创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//基于工厂模式创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//基于代理模式创建代理对象实例
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
userList=mapper.selectAll();
} catch (IOException e) {
throw new RuntimeException(e);
}
return userList;
}
数据访问接口:
public interface UserMapper {
List selectAll();
}
mybatis全局映射文件:
注意:一定不要忘记在全局配置文件中加载连接数据库文件的配置信息
否则运行时会报一下错误
### Error querying database. Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${jdbc.driverClass}
数据库文件配置:
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/crud?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC
jdbc.username=root
jdbc.password=root
映射文件代码:
user.user_id, user.user_name, user.password
运行结果:
ps:(上面的业务层代码依然十分冗余,其实应该把对sqlsession对象的那部分代码抽象成一个工具类,但由于我只是展示mybatis的执行流程所以仅仅演示代码执行过程,并没有做相应的优化.)
MyBatis 的配置文件通常是一个 XML 文件,用于配置 MyBatis 的运行时环境。这个文件通常命名为
mybatis-config.xml
。
在 mybatis-config.xml
中,需要配置数据源。数据源是用于连接数据库的,一下代码用于动态配置数据源
引入外部属性文件,配置数据库连接信息
Mybatis与原生JDBC相比主要有以下改变:
连接管理:
SQL 语句编写
结果集处理
事务管理:
缓存机制:
简化复杂查询:
类型转换和结果映射:
原生JDBC与MyBatis相比,MyBatis在连接管理、SQL语句编写、结果集处理、事务管理、缓存机制、映射文件配置等方面简化了流程。MyBatis提供了统一的连接管理、降低了SQL注入风险、自动映射结果集、声明式事务管理,并提供了丰富的扩展点和集成能力。相比之下,原生JDBC需要手动处理这些繁琐的任务,容易导致资源浪费和安全风险。