博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android项目快速开发框架探索(Mysql + OrmLite + Hessian + Sqlite)
阅读量:5864 次
发布时间:2019-06-19

本文共 5187 字,大约阅读时间需要 17 分钟。

 

前言

结合之前所用的ormlite和hessian,再加上SAE已经支持JAVA,把服务端切换到JAVA,也就有了本文。使用hessian来做数据传输,ormlite来实现客户端与服务端的数据存储,极大的减少了CRUD工作。本文为探索贴,未正式用于大型项目,欢迎大家讨论使用!

 

声明

  欢迎转载,但请保留文章原始出处:)

    博客园:http://www.cnblogs.com

    农民伯伯: http://www.cnblogs.com/over140/ 

 

正文

一、简介

1.1 ormlite

Ormlite[Object Relational Mapping Lite (ORM Lite)]
对象关系映射精简版(精简版的ORM)提供了一些简单的,轻量级持久化Java对象到SQL数据库,同时也避免了复杂性和更多的标准的ORM包的开销的功能。

支持数据库的jdbc调用,当然,最重要的肯定是它支持android原生的数据库api调用sqlite。

——转载自。 

1.2 hessian 

使用方法参照本博两篇文章:

 

 

 

1.3 Android快速开发框架说明

考虑如下几个特点:

a). 客户端(Android)和服务端均使用Java语言 

b). 客户端(Android)和服务端均支持Hessian和ormlite框架

c). 完整的支持面向对象开发:存储和交互传输 

 

二、准备

2.1 开发环境

为了便于同时开发Android和Java Web,这里下载的是Eclipse IDE for Java EE Developers版本,然后安装最新的ADT插件和TOMCAT插件。

2.2 服务端

应用服务器使用Tomcat,采用Java(JSP/Servlet)来实现服务端的业务逻辑,数据库使用Mysql。快速框架搭建推荐大家使用(集成Apache、MySQL、PHP等,支持绿色安装)。

2.3 客户端

普通的Android环境

2.4 通信与存储说明

服务端与客户端通过Hessian进行数据交换,通过Ormlite保存数据库(通过JDBC保存到服务端的MYSQL数据库,也可以直接保存到客户端的sqlite数据库);

 

三、代码

3.1 项目工程截图(服务端)

 HOLib共用于客户端和服务端,保证接口和数据对象一致性。

 

3.2 重点代码分析

3.2.1 服务端

web.xml

<?
xml version="1.0" encoding="ISO-8859-1"
?>
<
web-app 
xmlns
="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
    version
="2.4"
>
    
<
servlet
>
        
<
servlet-name
>user
</
servlet-name
>
        
<
servlet-class
>com.nmbb.ho.server.servlet.UserServlet
</
servlet-class
>
    
</
servlet
>
    
<
servlet-mapping
>
        
<
servlet-name
>user
</
servlet-name
>
        
<
url-pattern
>/user.do
</
url-pattern
>
    
</
servlet-mapping
>
    
    
<
listener
>
        
<
listener-class
>com.nmbb.ho.server.StartupInit
</
listener-class
>
    
</
listener
>
</
web-app
>

 

StartupInit.java

public 
class StartupInit 
implements ServletContextListener {
    @Override
    
public 
void contextInitialized(ServletContextEvent arg0) {
        
try {
            TableUtils.dropTable(OrmliteHelper.getConnection(), POUser.
class,
                    
true);
            
//
创建数据库
            TableUtils.createTable(OrmliteHelper.getConnection(), POUser.
class);
        } 
catch (SQLException e) {
            e.printStackTrace();
        }
    }
    @Override
    
public 
void contextDestroyed(ServletContextEvent arg0) {
    }
}

   代码说明:

StartupInit可用于创建数据库表结构,这里用于测试,真实环境注意数据丢失问题。

POUser.java

@DatabaseTable(tableName = "nmbb_users")
public 
class POUser 
implements Serializable {
    
/**
 用户编号,6位数字 
*/
    @DatabaseField(generatedId = 
true)
    
public 
int suid;
    
/**
 用户名 
*/
    @DatabaseField(width = 30)
    
public String username;
    
/**
 密码 
*/
    @DatabaseField(width = 30)
    
public String password;
    
/**
 昵称 
*/
    @DatabaseField(width = 60)
    
public String nickname;
    
/**
 200 正常 201 数据校验错误 202用户已经存在 
*/
    
public 
int status = 200;
    
/**
 用于放错误信息 
*/
    
public String msg;
    
public POUser() {
    }
}

  代码说明:

注意需要一个空的构造函数,其他请参考ormlite资料。 

 

UserServlet.java 

