作WEB应用,假如你没有任何对数据库的操做,那么你的应用将一无事处,为何这么说,由于你全部的业务数据没有办法存储,因此数据库在WEB应用当中是占有至关重要的地位的.java
那么在Jfinal中,WEB应用他应该如何去实现的了?在实现这个过程中,咱们应该注意些什么样的细节了.在这些细节当中,又会有那些个坑在等着咱们了?数据库
为了能让咱们更加好的去处理Jfinal与数据库之间的关系,咱们今儿有必要去看看关于这方面的一些个事情. 咱们若是使用过SSH的话,应该对那些个XML文件配置会比较熟悉,好比Spring的类实例的注入,好比Hibernate的实体映射什么的.一样的,在Jfinal中也同样,虽然咱们不用设置那么多的选项,也不用去写那些个XML文件,可是咱们仍是要作一些个必要的配置操做的. 首先,咱们要解决的就是数据库链接的问题,若是有使用过JDBC的同窗们应该知道,咱们与数据库操做的第一步就是使用Connection来链接咱们须要的数据库,固然这些都是原理上的东西,后来咱们使用框架的时候又接触了链接池,无论使用什么原理去连接数据库,咱们都须要紧紧的记住一点,咱们须要配置数据库的地址和数据库用户名和密码. 在DEMO中咱们应该看到一个在”WEB-INF”下面的a_little_config.txt文件,其实这个就是咱们数据库的一些个配置,只不过是用这样的形式来表演而已。app
咱们就从这个地方开始分析,在Jfinal使用数据的时候,是在何时进行加载数据库的配置,又在什么状况下进行实体和表进行对应的。框架
a_little_config.txt加载的时机 这个我以为不用过多的说明了吧,猜都能猜到是在容器启动的时候进行加载的。因此今天这个不是咱们讨论的重点,重点在于,他怎么加载的,以什么样的形式加载,在内存中他是以什么样的形式去表现的等等。 点开咱们的Jfinal.java,找到ide
<!-- lang: java --> Config.configJFinal(jfinalConfig);
看到这个方法了吧,在这个方法里面,就把咱们须要设置的全部Jfinal相关配置都作了一次设置。由于这个JfinalFilter也算是一个过滤器,他在容器启动的时候,他只会去执行一次,这样的操做,因此,他的做用是否是有点和WEB.xml中的做用相似?这下你是否是应该知道点什么东西了?为神马JFinal要把这个Config对象中设立一个相似ConfigPlugin的方法,就是为了让你可以拓展你本身的Plugin,那你会问这样和在配置WEB.Xml中的有什么区别么?额,由于你在xml中配置了这样的配置:函数
<!-- lang: java --> <filter-mapping> <filter-name>jfinal</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
由于你的url-pattern是咱们看到的这个,你若是在再这个地方陪其余的东西,可能会出现冲突,具体什么冲突,我没有试过,因此,假如你想要拓展你本身的Plugin,我建议你仍是本身写一个,完了再Config中进行加载。 回到咱们讨论的话题: 在咱们进入了Config对象的时候,咱们能够看到性能
<!-- lang: java --> jfinalConfig.configConstant(constants);
jfinalConfig,此时的jfinalConfig就会调用你项目中的那个Config对象,而后进行多态调用。 你还记得你在你本身项目中的配置中有这么一句话么,ui
<!-- lang: java --> loadPropertyFile("a_little_config.txt");
这个就是去调用你的那个数据库的配置文件。 F3进入这个方法,而后你看看都有啥this
<!-- lang: java --> public Properties loadPropertyFile(String file) { ... InputStream inputStream = null; String fullFile; // String fullFile = PathUtil.getWebRootPath() + file; if (file.startsWith(File.separator)) fullFile = PathKit.getWebRootPath() + File.separator + "WEB-INF" + file; else fullFile = PathKit.getWebRootPath() + File.separator + "WEB-INF" + File.separator + file; ...
}url
看到这个函数了吧,他返回的是用Properties对象,也就是说,在内存当中,他是以这样的方式去存的,不知道Properties对象的同窗请自行查看JavaSE的API,在这就很少说了 还有要说的就是,为何这个配置文件须要放在WEB-INF当中,由于他代码就是这么写的,而后你照着作就行了! 看完这个之后,咱们看看
<!-- lang: java --> public void configPlugin(Plugins me) { C3p0Plugin c3p0Plugin = new C3p0Plugin(getProperty("jdbcUrl"), getProperty("user"), getProperty("password").trim()); me.add(c3p0Plugin); // 配置ActiveRecord插件 ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin); me.add(arp);
... }
看到了吧,在Jfinal中,数据库的连接是由这些个数据库链接池组件来提供的,为甚么要这样,提升性能,减小创建数据库链接的时间,由于咱们知道,数据库链接的创建是很消耗资源的。而后咱们设置这个数据库链接池的一些个基本配置,什么URL,什么用户名,什么密码之类的; 在咱们的数据库链接池创建好之后,咱们就能够为ActiveRecord提供这些创建好的资源,而后就去创建数据库的连接什么的。 到此,咱们的第一步就作好了!数据库的连接池已经有了!那么如今咱们看第二部,表和实体映射,也就是咱们平时所说的ORM,嘿嘿… 看以下代码:
<!-- lang: java --> public ActiveRecordPlugin addMapping(String tableName, String primaryKey, Class<? extends Model<?>> modelClass) { tableMappings.add(new TableInfo(tableName, primaryKey, modelClass)); return this; }
AddMapping,就是添加实体与表的映射关系,其实你看就明白,这个ORM对应的关系是存储在TableInfo中的。 经过咱们本身配置ORM,咱们就获得了TableInfo实例,而后全部的Plugin都是去实现IPLUGIN的start()方法,去按照预约的方式去启动相应的过程。 就那咱们这个ActiveRecordMapping来讲,在咱们添加了ORM这关系之后,他确定会去执行start()方法。这样在咱们容器启动的过程,咱们就完成了实体和表的映射关系。 不信?有代码为证...
<!-- lang: java --> public boolean start() { if (isStarted) return true; if (dataSourceProvider != null) dataSource = dataSourceProvider.getDataSource(); if (dataSource == null) throw new RuntimeException("ActiveRecord start error: ActiveRecordPlugin need DataSource or DataSourceProvider"); DbKit.setDataSource(dataSource); isStarted = true; return TableInfoBuilder.buildTableInfo(tableMappings); }
上面的代码告诉咱们,ActiveRecord启动的过程当中,是TableInfoBuilder类来为提供创建表-实体映射提供动力的。 至此 咱们这个数据库连接创建和数据库ORM创建的过程就算完成了!欢迎关注...后期将继续深刻挖掘框架背后的故事。