Beetl 快速入門

簡單快速瞭解

Beetl 是前端視圖填充數據的工具,是個頁面模板,能夠像 el 表達式那樣操做數據,jsp 那樣公共代碼引用,不少好用的方法。官方模板對比:
clipboard.pnghtml

清楚一點,beetl 很好用,可是用 beetl,最好就不要再用 jsp 什麼的模板了。
BeetlSQL 操做數據庫的框架,相似 Hibernate 那樣直接經過對象操做數據的增刪改查,簡單操做,並且,像 Mybatis 那樣側重 sql,你能夠在 md 文件(就是 mapper.xml)修改優化 sql 語句,並且 sql 語句的拼接判斷語法,能夠用 beetl 中的方法表達式,相似 js 使用很方便。官方性能對比:前端

clipboard.png

官方地址:Beetl官網java

快速入門開發

環境:mysql

Spring5 快速接入

Beetl 接入

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

clipboard.png

這樣,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=

BeetlSQL 接入

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"));

生成文件:

clipboard.png

小測一下:

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());

clipboard.png

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>

訪問,頁面顯示

clipboard.png

admin,就是從數據庫 bg_admin中查詢出來的主鍵爲1的數據。
目錄結構:

clipboard.png

Spring Boot 快速接入

深刻了解

待續。。。

相關文章
相關標籤/搜索