搭建Jfinal+maven项目及若干问题总结

项目准备

在idea环境中,新建maven类型项目,项目类型选择:maven-archetype-webapp,完成后在pom文件中添加如下内容:

 <dependency>
      <groupId>com.jfinal</groupId>
      <artifactId>jfinal-undertow</artifactId>
      <version>1.9</version>
    </dependency>
    <dependency>
      <groupId>com.jfinal</groupId>
      <artifactId>jfinal</artifactId>
      <version>4.7</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.14</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.38</version>
    </dependency>

一次性把mysql驱动、连接池及运行服务器引入,这里选择undertow服务器。

新建项目结构如下所示:

 在[project structure]菜单中,设置好项目代码目录和资源目录。然后在资源目录中引入app.properties文件,作为配置文件。

配置文件内容如下所示:

jdbcUrl=jdbc:mysql://localhost:3306/col?user=root&password=root&useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false
username=
password=

如果jdbcUrl为sqlite单文件类型数据库,则写法有两种:

写法一:相对路径:如果db文件在当前程序主目录的db文件夹下,则写:jdbcUrl=jdbc:sqlite:db/*****.db

写法二:绝对路径:直接写:jdbcUrl=jdbc:sqlite:D:/******/db/******.db

项目配置

新建启动配置文件:Democonfig.java

public class DemoConfig extends JFinalConfig {
    public static Prop prop = PropKit.use("app.properties");

    static DruidPlugin getDruidPlugin() {
        return new DruidPlugin(prop.get("jdbcUrl"), prop.get("username"), prop.get("password").trim());
    }

    public static void main(String[] args) {
        UndertowServer.start(DemoConfig.class, 80, true);
    }

    public void configConstant(Constants me) {
        me.setDevMode(true);
    }
    @Override
    public void configRoute(Routes me) {
        me.add("/name", nameController.class);
    }

    public void configEngine(Engine me) {
    }
    @Override
    public void configPlugin(Plugins me) {
        DruidPlugin druidPlugin = getDruidPlugin();
        druidPlugin.setMinIdle(1);
        druidPlugin.setMaxActive(1);

        // 添加StatFilter
        druidPlugin.addFilter(new StatFilter());
        me.add(druidPlugin);
        ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
        me.add(arp);
        arp.setDialect(new MysqlDialect());
        _MappingKit.mapping(arp);
        arp.setShowSql(prop.getBoolean("devMode", false));
        //配置SQL模板引擎默认文件路径
        arp.getEngine().setSourceFactory(new ClassPathSourceFactory());
    }

    public void configInterceptor(Interceptors me) {
    }

    public void configHandler(Handlers me) {
    }
}

注意,需要在configPlugin函数中引入ActiveRecordPlugin实例,否则会报错:

十一月 03, 2021 2:25:04 下午 com.jfinal.core.ActionHandler error
严重: *****.controller.nameController.select() : /name/select
java.lang.NullPointerException
    at com.jfinal.plugin.activerecord.Model.find(Model.java:692)
    at com.jfinal.plugin.activerecord.Model.find(Model.java:703)
    at com.jfinal.plugin.activerecord.Model.find(Model.java:710)
    at *****.controller.nameController.select(nameController.java:20)

配置文件中引用了nameController,其内容如下:

public class nameController extends Controller {

    public void select() {
        renderText("Welcome To The JFinal World (^_^)");
    }

    public void add() {
        Test test = new Test();
        test.set("name", "w2323");
        test.save();
        renderText("hello");
    }

    public void edit() {
        renderText("hello");
    }

    public void delete() {
        renderText("hello");
    }
}

运行

在Democonfig文件中,点击main方法运行,在浏览器中查看即可:

代码生成

新建文件:ModelGenerator.java,使用jfinal自带的plugin组件生成实体代码。

public class ModelGenerator {
    private static DataSource getDataSource() {
        DruidPlugin druidPlugin = DemoConfig.getDruidPlugin();
        druidPlugin.start();
        return druidPlugin.getDataSource();
    }

    public static void main(String[] args) {
        // base model 所使用的包名
        String baseModelPackageName = "****.***.***.model.base";
        // base model 文件保存路径
        String baseModelOutputDir = PathKit.getWebRootPath() + "/src/main/java/cn/***/model/base";
        // model 所使用的包名 (MappingKit 默认使用的包名)
        String modelPackageName = "****.collect.comoneo.model";
        // model 文件保存路径 (MappingKit 与 DataDictionary 文件默认保存路径)
        String modelOutputDir = baseModelOutputDir + "/..";

        // 创建生成器
        Generator gen = new Generator(getDataSource(), baseModelPackageName, baseModelOutputDir, modelPackageName, modelOutputDir);
        // 设置数据库方言
        gen.setDialect(new MysqlDialect());//Sqlite3Dialect MysqlDialect
        // 设置 BaseModel 是否生成链式 setter 方法
        gen.setGenerateChainSetter(true);
        // 设置是否在 Model 中生成 dao 对象
        gen.setGenerateDaoInModel(true);
        // 设置是否生成字典文件
        gen.setGenerateDataDictionary(true);
        // 配置是否生成字段备注
        gen.setGenerateRemarks(true);
        // 设置需要被移除的表名前缀用于生成modelName。例如表名 "sys_user",移除前缀 "sys_"后生成的model名为 "User"而非 OscUser
        // gernerator.setRemovedTableNamePrefixes("sys_");
        // 生成
        gen.generate();
    }
}

如数据库结构发生变化,运行此文件main即可,注意:代码生成及此处配置使用了MysqlDialect数据库方言,如果连接其他类型的数据库,请修改。

自定义扩展代码生成——加表前缀

package cn.****;

import com.jfinal.plugin.activerecord.generator.MetaBuilder;
import com.jfinal.plugin.activerecord.generator.TableMeta;

import java.util.List;
import javax.sql.DataSource;

public class MyMetaBuilder extends MetaBuilder {
    public MyMetaBuilder(DataSource dataSource, String prefix) {
        super(dataSource);
        model_prefix = prefix;
    }

    private String model_prefix = "";
    
    public List<TableMeta> build() {
        List<TableMeta> x = super.build();
        for (int i = 0; i < x.size(); i++) {
            x.get(i).modelName = model_prefix + x.get(i).modelName;
            x.get(i).baseModelName = model_prefix + x.get(i).baseModelName;
        }
        return x;
    }
}

前端调用:

gen.setMetaBuilder(new MyMetaBuilder(getDataSource(),"my_"));

打包

 <build>
        <finalName>oneo</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <!-- java8 保留参数名编译参数 -->
                    <compilerArgument>-parameters</compilerArgument>
                    <compilerArguments>
                        <verbose/>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <!-- 打包生成的文件名 -->
                            <finalName>oneo</finalName>
                            <!-- jar 等压缩文件在被打包进入 zip、tar.gz 时是否压缩,设置为 false 可加快打包速度 -->
                            <recompressZippedFiles>false</recompressZippedFiles>
                            <!-- 打包生成的文件是否要追加 package.xml 中定义的 id 值 -->
                            <appendAssemblyId>false</appendAssemblyId>
                            <!-- 指向打包描述文件 package.xml -->
                            <descriptors>
                                <descriptor>package.xml</descriptor>
                            </descriptors>
                            <!-- 打包结果输出的基础目录 -->
                            <outputDirectory>${project.build.directory}/</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

备注

在新增时,jfinal框架会在save后自动引入新增实体,不用再次查询,属于自返回类型。在业务编码上确实方便了不少。

posted @ 2021-11-03 14:39  Shapley  阅读(502)  评论(0编辑  收藏  举报