CSDN话题挑战赛第2期
参赛话题:Java技术分享
目录
一、引言
上次写文章是在中秋之前,参加 csdn 的中秋活动,距今将近一个半月。期间有好几次提笔想写一些文字,却提不起兴趣,总觉得写不好。我反思了很久,决定先学习怎么写作。这段时间以来,断断续续的读了几本关于如何写作的书,大概的掌握了一些写作方法,所以今天先写一篇技术文章来练笔。本文会介绍JDBC 和 Mybatis 的开发方式和使用场景,帮助初学者更好的理解持久层技术,并推广 Mybatis 等持久层框架。从现在开始,假设你是初学者。在学习完 JDBC 后,就会继续学习 Mybatis 等持久层框架。在学习的过程中,我们会考虑到一个问题。既然有了JDBC 技术,为什么还会出现持久层框架?
二、原生 JDBC 的使用示例
首先,我们要知道 JDBC 是什么?
JDBC 是一种规范,是一套接口定义,它定义了如何使用JAVA语言操作数据库。然后各大数据库厂商使用Java 语言实现了这一套接口,我们在 Java 项目中就可以通过连接器操作数据库了。最常见的有 Mysql 连接器,不太清楚的可以看我之前写的文章:mysql-connector-java 详解。
下面,我们先看一下原生的 JDBC 编程的使用示例,并总结一下只使用 JDBC 编程的不足之处。
-
public
static
void
main
(String[] args) {
-
Connection
connection
=
null;
-
PreparedStatement
preparedStatement
=
null;
-
ResultSet
resultSet
=
null;
-
try {
-
//加载数据库驱动
-
Class.forName(
"com.mysql.jdbc.Driver");
-
//通过驱动管理类获取数据库链接
-
connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?characterEncoding=utf-8",
"root",
"mysql");
-
//定义sql语句 ?表示占位符
-
String
sql
=
"select * from user where username = ?";
-
//获取预处理statement
-
preparedStatement = connection.prepareStatement(sql);
-
//设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
-
preparedStatement.setString(
1,
"张三");
-
//向数据库发出sql执行查询,查询出结果集
-
resultSet = preparedStatement.executeQuery();
-
//遍历查询结果集
-
while (resultSet.next()) {
-
System.out.println(resultSet.getString(
"id") +
" " + resultSet.getString(
"username"));
-
}
-
}
catch (Exception e) {
-
e.printStackTrace();
-
}
finally {
-
//释放资源
-
if (resultSet !=
null) {
-
try {
-
resultSet.close();
-
}
catch (SQLException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
}
-
if (preparedStatement !=
null) {
-
try {
-
preparedStatement.close();
-
}
catch (SQLException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
}
-
if (connection !=
null) {
-
try {
-
connection.close();
-
}
catch (SQLException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
}
-
}
-
}
以上是 JDBC 的编程示例,现在我们来总结一下不足之处,如下面四点所示:
1、在创建连接,关闭连接,异常处理的时侯有很多冗余、重复的代码,导致一个很长的方法中业务代码只占一小部分
2、Sql 语句在代码中硬编码,不易维护
3、Sql 输入参数需要自己映射,要手动处理sql中的占位符,将输入参数和占位符对应起来
4、获取数据库返回的数据时,需要手动创建对象,再遍历结果集,将数据放到对象中
三、Mybatis 的使用示例
首先,我们要知道 Mybatis 是什么?
Mybatis 是一个持久层框架,它对 JDBC 的操作数据库的过程进行封装,使开发者只需要关注 Sql 本身,而不需要花费精力去处理例如注册驱动、创建 connection、创建 statement、手动设置参数、检索结果集等繁琐的过程。Mybatis 简化了原生 JDBC 的开发过程,弥补了原生 JDBC 的不足之处。
下面,我们先看一下 Mybatis 编程的使用示例。
-
/**
-
* 用户实体
-
*/
-
public class User {
-
private int id;
-
private String username;// 用户姓名
-
private String sex;// 性别
-
private Date birthday;// 生日
-
private String address;// 地址
-
}
-
-
/**
-
* 用户管理mapper
-
*/
-
public interface UserMapper {
-
//查询用户列表
-
public List
<User> findUserByUsername(String username);
-
}
-
-
<!-- 映射文件 -->
-
<?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="com.test.mybatis.mapper.UserMapper">
-
<!-- 查询用户列表 -->
-
<select id="findUserByUsername" parameterType="java.lang.String"
-
resultType=
"cn.itcast.mybatis.po.User">
-
select * from user where username = #{username}
-
</select>
-
</mapper>
-
-
/**
-
* 用户管理service
-
*/
-
public class UserServiceImpl implements UserService {
-
@Autowired
-
private UserMapper userMapper;
-
-
/**
-
* 查询用户列表
-
*/
-
@Override
-
public List
<User> findUserByUsername(String username){
-
return userMapper.findUserByUsername(username);
-
}
-
}
以上是使用 Mybatis 操作数据库的示例,在最后的 service 中可以看到操作数据库很简单,没有冗余的创建连接,关闭连接,处理异常代码。sql 的输入参数会自动映射到sql中,并且 sql 的输出结果集会自动映射到 Java 对象中。让我们可以更加专注于业务代码,不用考虑与业务无关的代码。
四、原生 JDBC 和 Mybatis 的各自使用场景
原生 JDBC 的使用场景有两方面。
一方面是在刚开始学习 Java 技术的时候,我们会在项目中使用原生 JDBC 。
另一方面,在一些非常老的项目中会用到原生的 JDBC ,因为历史原因,在开发这些老项目时,还没有出现持久层框架。如果这些老项目做了技术升级,就会逐步的将原生 JDBC 替换成持久层框架。
总的来说,Mybatis 简化了 JDBC 的开发过程。作为初学者,我们在学习技术时,要充分的理解和学习好 JDBC。但是在正式项目中,为了更好、更快的开发项目,一般都会使用 Mybatis 等持久化框架。
五、结语
最后,做一个总结,原生 JDBC 是使用 Java 语言操作数据库的基础,一定要认真学习,掌握了基础才能更好的学习框架,理解框架的原理。
只有当我们了解到使用原生的 JDBC 操作数据库的不足之处,才能更好的体会到 Mybatis 等持久层框架的优越性。
再说一下后续的规划,我会尝试写一些系列化、系统化的技术文章,将之前写的文章由一个个独立的点串起来成为一条线,使读者能够更好的理解相关技术。
如果有任何问题,欢迎在评论区留言,我会一一解答的。
转载:https://blog.csdn.net/keyboard_/article/details/127477755