引言
Jfinal不但可以适应web项目,非web项目一样表现很突出。
场景
B/S项目日益增加,而很多需求用C/S也一样可以实现,其实一些简单的需求java也一样可以实现,java也有界面,哈哈那就是不被大家看好的Swing,但是对于java控来说,可能用java这门熟悉的语言实现功能,比起用C++或者C#来的快和稳。
怎么样是不是看起来也没有想象的那么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事物回滚");
}
}
有什么此类问题的延伸问题可以留言_先说这么多。