Jfinal2.2如何写Java非web项目

引言

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

场景

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


Jfinal2.2如何写Java非web项目_第1张图片
用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 poolInfos = new ArrayList();
    
    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 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 tables1 = Db.use("sqllite").find("SELECT * FROM sqlite_master where type = 'table' and name = 'KSKM'");
            List tables2 = Db.find("SELECT * FROM sqlite_master where type = 'table' and name = 'KSXX'");
            List 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事物回滚");
        }
    }

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

你可能感兴趣的:(Jfinal2.2如何写Java非web项目)