基于Hibernate实现Android与MySql的交互

1.1总述
Android客户端与服务器交互时,通过JavaWeb的思想,使用HttpServlet进行数据的响应和处理,在访问数据库方面,使用Hibernate框架进行与数据库的交互并获取数据再传输回请求的客户端。其思想如图1.1所示
在这里插入图片描述
图1.1服务端数据架构
1.2数据接收
接收的数据是根据Hibernate所需要的参数设置的数据结构,是数据的核心,无论接收还是回传,都是利用Message类作为媒介。定义数据包Message
类其参数如下:

参数名 类型 作用
cmd Int 判断操作的命令字,如:增、删、改、查
className String 提供需要操作哪个类
json String className类的json数据(以数组进行存储)
数据接受时接受一个Message类,然后将Message传送到数据解析层进行解析。
1.3数据解析
解析时分三个步骤:

  1. 获取className并转化为Class类
  2. 解析json数据
  3. 判断命令字
    在获取到Message类时,先创建其所属的类,然后通过Gson进行json数据的解析并转化为类的数组,最后判断所需要的操作。
    1.4访问数据库
    Hibernate提供的访问数据库的方法简单易用,拿到数据对象数组后,遍历数组,然后调用其相关的方法即可。
    1.5数据回传
    当解析完数组并拿到其结果后就要进行数据回传,开启输出流将Message类传输回请求的客户端。
private ThreadServer server;
    private Gson gson;//json
    public BaseDaoServlet(){
        super();
        server = new ThreadServer();
        gson = new Gson();
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String msg = request.getParameter("msg"); //接受msg参数
        System.out.println(msg);
        Message message = gson.fromJson(msg,Message.class);  //利用json转化为Message类

        Analysis.AnalysisDataBase(message);           //对Message类进行解析处理
        msg = gson.toJson(message);                  //处理后将其转化为新的msg作为结果返回
        String finalMsg = msg;
        System.out.println(finalMsg);
        response.getOutputStream().write(finalMsg.getBytes(StandardCharsets.UTF_8));  //向外输出数据

Analysis类
 private static DataBaseDao baseDao ;
    public static Message AnalysisDataBase(Message message){
        Gson gson = new Gson();
        Class classofjs = null;
        try {
            classofjs = Class.forName(message.getClassName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Object[] objects;
        baseDao = new DataBaseDao();
        switch (message.getCmd()) {
            case Cmd.INSERT:
                objects = gson.fromJson(message.getJson(), TypeToken.getArray((Type) classofjs).getType());
                System.out.println(objects);
                if (objects != null) {
                    baseDao.Insert(objects);
                    message.setCmd(Cmd.SUCCESS);
                }
                break;
            case Cmd.SELECT:
                Map wheres = gson.fromJson(message.getJson(), new TypeToken<Map<String, Object>>() {}.getType());
                List objs = baseDao.Select(wheres,classofjs);
                message.setJson(gson.toJson(objs));
                message.setCmd(Cmd.SUCCESS);
                break;
            case Cmd.UAPATE:
                objects = gson.fromJson(message.getJson(), TypeToken.getArray((Type) classofjs).getType());
                System.out.println(objects);
                if (objects != null) {
                    baseDao.UpDate(objects);
                    message.setCmd(Cmd.SUCCESS);
                }
                break;
            case Cmd.DELETE:
                objects = gson.fromJson(message.getJson(), TypeToken.getArray((Type) classofjs).getType());
                System.out.println(objects);
                if (objects != null) {
                    baseDao.Delete(objects);
                    message.setCmd(Cmd.SUCCESS);
                }
                break;
                default:System.out.println("0000");
        }
        return message;
}

DataBaseDao类
private volatile static SessionFactory sf = new Configuration().configure().buildSessionFactory();

//    public DataBaseDao(){
//        sf = new Configuration().configure().buildSessionFactory();
//        Session session = sf.openSession();
//    }

    public void Insert(T[] objs){
        Session session = sf.getCurrentSession();
        session.beginTransaction();
        Arrays.asList(objs).forEach((session::save));
        session.getTransaction().commit();
        session.close();
    }

    public List Select(Map<String,Object> wheres,Class classinfo){
        List objs;
        Session session = sf.openSession();
        session.beginTransaction();
        DetachedCriteria dc = DetachedCriteria.forClass(classinfo);
        wheres.forEach((column,values)->{
            dc.add(Restrictions.eq(column,values));
            System.out.println(column+"  "+values);
        });

        Criteria c = dc.getExecutableCriteria(session);

        session.getTransaction().commit();

        objs = c.list();

        return objs;
    }

    public void UpDate(T[] objs){
        Session session = sf.openSession();
        session.beginTransaction();

        Arrays.asList(objs).forEach(session::update);

        session.getTransaction().commit();
        session.close();
    }
    public void Delete(T[] objs){
        Session session = sf.openSession();
        session.beginTransaction();

        Arrays.asList(objs).forEach(session::delete);

        session.getTransaction().commit();
        session.close();
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/** * YDL_Hibernate概要 <br/> * (一)支持功能: 1.自动建表,支持属性来自继承类:可根据注解自动完成建表,并且对于继承类中的注解字段也支持自动建表. 2.自动支持增删改 * ,增改支持对象化操作:增删改是数据库操作的最基本单元,不用重复写这些增删改的代码,并且添加和更新支持类似于hibernate中的对象化操作. * 3.查询方式灵活:支持android框架提供的方式,也支持原生sql方式. * 4.查询结果对象化:对于查询结果可自动包装为实体对象,类似于hibernate框架. * 5.查询结果灵活:查询结果支持对象化,也支持结果为List<Map<String,String>>形式,这个方法在实际项目中很实用,且效率更好些. * 6.日志较详细:因为android开发不支持热部署调试,运行报错时可根据日志来定位错误,这样可以减少运行Android的次数. <br/> * (二)不足之处: <br/> * 1.id暂时只支持int类型,不支持uuid,在sqlite中不建议用uuid. * 2.现在每个方法都自己开启和关闭事务,暂时还不支持在一个事务中做多个操作然后统一提交事务. <br/> * (三)作者寄语:<br/> * 昔日有JavaScript借Java发展,今日也希望AHibernateHibernate之名发展. * 希望这个项目以后会成为开源社区的重要一员,更希望这个项目能给所有Android开发者带便利. * 欢迎访问我的博客:http://blog.csdn.net/linglongxin24, * 这里有这个框架的使用范例和源码,希望朋友们多多交流完善这个框架,共同推动中国开源事业的发展,YDL_Hibernate期待与您共创美好未来!!! */

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值