当前位置:  软件>java软件

O/R Mapping中间件 kamike.db

    来源:    发布时间:2014-12-28

    本文导语:  昨天写的O/R mapping中间件,用了下感觉效果不错,开源了贡献给大家吧。 有兴趣的可以在我的blog里面一起讨论。 -------------------------- 删除了很多对其他包的引用,现在应该是最小可用的版本了。 索性opensource...

昨天写的O/R mapping中间件,用了下感觉效果不错,开源了贡献给大家吧。

有兴趣的可以在我的blog里面一起讨论。

--------------------------


删除了很多对其他包的引用,现在应该是最小可用的版本了。

索性opensource,LGPL协议,欢迎大家试用。这玩意最大的优点,就是只是一个工具,而不是框架,所以与标准的JDBC和preparedstatement结合的很顺畅,能大幅度降低jdbc写法的工作量,

不过个人还是建议,写入用orm,读取在合适的时候稍微用一下绑定数据的DTO的代码,所以提供了GenericSelect类和GenericUpdate的rawSql函数,方便大家自己拼where的sql,真遇到复杂的select查询,大家还是别指望了,其实hibernate甚至nutzDAO也都指望不上的。

这个工具包,彻底贯彻了读写分离的思想,如果实现读取,需要继承GenericReader,如果实现写入,继承GenericWriter。

而且闲的蛋疼,把自动创建表和数据库也加上了。具体代码参考GenericCreator。

 

刚刚有更新了,修改了几个bug


依赖的包,主要是为了支持mysql和连接池,如果不用的话也可以删掉,修改SysDbInst的代码就行:

c3p0-0.9.2.1
cos-26Dec2008
guava-15.0
mchange-commons-java-0.2.3.4
mysql-connector-java-5.1.18-bin

下面贴一个具体的实现:代码在github的com.kami.console包下面.

关于最麻烦的Select操作,可以参考如下:

新建一个继承了BaseReader的对象,具体如何在自己的DAO用这个工具可以参考find(TestTable t)的实现,这个find(TestTable t)只是一个例子,无任何实际意义。在这里面也可以随意添加findByXXX的方法。

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.kami.console;

import com.kamike.db.SysDbInst;
import com.kamike.db.generic.BaseReader;
import com.kamike.db.generic.GenericSelect;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author THiNk
 */
public class TestTableReader extends BaseReader {

    public TestTableReader(String dbName) {
        super(dbName);
    }

    @Override
    public GenericSelect createSelect() {

        return new TestTableSelect();
    }

    @Override
    public GenericSelect createSelect(TestTable t) {
        return new TestTableSelect(t);
    }

    
    public long count(T t) {
        GenericSelect select = createSelect();

        ResultSet rs = null;
        PreparedStatement ps = null;
        Connection conn = null;

        long ret = 0;
        try {
            conn = SysDbInst.getInstance().getDatabase().getSingleConnection();
            ps = conn.prepareStatement(select.countSQL(select.rawSql(dbName)+ "where t.count=? "), ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ps.setLong(1, t.getCount());//这里的查询参数的绑定,只能自己动手,丰衣足食了。
            rs = ps.executeQuery();
            ret = select.count(rs);

        } catch (Exception e) {
            ret =0;
            System.out.println(this.getClass().getName() + e.toString());

        } finally {
            try {
                if (rs != null) {
                    rs.close();
                    rs = null;
                }
                if (ps != null) {
                    ps.close();
                    ps = null;
                }
                if (conn != null) {
                    conn.close();
                    conn = null;
                }
            } catch (SQLException ex) {
                Logger.getLogger(BaseReader.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return ret;
    }

    @Override
    public ArrayList find(TestTable t) {
        GenericSelect select = createSelect();

        ResultSet rs = null;
        PreparedStatement ps = null;
        Connection conn = null;

        ArrayList ret = null;
        try {
            conn = SysDbInst.getInstance().getDatabase().getSingleConnection();
            ps = conn.prepareStatement(select.rawSql(dbName) + "where t.count=? ", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ps.setLong(1, t.getCount());//这里的查询参数的绑定,只能自己动手,丰衣足食了。
            rs = ps.executeQuery();
            ret = select.fetch(rs);

        } catch (Exception e) {
            ret = new ArrayList();
            System.out.println(this.getClass().getName() + e.toString());

        } finally {
            try {
                if (rs != null) {
                    rs.close();
                    rs = null;
                }
                if (ps != null) {
                    ps.close();
                    ps = null;
                }
                if (conn != null) {
                    conn.close();
                    conn = null;
                }
            } catch (SQLException ex) {
                Logger.getLogger(BaseReader.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return ret;

    }

}

然后是实体对象定义:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.kami.console;

import com.kamike.db.generic.FieldLength;
import com.kamike.db.generic.FieldName;
import com.kamike.db.generic.Id;
import com.kamike.db.generic.TableName;
import java.util.Date;

/**
 *
 * @author THiNk
 */
@TableName("test_table")
public class TestTable {

    @Id
    @FieldName("id")
    @FieldLength(64)
    private String id;

    @FieldName("count")
    private long count;

    @FieldName("name")
    @FieldLength(255)
    private String name;

    @FieldName("ready")
    private boolean ready;

    @FieldName("create_date")
    private Date createDate;

    /**
     * @return the id
     */
    public String getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * @return the count
     */
    public long getCount() {
        return count;
    }

    /**
     * @param count the count to set
     */
    public void setCount(long count) {
        this.count = count;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the ready
     */
    public boolean isReady() {
        return ready;
    }

    /**
     * @param ready the ready to set
     */
    public void setReady(boolean ready) {
        this.ready = ready;
    }

    /**
     * @return the createDate
     */
    public Date getCreateDate() {
        return createDate;
    }

    /**
     * @param createDate the createDate to set
     */
    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
}

然后要实现GenericSelect需要的几个对象new的方法,重载一下GenericSelect。。万恶的Java半吊子泛型。。

/*
 *  就写一个new。。不过两个构造器,有参的无参的都要这么实现,还有调用父类的构造器
 */
package com.kami.console;

import com.kamike.db.generic.GenericSelect;

/**
 *
 * @author THiNk
 */
public class TestTableSelect extends GenericSelect {

    public TestTableSelect(TestTable t) {
        super(t);
    }

    public TestTableSelect() {
        super();
    }

    @Override
    public TestTable create() {
        return new TestTable();
    }

}

然后就是调用了。

   //查询测试
           TestTableReader tts=new TestTableReader("kamike");
           TestTable template=new TestTable();
           template.setCount(500);
           ArrayList testList=tts.find(template);



    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • python内置映射类型(mapping type):dict哈希字典遍历方式及其它用法举例
  • bean转化的利器 mapping4java
  • 什么 mapping shared 哦?赐教
  • 请教:Linux2.6.30内核中 NAT做UDP mapping 时映射保持多长时间?
  • 知道为什么的帮个忙解释一下:1、weblogic里面的web.xml和tomcat里面的web.xml配置为什么不同?2,是不是一定要指定servlet-mapping映射一个别名,并用那个映射名访问,而用原来那个名不行???
  • IIS下Zend 出现 Unable to view file mapping 问题的解决方法汇总


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3