Beetl 是前端視圖填充數據的工具,是個頁面模板,能夠像 el 表達式那樣操做數據,jsp 那樣公共代碼引用,不少好用的方法。官方模板對比:html
清楚一點,beetl 很好用,可是用 beetl,最好就不要再用 jsp 什麼的模板了。
BeetlSQL 操做數據庫的框架,相似 Hibernate 那樣直接經過對象操做數據的增刪改查,簡單操做,並且,像 Mybatis 那樣側重 sql,你能夠在 md 文件(就是 mapper.xml)修改優化 sql 語句,並且 sql 語句的拼接判斷語法,能夠用 beetl 中的方法表達式,相似 js 使用很方便。官方性能對比:前端
官方地址:Beetl官網java
環境:mysql
1.新建 maven 項目,pom.xml 文件:git
<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>5.0.8.RELEASE</spring.version> <log4j.version>1.2.17</log4j.version> <aspectj.version>1.6.11</aspectj.version> </properties> <dependencies> <!-- Java Servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- spring 相關start --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!-- spring 相關end --> <!-- 日誌 start --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <!-- 日誌 end --> <!-- beetl模板 --> <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetl</artifactId> <version>2.8.5</version> </dependency> </dependencies> <build> <finalName>ROOT</finalName> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <encoding>UTF-8</encoding> <port>8080</port> <path>/</path> </configuration> </plugin> </plugins> </build>
2.java 代替 web.xml的啓動類 配置:web
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 配置:spring
@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 放入屬性,解析視圖:
controllersql
@GetMapping("/") public String test(HttpServletRequest req) { req.setAttribute("test", "SUCCESS"); return "index";//返回 /WEB-INF/view 下的 index.html }
index.html數據庫
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>首頁</title> </head> <body> <h2>Hello</h2>${test} </body> </html>
請求頁面顯示:express
這樣,spring5 已經整合了 beetl,好像沒啥特別的好,沒有對比就沒有傷害,來個代碼顯示 beetl 的好用:
@for(user in users){ <tr><td>${user.name}</td><td>${user.age}</td></tr> @}elsefor{ <tr><td colspan="2">沒有數據</td></tr> @}
用 <c:forEach>
<c:if test="${!empty users}"> <c:forEach items="${users}" var="user"> <tr><td>${user.name}</td><td>${user.age}</td></tr> </c:forEach> </c:if>
額不知道寫對了沒,恩仍是看我的喜愛吧,@是 beet 語法的開始定界符,結束定界符是回車,默認不是這個,能夠在 classpath 下的 beetl.properties 中修改:
DELIMITER_STATEMENT_START=@ DELIMITER_STATEMENT_END=
1.在 pom 中添加 beetlsql 和數據源的依賴:
<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>5.0.8.RELEASE</spring.version> <log4j.version>1.2.17</log4j.version> <aspectj.version>1.6.11</aspectj.version> </properties> <dependencies> <!-- Java Servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- spring 相關start --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!-- spring 相關end --> <!-- AOP start --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> <!-- AOP end --> <!-- 數據源 start --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.0.5</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.15</version> </dependency> <!-- 數據源 end --> <!-- 日誌 start --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <!-- 日誌 end --> <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetl</artifactId> <version>2.8.5</version> </dependency> <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetlsql</artifactId> <version>2.10.30</version> </dependency> </dependencies> <build> <finalName>ROOT</finalName> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <encoding>UTF-8</encoding> <port>8080</port> <path>/</path> </configuration> </plugin> </plugins> </build>
注意: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
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>首頁</title> </head> <body> <h2>Hello</h2>${test.name} </body> </html>
訪問,頁面顯示
admin,就是從數據庫 bg_admin中查詢出來的主鍵爲1的數據。
目錄結構:
待續。。。