2018-01-23 22:32
Db.tx() 源码搬过来,我们一起来瞅瞅
/**
* Execute transaction.
* @param config the Config object
* @param transactionLevel the transaction level
* @param atom the atom operation
* @return true if transaction executing succeed otherwise false
*/
boolean tx(Config config, int transactionLevel, IAtom atom) {
Connection conn = config.getThreadLocalConnection();
if (conn != null) { // Nested transaction support
try {
if (conn.getTransactionIsolation() < transactionLevel)
conn.setTransactionIsolation(transactionLevel);
boolean result = atom.run();
if (result)
return true;
throw new NestedTransactionHelpException("Notice the outer transaction that the nested transaction return false"); // important:can not return false
}
catch (SQLException e) {
throw new ActiveRecordException(e);
}
}
Boolean autoCommit = null;
try {
conn = config.getConnection();
autoCommit = conn.getAutoCommit();
config.setThreadLocalConnection(conn);
conn.setTransactionIsolation(transactionLevel);
conn.setAutoCommit(false);
boolean result = atom.run();
if (result)
conn.commit();
else
conn.rollback();
return result;
} catch (NestedTransactionHelpException e) {
if (conn != null) try {conn.rollback();} catch (Exception e1) {LogKit.error(e1.getMessage(), e1);}
LogKit.logNothing(e);
return false;
} catch (Throwable t) {
if (conn != null) try {conn.rollback();} catch (Exception e1) {LogKit.error(e1.getMessage(), e1);}
throw t instanceof RuntimeException ? (RuntimeException)t : new ActiveRecordException(t);
} finally {
try {
if (conn != null) {
if (autoCommit != null)
conn.setAutoCommit(autoCommit);
conn.close();
}
} catch (Throwable t) {
LogKit.error(t.getMessage(), t); // can not throw exception here, otherwise the more important exception in previous catch block can not be thrown
} finally {
config.removeThreadLocalConnection(); // prevent memory leak
}
}
}
2018-01-23 16:16
.txt 类型的
#for(record : recordList)
----------#(for.count)START----------
学生=#(record.userName)
班级=#(record.className)
课程=#(record.courseName)
教师=#(record.teacherName)
教室=#(record.classRoomName)
预约时间=#date(record.createTime, "yyyy-MM-dd HH:mm")
状态=#(record.type)
请假备注=#(record.remark)
签到情况=#(record.sign)
签到时间=#date(record.signTime")
----------#(for.count)END----------
#end
2018-01-23 09:47
@三圣乡吴彦祖 可以的,文件后缀名叫xx.csv就可以了, 这个分享只是做一个示例,可以导出任何以模版渲染的文本。
就xls与csv相比,做复杂的表头,是一件很麻烦的事情,而且Office是可以把表格文件另存为“.html”的, 这个时候,直接使用这个html当作模版文件,进行数据动态化就可以了。
当然实现这个功能的软件有很多,只是觉得这个学习成本低比较易用。
就我自己使用来说,在数据准备好的情况下,使用这个做导出不要10分钟就完事了,而POI怎么搞也得几个点了,而且做调试预览,这个模版本身就是html, 所以render("xxx.html");浏览器直接请求就能立马看见结果了
2018-01-18 13:55
@macaque 是的, 只要下载下来的时候用Excel打开(会有安全提示非常的不爽),再按保存的时候会提示这个文件是只读文件的,需要另存为,这个时候Excel就保存为真的xls文件了
2018-01-18 11:53
@macaque 是的, 只是下了个html后缀为 .xls 的文件,
这个html的格式是从Excel中导出来,套用的, 所以兼容性,还可以,都能打开。
因为很多时候只是想导出数据,而不是非得弄个真的XLS文件,所以这个比POI导出XLS方便些