简单快速了解

Beetl 是前端视图填充数据的工具,是个页面模板,可以像 el 表达式那样操作数据,jsp 那样公共代码引用,很多好用的方法。官方模板对比:

清楚一点,beetl 很好用,但是用 beetl,最好就不要再用 jsp 什么的模板了。

BeetlSQL 操作数据库的框架,类似 Hibernate 那样直接通过对象操作数据的增删改查,简单操作,而且,像 Mybatis 那样侧重 sql,你可以在 md 文件(就是 mapper.xml)修改优化 sql 语句,而且 sql 语句的拼接判断语法,可以用 beetl 中的方法表达式,类似 js 使用很方便。官方性能对比:

快速入门开发

环境:

jdk8

maven 3.5.4

Spring5 快速接入

Beetl 接入

1.新建 maven 项目,pom.xml 文件:

1.8

1.8

1.8

UTF-8

5.0.8.RELEASE

1.2.17

1.6.11

javax.servlet

javax.servlet-api

3.1.0

provided

org.springframework

spring-context

${spring.version}

org.springframework

spring-test

${spring.version}

org.springframework

spring-core

${spring.version}

org.springframework

spring-beans

${spring.version}

org.springframework

spring-web

${spring.version}

org.springframework

spring-webmvc

${spring.version}

org.springframework

spring-expression

${spring.version}

org.springframework

spring-context-support

${spring.version}

org.springframework

spring-jdbc

${spring.version}

log4j

log4j

${log4j.version}

com.ibeetl

beetl

2.8.5

ROOT

org.apache.tomcat.maven

tomcat7-maven-plugin

2.1

UTF-8

8080

/

2.java 代替 web.xml的启动类 配置:

public class ApplicationInit implements WebApplicationInitializer {

@Override

public void onStartup(ServletContext servletContext) {

AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();

context.register(AppConfig.class);

context.setServletContext(servletContext);

ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(context));

servlet.setLoadOnStartup(1);

servlet.addMapping("/");

servlet.setAsyncSupported(true);

}

}

3.springmvc配置文件用 java 配置:

@Configuration

@EnableWebMvc

@ComponentScan(value = "com.*")

@PropertySource(value = "classpath:config.properties")

public class AppConfig implements WebMvcConfigurer{

private static final Logger logger = LoggerFactory.getLogger(AppConfig.class);

@Override

public void addResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/statics/**")

.addResourceLocations("/statics")

.setCachePeriod(31556926);

}

/***

* beetl配置

*/

@Bean(name = "beetlConfig", initMethod = "init")

public BeetlGroupUtilConfiguration getBeetlGroupUtilConfiguration() {

logger.info("##### GENERATE BeetlGroupUtilConfiguration BEAN #####");

BeetlGroupUtilConfiguration beetlGroupUtilConfiguration = new BeetlGroupUtilConfiguration();

beetlGroupUtilConfiguration.setRoot("/WEB-INF/view");

return beetlGroupUtilConfiguration;

}

/**

* beetl视图解析器

*

* @return

*/

@Bean(name = "viewResolver")

public BeetlSpringViewResolver getBeetlSpringViewResolver(BeetlGroupUtilConfiguration beetlConfig) {

logger.info("##### GENERATE BeetlSpringViewResolver BEAN #####");

BeetlSpringViewResolver beetlSpringViewResolver = new BeetlSpringViewResolver();

beetlSpringViewResolver.setConfig(beetlConfig);

;

beetlSpringViewResolver.setContentType("text/html;charset=UTF-8");

beetlSpringViewResolver.setSuffix(".html");

return beetlSpringViewResolver;

}

}

4.测试,写一个 Controller,向 request 放入属性,解析视图:

controller

@GetMapping("/")

public String test(HttpServletRequest req) {

req.setAttribute("test", "SUCCESS");

return "index";//返回 /WEB-INF/view 下的 index.html

}

index.html

首页

Hello

${test}

请求页面显示:

这样,spring5 已经整合了 beetl,好像没啥特别的好,没有对比就没有伤害,来个代码显示 beetl 的好用:

@for(user in users){

${user.name}${user.age}

@}elsefor{

没有数据

@}

${user.name}${user.age}

额不知道写对了没,恩还是看个人喜好吧,@是 beet 语法的开始定界符,结束定界符是回车,默认不是这个,可以在 classpath 下的 beetl.properties 中修改:

DELIMITER_STATEMENT_START=@

DELIMITER_STATEMENT_END=

BeetlSQL 接入

1.在 pom 中添加 beetlsql 和数据源的依赖:

1.8

1.8

1.8

UTF-8

