Jfinal2.2如何写Java非web项目

引言

Jfinal不但可以适应web项目,非web项目一样表现很突出。

场景

B/S项目日益增加,而很多需求用C/S也一样可以实现,其实一些简单的需求java也一样可以实现,java也有界面,哈哈那就是不被大家看好的Swing,但是对于java控来说,可能用java这门熟悉的语言实现功能,比起用C++或者C#来的快和稳。


用javaSwing写的C/S程序(数据库索引字段查询工具)

怎么样是不是看起来也没有想象的那么low至少能用

使用篇

说明:本篇只介绍关于Jfinal2.2如何在非web环境下使用。

①配置

  • 首先配置文件的加载
  • 数据库的配置(本篇会说明多数据源的配置)

代码实现

public static void addAllConfig(){
        PropKit.use("jyd_config.txt");//jfinal加载配置文件
        JdbcPool.setOrclPool("ORCL"); //自定义数据源类
 }
/**
 * jdbc连接池的加载
 * @author lenovo_lin
 */
public class JdbcPool {
    //记录添加的所有连接池
    public static List<PoolInfo> poolInfos = new ArrayList<PoolInfo>();
    
    public static void setOrclPool(String poolName){
        DruidPlugin dp = new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password")); 
        ActiveRecordPlugin arp = new ActiveRecordPlugin(poolName,dp);
        arp.setTransactionLevel(4);//ORCL数据库在Jfinal2.2中默认事物处理等级被调成6,这里咱们给调回来10g不支持6会报错
        arp.setDialect(new OracleDialect());//切记配置方言
        dp.start(); 
        arp.start();//非web项目要开启插件 
        PoolInfo poolInfo = new PoolInfo();
        poolInfo.setPoolName(poolName);
        poolInfo.setDruid(dp);
        poolInfo.setActiveRecord(arp);
        poolInfos.add(poolInfo);
    }
    public static void setSqlLitePool(String poolName){
        DruidPlugin dp = new DruidPlugin("jdbc:sqlite:my.db",null,null);
        dp.setDriverClass("org.sqlite.JDBC");
        ActiveRecordPlugin arp = new ActiveRecordPlugin(poolName,dp);
        dp.start(); 
        arp.start();
        PoolInfo poolInfo = new PoolInfo();
        poolInfo.setPoolName(poolName);
        poolInfo.setDruid(dp);
        poolInfo.setActiveRecord(arp);
        poolInfos.add(poolInfo);    
    }
}

②仅介绍Db+Record方式实现增删改查

  • Record可以理解为通用mybatis里的resultMap,一个灵活的映射结果集。
  • Db不用多说也就是咱们之前配置的数据源。
  • 我建议用如下方式书写便于代码维护。

代码实现

  • 查询
public List<Record> getExamTask(){
    return Db.use("ORCL").find("select * from dbname");
}
  • 添加
public boolean createExamTask(String taskName,Date startTime,Date endTime,ExamType type){
        String uuid = StringUtil.getUUID();//生成唯一主键的线程安全的类
        Record record = new Record();
        record.set("ID", uuid);
        record.set("EXAMTASKNAME", taskName);
        record.set("BAK", taskName);
        record.set("TYPEID", type.toString());
        return Db.use("ORCL").save("examtask","ID",record);//注明ID是主键
    }
  • 修改
public boolean updateExamTask(String id,String taskName,Date startTime,Date endTime,ExamType type) throws IdCantNullException{
        if(id==null){
            throw new IdCantNullException("Id不能为空");//自定义异常
        }
        Record record = new Record();
        record.set("ID", id);
        if(startTime!=null){
            record.set("STARTTIME", DateUtil.myFmt5.format(startTime));//格式化日期格式
        }
        if(endTime!=null){
            record.set("ENDTIME", DateUtil.myFmt5.format(endTime));
        }
        if(taskName!=null){
            record.set("EXAMTASKNAME", taskName);
            record.set("BAK", taskName);
        }
        record.set("CREATEDATE", DateUtil.myFmt2.format(new Date()));
        return Db.use("ORCL").update("examtask", "ID", record);
    }
  • 删除
