博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JFinal框架操作oracle数据库
阅读量:5874 次
发布时间:2019-06-19

本文共 4267 字,大约阅读时间需要 14 分钟。

hot3.png

JFinal框架操作oracle数据库,需要在configPlugin()方法中配置链接oracle数据库的相关配置

配置JFinal数据库操作插件,configPlugin方法

这里我加载jdbc.properties配置文件实在configConstant加载的

[html] 
  1. @Override  
  2.     public void configConstant(Constants me) {  
  3.         loadPropertyFile("jdbc.properties");//加载配置文件  
  4.         me.setDevMode(getPropertyToBoolean("config.devModel", false));  
  5.         me.setViewType(ViewType.JSP);  
  6.         me.setEncoding("UTF-8");  
  7.     }  

jdbc.properites配置文件

[html] 
  1. oracle.driver=oracle.jdbc.driver.OracleDriver  
  2. oracle.url=jdbc:oracle:thin: :1521:orcl  
  3. oracle.username=scott  
  4. oracle.password=xiaohu  
  5.   
  6. config.devModel=true  

[html] 
  1. @Override  
  2.     public void configPlugin(Plugins me) {  
  3.         ActiveRecordPlugin arp=null;  
  4.         String driver=getProperty("oracle.driver");  
  5.         String url=getProperty("oracle.url");  
  6.         String username=getProperty("oracle.username");  
  7.         String password=getProperty("oracle.password");  
  8.         DruidPlugin dp=new DruidPlugin(url, username, password, driver);  
  9.         me.add(dp);  
  10.         arp=new ActiveRecordPlugin(dp);//设置数据库方言  
  11.         arp.setDialect(new OracleDialect());  
  12.         arp.setContainerFactory(new CaseInsensitiveContainerFactory());//忽略大小写  
  13.         me.add(new EhCachePlugin());  
  14.         arp.addMapping("users", "id",Users.class);  
  15.         me.add(arp);  
  16.     }  
需要注意一点的是,由于oracle数据库中在创建表时,会自动的将所有的字段自动转为大写,因此在避免后面操作的时候出现大小写错误的相关异常,这里需要配置忽略大小写的功能
[html] 
  1. arp.setContainerFactory(new CaseInsensitiveContainerFactory());//忽略大小写  

如果不需要对数据库进行增加操作,则必须配置忽略大小写,如果不配置忽略大小写,在保存源代码的该段代码中会出现属性id找不到的异常

[html] 
  1. /**  
  2.      * Save model.  
  3.      */  
  4.     public boolean save() {  
  5.         Config config = getConfig();  
  6.         Table table = getTable();  
  7.           
  8.         StringBuilder sql = new StringBuilder();  
  9.         List<Object> paras = new ArrayList<Object>();  
  10.         config.dialect.forModelSave(table, attrs, sql, paras);  
  11.         // if (paras.size() == 0)   return false;   // The sql "insert into tableName() values()" works fine, so delete this line  
  12.           
  13.         // --------  
  14.         Connection conn = null;  
  15.         PreparedStatement pst = null;  
  16.         int result = 0;  
  17.         try {  
  18.             conn = config.getConnection();  
  19.             if (config.dialect.isOracle())  
  20.                 pst = conn.prepareStatement(sql.toString(), new String[]{table.getPrimaryKey()});  
  21.             else  
  22.                 pst = conn.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS);  
  23.               
  24.             config.dialect.fillStatement(pst, paras);  
  25.             result = pst.executeUpdate();  
  26.             <span style="color:#ff0000;">getGeneratedKey(pst, table);//如果不配置忽略大小写,执行到这里会出现异常,虽然可以添加到数据库,但是这里报错,界面还是会显示500错误</span>  
[html] 
  1.     getModifyFlag().clear();  
  2.     return result >= 1;  
  3. } catch (Exception e) {  
  4.     throw new ActiveRecordException(e);  
  5. } finally {  
  6.     config.close(pst, conn);  
  7. }  
[html] 
  1. <span style="color:#ff0000;">getGeneratedKey()源代码部分</span>  