/**
 * 用户Servlet
 * 
 * 
@author
 农民伯伯
 * 
@see
 
http://www.cnblogs.com/over140/archive/2013/02/19/2917231.html
 *
 
*/
public 
class UserServlet 
extends HessianServlet 
implements IUserService {
    @Override
    
public POUser register(String username, String password) {
        POUser result = 
new POUser();
        System.out.println("[UserServlet.register]...");
        
//
 检测数据是否合法
        
if (isEmpty(username) || isEmpty(password)) {
            result.status = 201;
            result.msg = "用户名或密码不能为空";
        } 
else {
            
//
 检测用户是否存在
            OrmliteHelper<POUser> db = 
new OrmliteHelper<POUser>();
            
if (db.exist(POUser.
class, "username", username)) {
                result.status = 202;
                result.msg = "用户名已经存在";
            } 
else {
                result.username = username;
                result.password = password;
                db.create(result);
//
 入库
                result.msg = "注册成功";
                System.out.println("create user suid:" + result.suid);
            }
        }
        
return result;
    }
    @Override
    
public List<POUser> query(
int suid, 
int startIndex, 
int pageSize) {
        
return 
new OrmliteHelper<POUser>().query(POUser.
class, "suid", suid, startIndex, pageSize) ;
    }
    
/**
     * 判断字符串是否为空
     * 
     * 
@param
 str
     * 
@return
     
*/
    
public 
static 
boolean isEmpty(String str) {
        
return str == 
null || str.length() == 0;
    }
}

 

3.2.2 客户端(Android)  

public 
class UserActivity 
extends Activity {
    @Override
    
protected 
void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    
public 
void OnClickRegiger(View view) {
        
new AsyncTask<Void, Void, POUser>() {
            @Override
            
protected POUser doInBackground(Void... params) {
                String url = "http://192.168.68.23:8081/HOServer/user.do";
                HessianProxyFactory factory = 
new HessianProxyFactory();
                
try {
                    factory.setDebug(
true);
                    factory.setReadTimeout(5000);
                    
//
不设置会报 expected hessian reply at 0x48 
                    factory.setHessian2Reply(
false);
                    IUserService basic = (IUserService) factory.create(IUserService.
class, url, getClassLoader());
                    
return basic.register("admin", "123456");
                } 
catch (MalformedURLException e) {
                    Log.e("UserActivity", "OnClickRegiger", e);
                } 
catch (Exception e) {
                    Log.e("UserActivity", "OnClickRegiger", e);
                }
                
return 
null;
            }
            @Override
            
protected 
void onPostExecute(POUser result) {
                
if (result != 
null) {
                    
if (result.status == 200) {
                        
//
保存入库
                        
new DbHelper<POUser>().create(result);
                    }
                    Toast.makeText(UserActivity.
this, "" + result.msg, Toast.LENGTH_LONG).show();
                }
            };
        }.execute();
    }
}

 

代码说明:

1、DbHelper在源码里给出。 

2、如果项目无法编译通过,请注意设置项目的字符编码、JDK版本、Android的版本。 

 

三、总结

5.1 优点

a). 完全面向对象开发

b). 降低项目的复杂度,减少引入其他框架所带来的复杂性 

c). 非常适合一个开发服务端和客户端

充分的利用的框架的特点,提交开发效率,适合中小型项目快速开发。 

5.2 缺点

a). 注意服务端与客户端共用id的问题

5.3 其他

a). ormlite支持标准的JPA助记符,。这样服务端采用Hibernate应该也是可以的,有时间可以做一个整合例子看看。

b). 测试发现整个框架也适用于SAE,如果一个人负责客户端和服务端,那就太幸福了!

 

四、下载

   

 

结束

探索永无止境!

 

你可能感兴趣的文章
一起学习以太坊|理解以太坊的椭圆曲线签名
查看>>
区块链100讲:无多签硬件钱包,如何实现以太坊通证的多签合约?
查看>>
java常用设计模式
查看>>
Hibernate:Hibernate的三种查询方式
查看>>
Long值的比较
查看>>
整合spring cloud云架构-SSO单点登录之OAuth2.0根据token获取用户信息(4)
查看>>
CTO职场解惑指南系列(一)
查看>>
阿里开发者招聘节 | 面试题14:如何实现两金额数据相加(最多小数点两位)...
查看>>
Java高并发高性能分布式框架从无到有微服务架构设计
查看>>
spring源码学习之整合Mybatis原理分析
查看>>
linux 目录结构-文件类型-ls-alias
查看>>
PHP 短路运算 优先级问题 综合面试题
查看>>
selinux-firewalld
查看>>
环境变量PATH、cp /mv命令已经文档查看命令
查看>>
集群介绍 ..
查看>>
别开心太早,Python 官方文档的翻译差远了
查看>>
Python实战项目:39行代码打造数字战舰游戏
查看>>
python基础:常用的内置方法
查看>>
centos7安装mongodb
查看>>
redis(3):redis如何做队列
查看>>