public boolean deleteExamTask(String id){
        return Db.use("ORCL").update("delete examtask where id = ?",id)>0;
    }

③Jfinal非web项目事物的控制

  • 事物的回滚机制在非web项目里很有必要。
  • 如何即使用Jfinal的Db+Record方式操作数据库,又可以回滚事物。
  • 其原理就是修改Jfinal默认事物提交方式为手动控制提交。

代码实现

  • 第一步添加如下类到项目中
/**
 * jfinal事物的手动开启
 * JFinalKit.beginTran("sqllite");//开始事物
 * JFinalKit.commit("sqllite");   //提交事物
 * JFinalKit.rollback("sqllite"); //事物回滚
 * @author lenovo_lin
 */
public class JFinalKit {
    public static void beginTran() {
        try {
            DbKit.getConfig().setThreadLocalConnection(DbKit.getConfig().getConnection());
            DbKit.getConfig().getThreadLocalConnection().setAutoCommit(false);
        } catch (Exception e) {
            throw (new RuntimeException(e));
        }
    }
    public static void commit() {
        try {
            DbKit.getConfig().getThreadLocalConnection().commit();
            DbKit.getConfig().getThreadLocalConnection().setAutoCommit(true);
            DbKit.getConfig().setThreadLocalConnection(null);
        } catch (Exception e) {
            throw (new RuntimeException(e));
        }
    }
    public static void beginTran(String configName) {
        try {
            DbKit.getConfig(configName).setThreadLocalConnection(DbKit.getConfig(configName).getConnection());
            DbKit.getConfig(configName).getThreadLocalConnection().setAutoCommit(false);
        } catch (Exception e) {
            throw (new RuntimeException(e));
        }
    }
    public static void commit(String configName) {
        try {
            DbKit.getConfig(configName).getThreadLocalConnection().commit();
            DbKit.getConfig(configName).getThreadLocalConnection().setAutoCommit(true);

            DbKit.getConfig(configName).setThreadLocalConnection(null);
        } catch (Exception e) {
            throw (new RuntimeException(e));
        }
    }
    public static void rollback(){
        try {
            DbKit.getConfig().getThreadLocalConnection().rollback();
            DbKit.getConfig().setThreadLocalConnection(null);
        } catch (Exception e) {
            throw (new RuntimeException(e));
        }
    }
    public static void rollback(String configName){
        try {
            DbKit.getConfig(configName).getThreadLocalConnection().rollback();
            DbKit.getConfig(configName).setThreadLocalConnection(null);
        } catch (Exception e) {
            throw (new RuntimeException(e));
        }
    }
}
  • 第二步在需要添加事物的代码中这样使用
public void clearInfo(JLabel jlb){
        JFinalKit.beginTran("sqllite");
        System.out.println("clearInfo事物开启");
        try{
            List<Record> tables1 = Db.use("sqllite").find("SELECT * FROM sqlite_master where type = 'table' and name = 'KSKM'");
            List<Record> tables2 = Db.find("SELECT * FROM sqlite_master where type = 'table' and name = 'KSXX'");
            List<Record> tables3 = Db.find("SELECT * FROM sqlite_master where type = 'table' and name = 'CheckInfo'");
            if(tables1.size()==1)
            Db.use("sqllite").update("DELETE FROM KSKM");
            if(tables2.size()==1)
            Db.use("sqllite").update("DELETE FROM KSXX");
            if(tables3.size()==1)
            Db.use("sqllite").update("DELETE FROM CheckInfo");  
            JFinalKit.commit("sqllite");
            jlb.setText("删除成功!");
            System.out.println("clearInfo事物提交");
        }catch(Exception e){
            e.printStackTrace();
            JFinalKit.rollback("sqllite");
            jlb.setText("删除失败!");
            System.out.println("clearInfo事物回滚");
        }
    }

有什么此类问题的延伸问题可以留言_先说这么多。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,478评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,825评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,482评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,726评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,633评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,018评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,168评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,320评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,264评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,288评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,995评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,587评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,909评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,284评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,862评论 2 339

推荐阅读更多精彩内容