[html] 
  1. /**  
  2.      * Get id after save method.  
  3.      */  
  4.     private void getGeneratedKey(PreparedStatement pst, Table table) throws SQLException {  
  5.         String pKey = table.getPrimaryKey();  
  6.         if (get(pKey) == null || getConfig().dialect.isOracle()) {  
  7.             ResultSet rs = pst.getGeneratedKeys();  
  8.             if (rs.next()) {  
  9.                 Class colType = table.getColumnType(pKey);  
  10.                 if (colType == Integer.class || colType == int.class)  
  11.                     set(pKey, rs.getInt(1));  
  12.                 else if (colType == Long.class || colType == long.class)  
  13.                     set(pKey, rs.getLong(1));  
  14.                 else  
  15.                     set(pKey, rs.getObject(1));     // It returns Long object for int colType  
  16.                 rs.close();  
  17.             }  
  18.         }  
  19.     }  
set()源代码部分
[html] 
  1. /**  
  2.      * Set attribute to model.  
  3.      * @param attr the attribute name of the model  
  4.      * @param value the value of the attribute  
  5.      * @return this model  
  6.      * @throws ActiveRecordException if the attribute is not exists of the model  
  7.      */  
  8.     public M set(String attr, Object value) {  
  9.         <span style="color:#ff0000;">if (getTable().hasColumnLabel(attr)) {//执行到这里返回false</span>  
  10.             attrs.put(attr, value);  
  11.             getModifyFlag().add(attr);  // Add modify flag, update() need this flag.  
  12.             return (M)this;  
  13.         }  
  14.         throw new ActiveRecordException("The attribute name is not exists: " + attr);//抛出该异常  
  15.     }  
现在来说说如果不配置,为什么会出现 The attribute name is not exists:这个异常,这是因为oracle中的字段是大写的,而set方法中传入的attr属性的值是小写,而getTable()中的属性对应的就是oracle字段,这些属性则是大写,因此这里使用getTable().hasColumnLabel(attr)判断是否存在该字段,就会找不到,这时就会抛出该异常,因此就必须配置忽略大小写的方法,就不会出现该异常

实体类:

[html] 
  1. package com.tenghu.core.model;  
  2.   
  3. import com.jfinal.plugin.activerecord.Model;  
  4.   
  5. public class Users extends Model<Users>{  
  6.     public static Users dao=new Users();  
  7. }  

操作数据:

[html] 
  1. Users users=new Users();  
  2. users.set("id", "users_sequence.nextval");  
  3. users.set("username", "张三");  
  4. users.set("pwd", "sdfsdfs");  
  5. users.save();  
  6. List<Users> testList=Users.dao.find("select * from users");  

这里就完成了JFinal框架操作oracle数据库,删除和修改就自己去测试了

转载于:https://my.oschina.net/u/140935/blog/325549

你可能感兴趣的文章
Hibernate-Criteria
查看>>
Java 8——接口中个的默认方法和静态方法
查看>>
Selenium操作页面元素
查看>>
Ubuntu 下安装VNC server
查看>>
Bzoj1034 [ZJOI2008]泡泡堂BNB
查看>>
Bzoj4011 [HNOI2015]落忆枫音
查看>>
Linux-环境变量的设置和查看
查看>>
android关于pull解析的问题-1
查看>>
ArcGIS JavaScript API本地部署离线开发环境
查看>>
【bzoj 4455】小星星(树型DP+容斥原理+dfs建树和计算的2种方式)
查看>>
词法分析程序 LEX和VC6整合使用的一个简单例子
查看>>
如何在WinForm中发送HTTP请求
查看>>
亚马逊EC2根硬盘空间扩容
查看>>
洛谷 P2167 [SDOI2009]Bill的挑战
查看>>
G - Rescue 【地图型BFS+优先队列(有障碍物)】
查看>>
几道查询树上点之间的路径的题目
查看>>
259 [LeetCode] 3Sum Smaller 三数之和较小值
查看>>
iOS Xcode7上真机调试
查看>>
基础知识补充
查看>>
Python C扩展
查看>>