jfinal ActiveRecord 独立工程
前言
这个模块是 “java jfinal 框架” 的重要功能,操作数据库的接口,所以,必须搞得很清楚明白。
参考ActiveRecord官方文档: https://gitee.com/jfinal/activerecord
步骤
1.从官方仓库(https://gitee.com/jfinal/activerecord)下载activerecord独立项目源码。
2.解压后打开该工程,直接编译。
打开 activerecord /src /test /java /com /jfinal /plugin /activerecord /ActiveRecordDemo.java 文件,就可以看到数据库的名称,用户名,密码:
把这些参数改成你的数据库。
3.运行错误:com.mysql.jdbc.Driver
com.alibaba.druid.pool.DruidDataSource error 之 com.mysql.jdbc.Driver
解决方法:检查数据库的版本好,比如这里的是
而依赖里的却是
换成大于等于的版本号即可。
4.运行错误:Unknown database 'test'
com.alibaba.druid.pool.DruidDataSource error 之 Unknown database 'test'
mysql 中自带的 mysql 库可以连接查询,没有问题,自己创建的数据库就不行。
解决方法:
“是不是安装了禅道! 如果是,那你找到服务里的 mysqlzt 然后禁止,然后重启电脑 再连接试试,我这样操作成功了”
其实,这次把这个禅道的服务停止,问题就不再出现了。
还在把它关掉吧,不然,下次开机它是会运行的,方法如下:
选中“mysqlzt”,再点击齿轮状的设置按钮,如下:
双击改行,就会进入属性设置,在里面可以把启动选项改为“禁止”。
5.运行错误:The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone.
解决方法:
在配置文件中的数据库url中添加 serverTimezone=UTC 参数即可,如下图,参数间用 & 分隔开来。(应该是mysql8.0以后的版本才会出现这个问题。)
6.运行错误: Public Key Retrieval is not allowed
解决方法:
最简单的解决方法是在连接后面添加 allowPublicKeyRetrieval=true,如下
文档中(https://mysql-net.github.io/MySqlConnector/connection-options/)给出的解释是:(应该是8.0之后的版本才出现的问题)
如果用户使用了 sha256_password 认证,密码在传输过程中必须使用 TLS 协议保护,但是如果 RSA 公钥不可用,可以使用服务器提供的公钥;可以在连接中通过 ServerRSAPublicKeyFile
指定服务器的 RSA 公钥,或者AllowPublicKeyRetrieval=True
参数以允许客户端从服务器获取公钥;但是需要注意的是 AllowPublicKeyRetrieval=True
可能会导致恶意的代理通过中间人攻击(MITM)获取到明文密码,所以默认是关闭的,必须显式开启
7.运行错误:java.sql.SQLSyntaxErrorException: Table 'test.blog' doesn't exist
解决方法:意思是缺少这个表格,加进去就好。
具体可使用工具 Navicat for MySQL 来添加,步骤比较多,这里就不展开,详细步骤见我的另外一篇文章《Navicat for MySQL 详细教程》。
8.sql文件打开提示No data sources are configured to run this SQL and provide advanced
解决方法:
其实这个提示,并不影响你敲代码,你可以手动通过其它数据库客户端工具来执行这些sql命令创建数据表结构。但是对于强迫症如我的这样子,并不能容忍~于是:
1.打开Database侧边栏,File–>setting–>appearance 来打开,勾选 Show tool window bars
2.添加一个数据库的连接配置,我本机安装的是Mysql,所以如下图所示配置:
3.填好后,点击Test Connection,
如果MySQL驱动没有装,就会提示你装驱动。
做完这些后,提示果然没有了,如下:
9. activerecord.Model.findFirst 出错。
解决方法:看意思,应改是找不到表格的第一项。
最后发现,原来是不小心把路径注释了,如下:
把注释的双斜杆去掉就行。
10.问题:File not found in CLASSPATH or JAR
解决方法:
把 test.sql 复制到放了许多 *.class 文件的目录下 target\classes\com\jfinal\plugin\activerecord\
11.又出现了一个新问题:com.jfinal.plugin.activerecord.Model.findFirst
解决方法:运行一下_Generator工程就可以了。
到此,工程全部运行正常,再也没有出现问题了。
成功运行的情况如下:
问题12. Public Key Retrieval is not allowed
解决方法:
最简单的解决方法是在连接后面添加 allowPublicKeyRetrieval=true
运行_Generator
前面运行的是 activerecord /src /test /java /com /jfinal /plugin /activerecord /ActiveRecordDemo.java 工程,现在来运行
activerecord /src /test /java /com /jfinal /plugin /activerecord /_Generator.java 工程。
1.出现了问题: Skip table blog because there is no primary key
解决方法:那就用Navicat打开数据库填入一个主键,
然后这个问题就不会出现啦。
2.接着又出现了一个错误: 找不到符号。
解决方法:先注释掉吧。反正也只是打印而已。
到了这一步,_Generator 终于运行正常了。而且反过来运行 ActiveRecordDemo 工程,之前的 com.jfinal.plugin.activerecord.Model.findFirst 问题也没有了。
ActiveRecord的使用
经过上面的步骤,_Generator 和ActiveRecordDemo 两个工程都可以正常使用了,接下来,就要使用它了,那么,该怎么去使用呢。
如下图,
1.里面的 findBlog,对应的是 test.sql文件里#sql("findBlog")里的 findBlog。
2. System.out.println(blog.getTitle()); 这一句,打印的是数据库 title字段的首个格子(如下图所示)。
附件:失败的过程
先建立一个基本工程
具体步骤见我在CSDN写的另外一篇文章《java jfinal框架: hello world》https://blog.csdn.net/zhuohui307317684/article/details/112225799
添加依赖
加入libraries: 搜索关键词“com.jfinal”
添加源码(可选步骤):
有些问题,网上搜索也找不到,其实,有问题直接看源码更容易解决问题,还能举一反三,融会贯通。
点开“Edit...”
这三项默认是没有选的,把它们选上。
额外说明:
下图中,com.jfinal:activerecord:4.9.06 是被 com.jfinal:jfinal:4.9.06 所包含的,所以,如果有了后者,可以把前者去掉。
删掉的好处:删掉后,代码跳转就不需要再次选择跳到哪一个库啦。
pom.xml加入:
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>activerecord</artifactId>
<version>4.9.06</version>
</dependency>
加入示例代码
示例代码来自gitee上的jfinal官方源码: https://gitee.com/jfinal/activerecord
完整一复制进去,会编译不过,所以做了一些修改,如下:
package com.hui.demo;
//import com.jfinal.plugin.activerecord.model.Blog;
//import com.jfinal.plugin.activerecord.model._MappingKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.druid.DruidPlugin;
public class ActiveRecordDemo {
static String jdbcUrl = "jdbc:mysql://localhost/jfinal_demo?useSSL=false&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull";
static String user = "root";
static String password = "yourpassword";
public static DruidPlugin createDruidPlugin() {
DruidPlugin druidPlugin = new DruidPlugin(jdbcUrl, user, password);
return druidPlugin;
}
public static void initActiveRecordPlugin() {
DruidPlugin druidPlugin = createDruidPlugin();
ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
arp.setDevMode(true);
arp.setShowSql(true);
// 添加 sql 模板文件,实际开发时将 sql 文件放在 src/main/resources 下
arp.addSqlTemplate("com/jfinal/plugin/activerecord/test.sql");
// 所有映射在生成的 _MappingKit.java 中自动化搞定
//_MappingKit.mapping(arp);
// 先启动 druidPlugin,后启动 arp
druidPlugin.start();
arp.start();
}
public static void main(String[] args) {
initActiveRecordPlugin();
// 使用 Model
// Blog dao = new Blog().dao();
// Blog blog = dao.template("findBlog", 1).findFirst();
// System.out.println(blog.getTitle());
// 使用 Db + Record 模式
Record record = Db.template("findBlog", 1).findFirst();
System.out.println(record.getStr("title"));
}
}
这样修改后,编译虽然通过了,可是,运行出现了一个问题:
NoClassDefFoundError: com/alibaba/druid/pool/DruidDataSource
意思应该是找不到一个阿里巴巴的一个库。
解决方法:
点进去后,可以看到,源码里用到了一个 alibaba 的包,但却是红色警告,应该就是这里的问题了。
这里特别说明一下,由于我下载了所必须的jar包之后,还下载了java源码,这时,提示jar里的class内容和java源码不一样,如下 图,这里,有一个特别的原则,当有class和源码时,且两者不一样时,会以源码为准,这点和C++工程一个样。
没有办法,只能把依赖库下到本地,不再使用Maven,这样,就不存在jar文件和源码不一样的状况了,也能自己随意修改jfinal源码。(有一个原则,代码只看不改,是没法看懂的。)
1.从官方仓库(https://gitee.com/jfinal/jfinal)下载源码
2.解压后用IDEA打开改工程。
2.解压后放到工程目录下:
3.删掉之前加进来的库;
4.设置为 Sources Root 目录。