微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java游戏服务器之数据库表存取封装

这篇文章主要介绍了Java游戏服务器之数据库表存取封装的相关资料,需要的朋友可以参考下

项目涉及的数据库表并不多,但每个select、insert、update和delete都去手动拼接字符串,是很低效的,尤其在时常要修改结构的情况下。开发的一个目标就是自动化,即能自动实现的事情就不要手动去做;还有一个原则是单一化,即尽量保证数据或逻辑一个入口一个出口。这个需求可以使用一些开源库解决,但因为需求简单,目标明确,没有必要引入多余的第三方库。于是自己写了一个,至少满足当前需求。

数据库表的封装,核心类有两个,表(Table)和记录(Record)。首先需要一个Table类保存数据库表结构的描述,并籍此自动生成相应sql语句。其次需要一个Record类自动设置sql参数,并从返回结果集中自动生成逻辑对象。

table类表结构描述可以有两个来源,自动数据库获取,或从配置表加载。这里选择从配置表加载的方式,一来实现简单,二来应用面更广。

下面是一个账户表的配置示例(user.xml)。

只定义了一个主键,有需要可对此扩充。每列name对应数据库表的列名,field对应逻辑对象的成员变量名,type对应字段的类型,比如是int、string、timestamp等,有了名字和类型,就可以使用反射方式自动get和set数据。

Table类读取配置文件获得数据表的结构描述。

public class Table { public class TableField { public static final int TYPE_INTEGER = 1; public static final int TYPE_STRING = 2; public static final int TYPE_TIMESTAMP = 3; public String columnName = ""; public String fieldName = ""; public int type = 0; } private String tableName = ""; private TableField primaryField = new TableField(); private ArrayList tableFields = new ArrayList(); private String selectAllsql = ""; private String selectsql = ""; private String insertsql = ""; private String updatesql = ""; private String deletesql = ""; ...

然后生成PrepareStatement方式读写的select、insert、update和delete的预处理sql字符串。如update:

private String generateUpdatesql() { String sql = "UPDATE " + tableName + " SET "; int size = tableFields.size(); for (int index = 0; index

Table类的功能就这么多,下面是关键的Record类,其使用反射自动存取数据。

public class Record { private Table table = null; private T object = null; ...

模板参数T即一个表记录对应的逻辑对象。在我们的示例里,即账户数据类:

public class UserData implements Serializable { // 用户ID public int userId = 0; // 用户名 public String username = ""; // 密码 public String password = ""; ...

有了sql语句,要先设置参数,才能执行。主键和普通字段分开设置。

public int setPrimaryParams(int start, PreparedStatement pst) throws Exception { Table.TableField primaryField = table.getPrimaryField(); Object value = getFieldValue(primaryField); value = toDBValue(primaryField, value); pst.setobject(start, value); return start + 1; } public int setnormalParams(int start, PreparedStatement pst) throws Exception { ArrayList.TableField> normalFields = table.getnoramlFields(); final int size = normalFields.size(); for (int index = 0; index .TableField tableField = normalFields.get(index); Object value = getFieldValue(tableField); value = toDBValue(tableField, value); pst.setobject(start + index, value); } return start + size; }就是根据表结构描述,通过反射获取对应字段的值然后设置。

private Object getFieldValue(Table.TableField tableField) throws Exception { Field field = object.getClass().getDeclaredField(tableField.fieldName); return field.get(object); }

toDBValue作用是将Java逻辑类型转成对应数据库类型,比如时间,在逻辑里是Long,而数据库类型是Timestamp。

private Object toDBValue(Table.TableField tableField, Object value) { if (tableField.type == TableField.TYPE_TIMESTAMP) { value = new Timestamp((long) value); } return value; }

以设置update sql参数为例:

public void setUpdateParams(PreparedStatement pst) throws Exception { final int start = setnormalParams(1, pst); setPrimaryParams(start, pst); }

后执行sql语句就可以了。如果是select语句还会返回结果集(ResultSet),从结果集自动生成逻辑对象原理类似,算是一个逆过程,详细参看文末代码

下面给出一个使用的完整示例:

private static final Table udTable = new Table(); ... udTable.load("user.xml"); ... public static boolean updateUserData(UserData userData) { boolean result = false; Record record = udTable.createRecord(); record.setobject(userData); PreparedStatement pst = null; try { String sql = udTable.getUpdatesql(); pst = DbUtil.openConnection().prepareStatement(sql); record.setUpdateParams(pst); result = pst.executeUpdate() > 0; } catch (Exception e) { e.printstacktrace(); } finally { DbUtil.closeConnection(null, pst); } return result; }

代码封装得很简易,有更多需求可据此改进。

上一篇:java多线程编程之线程的生命周期下一篇:Java日常练习题,每天进步一点点(7) 热门搜索

数据库服务器 

游戏服务器 

服务器数据 

游戏服务器开发 

之基础篇(二)之从服务器读取数据 

相关文章

Java游戏服务器之数据库表存取封装

2021-09-20阅读(5368)评论(0)推荐()

这篇文章主要介绍了Java游戏服务器之数据库表存取封装的相关资料,需要的朋友可以参考下

sql 语句 取数据库服务器上所有数据库的名字

2021-11-18阅读(5597)评论(0)推荐()

sql 语句 取数据库服务器上所有数据库的名字,一般作者自己是没问题了。

Unity游戏之存储数据

2021-10-05阅读(6386)评论(0)推荐()

这篇文章主要介绍了Unity游戏之存储数据,感兴趣的同学,可以拷贝代码,试验一下

数据库服务器构建和部署检查列表详解

2021-10-10阅读(5509)评论(0)推荐()

这篇文章主要介绍了数据库服务器构建和部署检查列表的相关内容,小编觉得挺不错的,这里分享给大家,供各位参考。

form表单数据封装成json格式并提交给服务器的实现方法

2021-10-10阅读(8535)评论(0)推荐()

下面小编就为大家分享一篇form表单数据封装成json格式并提交给服务器的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

游戏服务器开发的基本体系与服务器端开发的一些建议

2021-11-22阅读(3205)评论(0)推荐()

刚开始时以为做游戏服务器和做web差不多,但是经过一段时间之后,才发现代码太多,太乱了,一看代码都想重构,都是踩着坑往前走。这里我把一些游戏开发方面的东西整理一...

不看后悔!揭秘游戏服务器开发

2021-11-22阅读(8807)评论(0)推荐()

刚开始时以为做游戏服务器和做web差不多,但是经过一段时间之后,才发现代码太多,太乱了,这里我把一些游戏开发方面的东西整理一下,希望能对那些想做游戏服务器开发的...

取消

有人回复邮件通知

提交评论

© 2021 编程之家 

工信部备案号:琼ICP备2022000316号

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