5.0.8.RELEASE

1.2.17

1.6.11

javax.servlet

javax.servlet-api

3.1.0

provided

org.springframework

spring-context

${spring.version}

org.springframework

spring-test

${spring.version}

org.springframework

spring-core

${spring.version}

org.springframework

spring-beans

${spring.version}

org.springframework

spring-web

${spring.version}

org.springframework

spring-webmvc

${spring.version}

org.springframework

spring-expression

${spring.version}

org.springframework

spring-context-support

${spring.version}

org.springframework

spring-jdbc

${spring.version}

org.aspectj

aspectjrt

${aspectj.version}

org.aspectj

aspectjweaver

${aspectj.version}

mysql

mysql-connector-java

5.0.5

com.alibaba

druid

1.0.15

log4j

log4j

${log4j.version}

com.ibeetl

beetl

2.8.5

com.ibeetl

beetlsql

2.10.30

ROOT

org.apache.tomcat.maven

tomcat7-maven-plugin

2.1

UTF-8

8080

/

注意:beetlsql 的版本是 2.10.30,如果用之前的版本,太早的不能逆向生成 dao,有些会有不兼容的情况,如 beetlsql-2.10.29+druid-1.1.10 会产生SQLFeatureNotSupportedException 异常等。连接

现在可以测试逆向生成 pojo 和 mapper 了:

新建一个测试类:

public static void main(String[] args) throws Exception {

ConnectionSource source = ConnectionSourceHelper.getSimple("com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/catenate?useUnicode=true&characterEncoding=utf8&useSSL=false", "root", "root");

DBStyle mysql = new MySqlStyle();

// sql语句放在classpagth的/mapper 目录下

SQLLoader loader = new ClasspathLoader("/mapper");

// 数据库命名跟java命名一样,所以采用DefaultNameConversion,还有一个是UnderlinedNameConversion,下划线风格的,

UnderlinedNameConversion unc = new UnderlinedNameConversion();

// 最后,创建一个SQLManager,DebugInterceptor 不是必须的,但可以通过它查看sql执行情况

SQLManager sqlManager = new SQLManager(mysql,loader,source,unc, new Interceptor[]{new DebugInterceptor()});

// sqlManager.genPojoCodeToConsole("bg_admin"); //快速生成,显示到控制台

// 或者直接生成java文件

//pojo代码生成配置

GenConfig config = new GenConfig();

//忽略表前缀bg_admin默认为BgAdmin,忽略bg为Admin

config.setIgnorePrefix("bg");

//dao代码生成配置,无参构造会有默认的模板

MapperCodeGen mapper = new MapperCodeGen();

String mapperTemplatePath = mapper.getMapperTemplate();

//有参构造出传入的是dao生成所在的包,但是没有模板,生成后是空白

mapper=new MapperCodeGen("com.catenate.dao");

//把有参构造的模板位置,放入有参构造,这样可以设置dao的生成位置,又不会空白

mapper.setMapperTemplate(mapperTemplatePath);

//添加Dao代码生成

config.codeGens.add(mapper);

sqlManager.setBaseMapper(BaseMapper.class);

//生成所有,慎用,会覆盖

sqlManager.genALL("com.catenate.pojo", config, null);

}

其实上面代码可以直接些模板位置,就在beetlsql依赖包下,可以写成下面这样:

MapperCodeGen mapper = new MapperCodeGen("com.catenate.dao");

mapper.setMapperTemplate(new GenConfig().getTemplate("/org/beetl/sql/ext/gen/mapper.btl"));

生成文件:

小测一下:

ConnectionSource source = ConnectionSourceHelper.getSimple("com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/catenate?useUnicode=true&characterEncoding=utf8&useSSL=false", "root", "root");

DBStyle mysql = new MySqlStyle();

// sql语句放在classpagth的/sql 目录下

SQLLoader loader = new ClasspathLoader("/mapper");

// 数据库命名跟java命名一样,所以采用DefaultNameConversion,还有一个是UnderlinedNameConversion,下划线风格的,

UnderlinedNameConversion unc = new UnderlinedNameConversion();

// 最后,创建一个SQLManager,DebugInterceptor 不是必须的,但可以通过它查看sql执行情况

SQLManager sqlManager = new SQLManager(mysql,loader,source,unc, new Interceptor[]{new DebugInterceptor()});

//使用内置sql查询用户

int id = 1;

Admin admin = sqlManager.unique(Admin.class,id);

System.out.println("time==>"+admin.getCreateTime());

AdminDao mapper = sqlManager.getMapper(AdminDao.class);

Admin single = mapper.single(1);

