java server层_从零写一个Java WEB框架(二)Server层 优化

本文是《架构探险》实践系列的第二篇,聚焦于Server层的优化,通过建立DatabaseUtil类,封装数据库操作,包括加载驱动、获取连接、关闭连接等方法,实现了对JDBC的简化处理,使Server层代码更加简洁。但同时指出,当前的数据库连接管理和关闭方式存在性能消耗问题,预示后续可能引入数据库连接池进行优化。
摘要由CSDN通过智能技术生成

该系列,其实是对《架构探险》这本书的实践。本人想记录自己的学习心得所写下的。

从一个简单的Servlet项目开始起步。对每一层进行优化,然后形成一个轻量级的框架。

每一篇,都是针对项目的不足点进行优化的。

上一篇地址:上一篇

开篇

本篇针对项目中的Server层进行优化介绍。先来看看Server层的目前情况。

e07230f19f95?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

可以看到由于业务简单。只有一个Server类。

以下是CustomerService类的静态代码块

e07230f19f95?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

以下是CustomerService类的其中一个方法

e07230f19f95?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

缺点:

将数据库的加载是一个公共代码块,应该提取出来,不应该写在某个类中。

Service 层是对业务逻辑的处理,但是在方法中,对查询的结果进行了大量的操作。这样使业务层的代码太过浑浊。应该讲查询结果的处理封装起来。

代码实现

将Server层的对数据库操作的代码提取出来

要求:

建立一个DatabaseUtil类 封装对数据库的加载

再创建两个方法getConnection()获取数据库连接 和closeConnection() 关闭数据库连接。

对数据库操作的代码实现封装起来

实现:

为了能更好地封装JDBC的操作。这里还使用了Apache Common项目中的DbUtils类库,这个类库可以更好地帮我处理数据库数据。

DatabaseUtil 类就实现了加载驱动,获取连接,和对数据库进行操作并对查询结果进行处理,然后结果给Server层的3个主要功能。

代码如下:

public class DatabaseUtil {

private static final String DRIVER;

private static final String URL;

private static final String USERNAME;

private static final String PASSWORD;

// 利用Apache的一个工具库DbUtils 对JDBC的封装

private static final QueryRunner QUERY_RUNNER = new QueryRunner();

private static final Logger logger = LoggerFactory.getLogger(DatabaseUtil.class);

static{

System.out.println("配置加载");

Properties conf = PropsUtil.loadProps("config.properties");

DRIVER = conf.getProperty("jdbc.driver");

URL = conf.getProperty("jdbc.url");

USERNAME = conf.getProperty("jdbc.username");

PASSWORD = conf.getProperty("jdbc.password");

//JDBC流程第一步 加载驱动

try {

Class.forName(DRIVER);

} catch (ClassNotFoundException e) {

logger.error("加载jdbc驱动失败",e);

e.printStackTrace();

}

}

public static Connection getConnection() {

try {

Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);

return connection;

} catch (SQLException e) {

logger.error("获取连接失败",e);

e.printStackTrace();

}

return null;

}

public static void closeConnection(Connection connection) {

if (connection != null) {

try {

connection.close();

} catch (SQLException e) {

logger.error("关闭连接失败",e);

e.printStackTrace();

}

}

}

/**

* 查询获取实体列表

* @param entityClass 返回对象

* @param sql 查询语句

* @param params 查询条件

*

*

*/

public static List queryEntityList(Class entityClass,String sql, Object... params) {

List entityList = null;

Connection con = null;

try {

con = getConnection();

entityList =

QUERY_RUNNER.query(con, sql, new BeanListHandler(entityClass), params);

} catch (SQLException e) {

logger.error("查询失败",e);

e.printStackTrace();

}finally {

closeConnection(con);

}

return entityList;

}

/**

* 查询实体

* @param tClass

* @param sql

* @param params

* @param

* @return

*/

public static T queryEntity(Class tClass, String sql, Object... params) {

T entity = null;

Connection con = null;

try {

con = getConnection();

entity =

QUERY_RUNNER.query(con, sql, new BeanHandler(tClass), params);

} catch (SQLException e) {

logger.error("查询失败",e);

e.printStackTrace();

}finally {

closeConnection(con);

}

return entity;

}

