背景
上一篇已经实现了整体页面和控制器跳转的部分,本篇来在Spring框架的基础上,集成JDBC实现数据库的相关操作。
注意本篇的JDBC操作是原始封装,并没有使用SpringJDBC相关的技术,关于SpringJDBC会在后续章节具体介绍。
导入jar包
在开始之前,我们需要将JDBC相关的jar包拷贝到lib目录下,此处使用的是mysql-connector-java-5.1.48.jar
,下载地址:点此下载
编写数据库操作组件
在传统的开发过程中,我们一般会将JDBC相关的操作封装到一个类中,以便复用相关代码。由于Spring中bean默认的作用域的生存周期是真个容器的存活期间,所以可以将JDBC操作代码封装到一个bean中,这样在web程序运行期间可以直接使用调用该bean对象进行数据库操作。
OK,具体代码如下,请注意注释部分:
package org.maoge.myblog;
import java.sql.Connection;
import java.sql.DriverManager;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component // 注册DbHelper为bean到容器中
public class DbHelper {
@Value("com.mysql.jdbc.Driver") // 注入driver属性
private String driver;
@Value("jdbc:mysql://127.0.0.1:3306/myblog?useUnicode=true&characterEncoding=utf-8") // 注入数据库url属性
private String url;
@Value("root") // 注入用户名属性
private String username;
@Value("XXX") // 注入密码属性
private String password;
/**
* 初始化
*/
@PostConstruct // 使用该注解,以便在项目启动时执行数据库驱动加载工作
public void init() {
try {
Class.forName(driver);
} catch (Exception e) {
// 此处应打印日志
}
}
/**
* 获取数据库连接
*/
public Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
// 此处应打印日志
}
return conn;
}
/**
* 关闭数据库连接
*/
public void closeConnection(Connection conn) {
if(conn!=null) {
try {
conn.close();
}catch(Exception e) {
// 此处应打印日志
}
}
}
}
编写博客数据类
我们需要有一个类描述博客信息,并且与数据库中的blog表对应,此处我们定义为BlogDo(DO表示Data Object,数据对象,与数据库表结构一一对应)。
注意该类实际上是一个模型类,不需要注册为bean组件。
代码如下:
package org.maoge.myblog;
/**
* @theme 数据对象--博客
* @author maoge
* @date 2020-01-27
*/
public class BlogDo {
private Long id;
private String title;
private String author;
private String content;
// 省略get get
}
编写博客操作服务类
现在已经有对数据库进行操作的组件了,也有博客的模型,现在需要封装一个提供博客相关操作的服务类BlogService,代码如下。
此处需要注意两点:一是通过自动注入dbHelper实现对数据库的操作,二是需要将BlogService也注册为bean便于控制器可以直接调用封装好的服务。
package org.maoge.myblog;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @theme 服务--博客
* @author maoge
* @date 2020-01-27
*/
@Component // 注册为组件,纳入Spring容器管理
public class BlogService {
@Autowired // 自动注入dbHelper组件
private DbHelper dbHelper;
/**
* 获取博客列表
*/
public List<BlogDo> getBlogList() {
List<BlogDo> blogList = new ArrayList<BlogDo>();
Connection conn = null;
try {
conn = dbHelper.getConnection();
String sql = "select * from blog";
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
BlogDo blog = new BlogDo();
blogList.add(blog);
blog.setAuthor(rs.getString("author"));
blog.setContent(rs.getString("content"));
blog.setId(rs.getLong("id"));
blog.setTitle(rs.getString("title"));
}
} catch (Exception e) {
// 此处应打印日志
} finally {
dbHelper.closeConnection(conn);
}
return blogList;
}
/**
* 新增博客
*/
public int addBlog(BlogDo blog) {
Connection conn = null;
try {
conn = dbHelper.getConnection();
String sql = "insert into blog(author,content,title)values(?,?,?)";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, blog.getAuthor());
stmt.setString(2, blog.getContent());
stmt.setString(3, blog.getTitle());
return stmt.executeUpdate();
} catch (Exception e) {
// 此处应打印日志
return 0;
} finally {
dbHelper.closeConnection(conn);
}
}
/**
* 根据博客id更新博客信息
*/
public int updateBlog(BlogDo blog) {
Connection conn = null;
try {
conn = dbHelper.getConnection();
String sql = "update blog set author=?,content=?,title=? where id=?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, blog.getAuthor());
stmt.setString(2, blog.getContent());
stmt.setString(3, blog.getTitle());
stmt.setLong(4, blog.getId());
return stmt.executeUpdate();
} catch (Exception e) {
// 此处应打印日志
return 0;
} finally {
dbHelper.closeConnection(conn);
}
}
/**
* 根据博客id删除对应博客
*/
public int deleteBlog(Long id) {
Connection conn = null;
try {
conn = dbHelper.getConnection();
String sql = "delete from blog where id=?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setLong(1, id);
return stmt.executeUpdate();
} catch (Exception e) {
// 此处应打印日志
return 0;
} finally {
dbHelper.closeConnection(conn);
}
}
}
OK,这样我们就把对数据库中blog表的操作都封装到BlogService中了,同时我们将BlogService封装为了bean,可以随时从Spring容器中取出使用,供我们调度。
总结
JSP请求–DispatcherServlet分配请求–BlogController接受处理请求–BlogService处理逻辑–DbHelper封装数据库操作–MySQL数据库持久化存储。
中间还有一个BlogDo实际上是对象–表的映射,便于我们在各个组件之间传递数据,实际上是一种命名规范。
最后BlogController、BlogService、DbHelper都是Spring管理的bean,我们把他们交给容器管理,无需关心他们的生命周期操作,而且随时取来即用,非常方便吭。