版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aiyoyoyo/article/details/78831083
这次我在介绍Netty的使用时,会带入JDBS的数据处理,没有了解JDBS的可以在这里看JDBS的实际使用方式。
另外我对JSTS部分接口进行了重新命名,具体内容请对比 Netty实战手册(三)中的部分,当然可以以示例代码为准。
使用JDBS时,需要先下载JDBS的项目到本地,然后添加到本地maven库里。关于Maven和Git的用法,这里不做描述。
首先在项目中的Pom.xml中加入以下内容导入JDBS:
<dependency>
<groupId>com.jees</groupId>
<artifactId>jees-jdbs</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
然后,参考JDBS中的数据库配置文件,加入我们自己的配置文件,参考如下:
jees-core-dispatcher.xml: 加入数据库配置
<import resource="jees-core-database.xml"/>
jees-core-database.xml:数据库相关配置
<!-- 以下为项目配置参考 -->
<context:component-scan base-package="com.jees.demo.*" />
<import resource="jees-database-test.xml"/>
<!-- 数据库池,程序通过关键字sessionFactoryMap获取对应的数据库session。ID为固定值,不可修改。 -->
<!--
Example:
dao.executeByHQL( _dbKey, _hql );
-->
<util:map id="sessionFactoryMap" >
<!-- _dbmap_key为查询的数据标识关键字 -->
<entry key="default" value-ref="defaultSF"/>
</util:map>
其实这些配置内容和SpringMVC+Hibernate的框架基本一致,完全可以用在Web项目 中,为了方便理解,有些命名我也是参考Web项目来命名的。
数据库的用法,可以定一个DaoService,并实现JDBS中的AbsSupportDao进行封装:
DaoService.java
@Service
public class DaoService extends AbsSupportDao {
final static String DB_DEFAULT = "default";
// Common 数据库通用方法 ==========================================
// 调用AbsSupportDao的公共方法,也可以通过其他方式自己实现,例如
// Session sess = _get_session( DB_DEFAULT );
public void insert( Object _entity ) {
insert( DB_DEFAULT , _entity );
}
public < T > T selectById( Class< T > _cls , Serializable _id ) {
return selectById( DB_DEFAULT , _cls , _id );
}
}
然后可以提供类似Controller的类来对客户端命令做行为分解,这里我叫DemoModel:
DemoModel.java:
@Component
public class DemoModel {
@Autowired
DaoService daoService;
/**
* 假设这里是处理登陆等命令,加入@Transactional保证事务生效
* @param _request
* @param _response
*/
@Transactional
public void requestLogin( ByteBuf _request, ByteBuf _response ) {
// 如果需要字符串,建议使用ProtoBuff,否则需要知道截取字符串的长度,参考如下:
//int len = _request.readInt();
//byte[] dst = new byte[len];
//_request.readBytes( dst );
//String account = new String( dst );
//下面我仅作示意代码来当作用户登陆
int id = _request.readInt();
TabA a = daoService.selectById( TabA.class , id );
_response.writeInt( a == null ? -1 : a.getId() );
}
/**
* 假设这里处理注册
* @param _request
* @param _response
*/
@Transactional
public void requestRegist( ByteBuf _request, ByteBuf _response ){
TabA a = new TabA();
daoService.insert( a );
_response.writeInt( a.getId() );
}
}
参考实战手册三,我这里修改了CommandService的请求处理内容:
@Service
public class CommandService implements ISupportService< ChannelHandlerContext , ByteBuf > {
private static Logger logger = LogManager.getLogger( CommandService.class );
@Autowired
DemoModel demoModel;
@Override
public void request( ChannelHandlerContext _ctx , ByteBuf _request ) {
final int UserLogin = 1;
final int UserRegist = 2;
int cmd = _request.readInt();
logger.info( "CommandService do command: CMD=[" + cmd + "]" );
ByteBuf response = _ctx.alloc().buffer();
//根据cmd来识别使用哪个模块来处理,
switch( cmd ){
case UserLogin:
demoModel.requestLogin( _request, response );
break;
case UserRegist:
demoModel.requestRegist( _request, response );
break;
}
response( _ctx, response );
}
@Override
public void response( ChannelHandlerContext _ctx , ByteBuf _msg ) {
_ctx.writeAndFlush( _msg );
}
}
基本上从网络请求到数据处理,现在已经形成了一个完整环境了,熟悉客户端开发的人,可以使用这套环境来做服务器。
由于最近事情比较多,本篇写的比较仓促,无法很好的理解的,可以加群咨询我。
Netty实战篇暂时到这里了,后面有时间会在示例代码中更新粘包的处理和Protobuff的使用。
接下来我会找时间把JEES或者JEESJS的使用完善和发文章做介绍。希望各位多多支持。
完整的代码下载地址如下:
https://github.com/aiyoyoyo/jeesupport/tree/master/demo/JSTSDemo
欢迎各位关注:JEES系列
也可以加QQ群讨论:8802330