System.out.println("password==>"+single.getPassword());

beetlSql的核心就是SQLManager,包含很多方法,可以阅读官网文档

2.添加 java 配置文件,添加数据源配置,和 beetlsql 的配置:

@Configuration

@PropertySource({"classpath:config.properties"})

public class DataSourceConfig {

@Value("${datasource.exam.url}")

private String examUrl;

@Value("${datasource.exam.username}")

private String examUserName;

@Value("${datasource.exam.password}")

private String examPassword;

@Value("${datasource.maxActive}")

private int maxActive;

@Value("${datasource.initialSize}")

private int initialSize;

@Value("${datasource.maxWaitMillis}")

private long maxWaitMillis;

@Value("${datasource.minIdle}")

private int minIdle;

@Value("${datasource.timeBetweenEvictionRunsMillis}")

private long timeBetweenEvictionRunsMillis;

@Value("${datasource.minEvictableIdleTimeMillis}")

private long minEvictableIdleTimeMillis;

@Value("${datasource.validationQuery}")

private String validationQuery;

@Value("${datasource.testWhileIdle}")

private boolean testWhileIdle;

@Value("${datasource.testOnBorrow}")

private boolean testOnBorrow;

@Value("${datasource.testOnReturn}")

private boolean testOnReturn;

@Bean(value = "examDB")

@Primary

public DataSource getExamDataSource(){

DruidDataSource druidDataSource=new DruidDataSource();

druidDataSource.setName("examDB");

druidDataSource.setUrl(examUrl);

druidDataSource.setUsername(examUserName);

druidDataSource.setPassword(examPassword);

//druidDataSource配置

druidDataSource.setMaxActive(maxActive);

druidDataSource.setInitialSize(initialSize);

druidDataSource.setMaxWait(maxWaitMillis);

druidDataSource.setMinIdle(minIdle);

druidDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);

druidDataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);

druidDataSource.setValidationQuery(validationQuery);

druidDataSource.setTestWhileIdle(testWhileIdle);

druidDataSource.setTestOnBorrow(testOnBorrow);

druidDataSource.setTestOnReturn(testOnReturn);

return druidDataSource;

}

}

@Configuration

public class SQLManagerConfig {

@Bean(name = "examSqlManager")

@Primary

public SqlManagerFactoryBean getSqlManagerFactoryBean(@Qualifier("examDB")DataSource master){

SqlManagerFactoryBean factoryBean=new SqlManagerFactoryBean();

BeetlSqlDataSource source=new BeetlSqlDataSource();

source.setMasterSource(master);

factoryBean.setCs(source);

factoryBean.setDbStyle(new MySqlStyle());

//开启驼峰

factoryBean.setNc(new UnderlinedNameConversion());

//sql文件路径

factoryBean.setSqlLoader(new ClasspathLoader("/mapper"));

return factoryBean;

}

/**

* 配置包扫描

* @return

*/

@Bean(name = "examSqlScannerConfigurer")

public BeetlSqlScannerConfigurer getBeetlSqlScannerConfigurer() {

BeetlSqlScannerConfigurer conf = new BeetlSqlScannerConfigurer();

conf.setBasePackage("com.catenate.dao");

conf.setDaoSuffix("Dao");

conf.setSqlManagerFactoryBeanName("examSqlManager");

return conf;

}

}

3.web测试

修改 Controller

@Autowired

private SQLManager sqlManager;

@Autowired

private AdminDao adminDao;

@GetMapping("/")

public String test(HttpServletRequest req) {

// AdminDao adminDao=null;

// try {

// adminDao = sqlManager.getMapper(AdminDao.class);

// } catch (Exception e) {

// // TODO Auto-generated catch block

// e.printStackTrace();

// }

req.setAttribute("test", adminDao.single(1));

return "index";

}

可以直接注入Dao,或者注入 SQLManager,当 Dao 的方法满足不了的时候,可以用 SQLManager 来执行,SQLManager包含 Dao的所有方法

修改 index.html

首页

Hello

${test.name}

访问,页面显示

admin,就是从数据库 bg_admin中查询出来的主键为1的数据。

目录结构:

Spring Boot 快速接入

深入了解

待续。。。

