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字段的首个格子(如下图所示)。

打包成jar包

打包虽然成功了,但是运行失败,提示如下:

Error: Invalid or corrupt jarfile activerecord.jar

解决方法: MANIFEST.MF的路径一定要选对。

问题2:Could not find or load main class

解决方法:

 

Maven打包

打包时遇到问题:Error while generating Javadoc

解决方法:那就先不打包 Javadoc。如下图,把这一部分先注释。

 

 

 

 

附件:失败的过程

先建立一个基本工程

具体步骤见我在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 目录。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值