/**

* 执行查询语句

* 返回一个List对象。Map 表示列名与列值得映射关系

* @param sql

* @param params

* @return

*/

public static List> executeQuery(String sql, Object... params) {

List> entity = null;

Connection con = null;

try {

con = getConnection();

entity =

QUERY_RUNNER.query(con, sql, new MapListHandler(), params);

} catch (SQLException e) {

logger.error("查询失败",e);

e.printStackTrace();

}finally {

closeConnection(con);

}

return entity;

}

/**

* 执行更新语句(update,insert,delete)

* @param sql

* @param params

* @return

*/

public static int executeUpdate(String sql, Object... params) {

int rows=0;

Connection con = null;

try {

con = getConnection();

rows =

QUERY_RUNNER.update(con, sql, new MapListHandler(), params);

} catch (SQLException e) {

logger.error("查询失败",e);

e.printStackTrace();

}finally {

closeConnection(con);

}

return rows;

}

/**

* 插入实体

* @param entityClass

* @param filedMap

* @param

* @return

*/

public static boolean insertEntity(Class entityClass, Map filedMap) {

/*

* 1. 判断filedMap是否为空

* 2. 对Map遍历,拼接sql语句

* 3. 执行语句

* */

if (MapUtils.isEmpty(filedMap)) {

logger.error("插入实体失败,实体Map为空");

return false;

}

Iterator iterator = filedMap.keySet().iterator();

StringBuffer columns = new StringBuffer("(");

StringBuffer values = new StringBuffer("(");

String sql=("insert into" + entityClass.getSimpleName());

while (iterator.hasNext()) {

String key = iterator.next();

columns.append(key).append(", ");

values.append("?, ");

}

// 删除最后一个 , 然后加上 )

columns.replace(columns.lastIndexOf(", "), columns.length(), ")");

values.replace(values.lastIndexOf(", "), values.length(), ")");

sql += columns + " values " + values;

Object[] params = filedMap.values().toArray();

return executeUpdate(sql,params)==1;

}

public static boolean updateEntity(Class entityClass, long id, Map fieldMap) {

//TODO

return false;

}

public static boolean deleteEntity(Class entityClass, long id) {

String sql = "Delete From " + entityClass.getSimpleName() + " Where id = ?";

return executeUpdate(sql, id) == 1;

}

}

重建Server层

在构建了DatabaseUtil类后,Server层的代码如下:

/*

* 提供客户数据服务

* */

public class CustomerService {

private static final Logger logger = LoggerFactory.getLogger(CustomerService.class);

/*

* 获取客户列表

* */

public List getCustomerList() {

String sql = "select * from customer";

List list = DatabaseUtil.queryEntityList(Customer.class, sql, null);

return list;

}

/*

* 获取客户

* */

public Customer getCustomer(long id) {

String sql = "select * from customer where id = ?";

return DatabaseUtil.queryEntity(Customer.class, sql, id);

}

/*

* 创建客户

* */

public boolean createCustomer(Map fieldMap) {

return DatabaseUtil.insertEntity(Customer.class,fieldMap);

}

/*

* 更新客户

* */

public boolean updateCustomer(long id,Map fieldMap) {

//TODO

return false;

}

/*

* 删除客户

* */

public boolean deleteCustomer(long id) {

return DatabaseUtil.deleteEntity(Customer.class, id);

}

}

可以看到Server层的代码非常简洁,这样就可以开心地写业务逻辑代码了。而不需要对数据库的操作操心了。

缺陷

虽然Server层是非常的简洁,舒服。但是相对地,又创建了一个数据层。在这个刚建立的数据层上,显然还是有很多不足的。

在getConnection()和closeConnection()上,每次调用数据库操作,都需要重新连接数据库和关闭数据库,这样的消耗很大。

总结

竟然我们已经把数据库处理这一块跨分到一个层了。那么我们就应该对这一块有一个更好地优化才行。比如数据库连接池 就是以后需要优化的一个点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值