java beetl输出demo_Beetl 快速入门相关推荐

  1. 好程序员Java培训分享如何快速入门Java编程

    好程序员Java培训分享如何快速入门Java编程,作为老牌编程语言,Java拥有广阔的市场应用,企业对Java人才的需求一直居高不下.有很多非专业.零基础的人想要学习Java却不知道怎么快速入门,接下 ...

  2. android java教程_[Java教程]Android开发快速入门

    [Java教程]Android开发快速入门 0 2020-12-22 18:01:40 Xamarin.Android 应用程序剖析 以下屏幕截图列出了解决方案的内容. 下面是一个解决方案资源管理器, ...

  3. java akka 教程_快速入门 Akka Java 指南

    快速入门 Akka Java 指南 Akka 是一个用于在 JVM 上构建高并发.分布式和容错的事件驱动应用程序的运行时工具包.Akka 既可以用于 Java,也可以用于 Scala.本指南通过描述 ...

  4. java beetle_Beetle Web框架快速入门.pdf

    BeetleWeb框架快速入门 简介1 运行环境1 安装配置1 入门示例2 简介 BeetleWeb是一个基于J2EE标准Servlet 容器技术构建的请求驱动式的MVC 快速开发 Web框架.它功能 ...

  5. Java Persistence API:快速入门

    各位读者好! 在我的一些朋友提出无数请求之后,我决定写一篇关于Java Persistence API的简短文章. 面向对象的编程范式是当​​今最流行和使用最广泛的模型,它具有无缝建模现实生活实体的能 ...

  6. Java任务调度之Quartz快速入门

    首先所谓的任务调度指的是软件系统在从某个时间节点开始,以固定的频率,除去特定的某些时间段,定期执行某项任务,比如可以在某个夜深人静的时候做一些大批量的文件传输.备份等耗费极大资源的工作,那么通过这个概 ...

  7. java fx 教程_JavaFX快速入门

    1- 前提条件 在本文中,将学习如何在 Eclipse IDE 开发和执行JavaFX编程. e(fx)eclipse e(fx)eclipse是一组工具和必要的库,它们帮助您执行JavaFX编程,确 ...

  8. 黑马JAVA P182 TCP通信快速入门

    package com.itheima.d5_socket1;import java.io.IOException; import java.io.OutputStream; import java. ...

  9. Java如何学才能快速入门(零基础入门)

    对于初入Java的伙伴们来说,都会有一个疑惑?我适合学习编程吗? 编程入门遇到难题的时候想到过放弃,当你写完一个程序的时候感到内心的欣慰,这都取决你自己. 对于初学者来说(或者每一种编程语言)都会有这 ...

  10. 【Java】流(Stream)快速入门

    本文是面向Java初学者的流(Stream)学习指导教程.文章内容偏向怎么用,而弱化其诞生背景.流的概念.内部原理等说明解释性的语段. 主要内容: Optional 创建流 操作流 收集流 目录 什么 ...

最新文章

  1. 使用机智云APP控制战舰V3 (转)
  2. 面对996,程序员如何利用“碎片时间”涨薪?
  3. React-项目-引入外部的样式(14)
  4. linux中python如何调用matlab的数据_?如何在Python中加入多个数据帧?
  5. Android IPC机制(五)用Socket实现跨进程聊天程序
  6. java之的读取文件大全
  7. Note that ‘/home/w/.local/share‘ is not in the search pathset by the XDG_DATA_HOME and XDG_DATA_DIRS
  8. tolua集成lua-protobuf库
  9. dell服务器设置bios设置u盘启动不了系统,详解戴尔通过BIOS设置U盘启动的技巧
  10. 脱壳之aspack压缩壳
  11. SAP mbew 标准价和移动平均价
  12. 论文笔记-对话系统综述
  13. iperf for linux 使用方法
  14. imu matlab,IMU姿态解算matlab
  15. 【BPF入门系列-4】如何在 BPF 程序中正确地按照 PID 过滤?
  16. 深析 | 手机摄像产业趋势—多摄/TOF/高倍变焦或成行业新风口
  17. C语言初学知识准备(Linux方面)
  18. 闲话网名之“J0ker”
  19. 北华大学计算机考研资料汇总
  20. Tenth season second episode,Ross is fine about Rachel and Joey?Chandler and Monica e going to adopt?

热门文章

  1. python--mysql创建数据库
  2. linux种子搜索关键字,基于 DHT 网络的磁力链接和BT种子的搜索引擎架构
  3. xp系统共享文件夹免密码访问设置
  4. 情怀java手机网游_Java开发游戏马里奥,就要码出我们这一代人的情怀
  5. 09.第十章.项目沟通和干系人管理
  6. Word/Excel快捷键F4(重复上次操作)失效的解决办法
  7. 速度曲线规划 ---- 梯形速度曲线
  8. Magick.NET图片处理:解决png转jpg背景色为黑色的问题(设置背景色)
  9. js禁止中文输入 最简洁的【禁止输入中文】
  10. c# 使用正则表达式 提取章节小说正文全本篇