SpringBoot2 结合BeetlSQL开发
为什么是SpringBoot2:SpringBoot自从正式版发布以来,受到了众多的关注和追捧。在2.0出来之后,已经与1.X有了很多不同之处。当然也是为了追赶潮流,直接上了2.0作为本文基础框架,当然1.X的版本也是可以使用的。
为什么是BeetlSql:这是一个在国内还没有那么火的DAO工具,根据官网的说法:“ 它是一个超过MyBatis的全功能Java DAO工具,同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求工具能自动能生成大量常用的SQL的应用。”。本人抱着试一试的想法用此框架进行Demo开发,感觉不错。并且已经用于公司的实战中。该框架与MyBatis以及Hibernate的 网上可以搜索到,本人就不赘述。
在SpringBoot已经出到2.0正式版之后,利用SpringBoot的特点,结合BeetlSQL的优势,可以快速的搭建一个实战级别的项目架构。
话不说多,我们开始吧!
首先开始照常,先搭建一个SpringBoot2的框架。可以新建一个maven project。在pom.xml中引入
2.0.X, 不管X是几,只要是正式版都行。
引入spring-boot-starter-web。排除tomcat是为了打war包放入外部tomcat的时候少生成内嵌tomcat的包或者用其他内嵌容器(比如jetty或者undertow),当然可以直接用内嵌的tomcat来调试。
引入内嵌容器undertow。该容器经过大神的对比,据说是内嵌容器中性能优化的比较好的。并且引入mysql驱动。(BeetlSQL本身并没有mysql驱动,故需要引入)。
关键的来了,引入了beetl的Starter。这个依赖相对于 以前的spring boot结合beetlsql来说, 要方便许多。为什么这么说呢?以前的引入方式是这样的。
不仅是多个依赖,还要在类中加入各种代码。比如下面的 beetlsqlrepository所在路径配置
还有下面的qlManager工厂类配置,如数据库配置,加载SQL文件路径配置等
这些用了Starter之后,也可以放在application配置文件中了
当然datasource还是要另外写配置类
好了。配置部分完成。开始代码实战。请原谅我借用下官网的实体类
为了快速尝试BeetlSQL,需要准备一个Mysql数据库或者其他任何beetlsql支持的数据库,然后执行如下sql脚本
CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(64) DEFAULT NULL,`age` int(4) DEFAULT NULL,`userName` varchar(64) DEFAULT NULL COMMENT '用户名称',`roleId` int(11) DEFAULT NULL COMMENT '用户角色',`create_date` datetime NULL DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
编写一个Pojo类,与数据库表对应(或者可以通过SQLManager的gen方法生成此类,参考一下节)
import java.math.*;
import java.util.Date;/*
*
* gen by beetlsql 2016-01-06
*/
public class User {private Integer id ;private Integer age ;//用户角色private Integer roleId ;private String name ;//用户名称private String userName ;private Date createDate ;}
生成pojo 和 md文件
SQLManager sqlManager = new SQLManager(style,loader,cs,new DefaultNameConversion(), new Interceptor[]{new DebugInterceptor()});
//sql.genPojoCodeToConsole("userRole"); 快速生成,显示到控制台
// 或者直接生成java文件
GenConfig config = new GenConfig();
config.preferBigDecimal(true);
config.setBaseClass("com.test.User");
sqlManager.genPojoCode("UserRole","com.test",config);
接下来。。。。。。当然是数据访问层的类了,强大的BeetlSQL发挥实力的地方到了
不需要实现类,为何,因为BaseMapper封装了增删改查。查看BaseMapper的源码可以看到:
/**
* BaseMapper.
*
* @param <T>
* the generic type
*/
public interface BaseMapper<T> {
/**
* 通用插入,插入一个实体对象到数据库,所以字段将参与操作,除非你使用ColumnIgnore注解
* @param entity
*/
void insert(T entity);
/**
* (数据库表有自增主键调用此方法)如果实体对应的有自增主键,插入一个实体到数据库,设置assignKey为true的时候,将会获取此主键
* @param entity
* @param autDbAssignKey 是否获取自增主键
*/
void insert(T entity,boolean autDbAssignKey);
/**
* 插入实体到数据库,对于null值不做处理
* @param entity
*/
void insertTemplate(T entity);
/**
* 如果实体对应的有自增主键,插入实体到数据库,对于null值不做处理,设置assignKey为true的时候,将会获取此主键
* @param entity
* @param autDbAssignKey
*/
void insertTemplate(T entity,boolean autDbAssignKey);
/**
* 批量插入实体。此方法不会获取自增主键的值,如果需要,建议不适用批量插入,适用
* <pre>
* insert(T entity,true);
* </pre>
* @param list
*/
void insertBatch(List<T> list);
/**
* (数据库表有自增主键调用此方法)如果实体对应的有自增主键,插入实体到数据库,自增主键值放到keyHolder里处理
* @param entity
* @return
*/
KeyHolder insertReturnKey(T entity);
/**
* 根据主键更新对象,所以属性都参与更新。也可以使用主键ColumnIgnore来控制更新的时候忽略此字段
* @param entity
* @return
*/
int updateById(T entity);
/**
* 根据主键更新对象,只有不为null的属性参与更新
* @param entity
* @return
*/
int updateTemplateById(T entity);
/**
* 根据主键删除对象,如果对象是复合主键,传入对象本生即可
* @param key
* @return
*/
int deleteById(Object key);
/**
* 根据主键获取对象,如果对象不存在,则会抛出一个Runtime异常
* @param key
* @return
*/
T unique(Object key);
/**
* 根据主键获取对象,如果对象不存在,返回null
* @param key
* @return
*/
T single(Object key);
/**
* 根据主键获取对象,如果在事物中执行会添加数据库行级锁(select * from table where id = ? for update),如果对象不存在,返回null
* @param key
* @return
*/
T lock(Object key);
/**
* 返回实体对应的所有数据库记录
* @return
*/
List<T> all();
/**
* 返回实体对应的一个范围的记录
* @param start
* @param size
* @return
*/
List<T> all(int start,int size);
/**
* 返回实体在数据库里的总数
* @return
*/
long allCount();
/**
* 模板查询,返回符合模板得所有结果。beetlsql将取出非null值(日期类型排除在外),从数据库找出完全匹配的结果集
* @param entity
* @return
*/
List<T> template(T entity);
/**
* 模板查询,返回一条结果,如果没有,返回null
* @param entity
* @return
*/
<T> T templateOne(T entity);
List<T> template(T entity,int start,int size);
void templatePage(PageQuery<T> query);
/**
* 符合模板得个数
* @param entity
* @return
*/
long templateCount(T entity);
/**
* 执行一个jdbc sql模板查询
* @param sql
* @param args
* @return
*/
List<T> execute(String sql,Object... args);
/**
* 执行一个更新的jdbc sql
* @param sql
* @param args
* @return
*/
int executeUpdate(String sql,Object... args );
SQLManager getSQLManager();
/**
* 返回一个Query对象
* @return
*/
Query<T> createQuery();
/**
* 返回一个LambdaQuery对象
* @return
*/
LambdaQuery<T> createLambdaQuery();
}
通用的方法全有,并且注释还是中文(毕竟是国人开发的)。具体可以看官方 文档。当然,一个项目不会只需要基础的增删改查,还有统计,分页,多表查询等等。不要急,一切都会有的。
复杂的sql可以写在md格式的Sql文件里面。放在application配置中间中的sqlPath属性指定的路径中。 比如我们已经指定了/sql这个路径。它具体会放在src/main/resources/sql中。
如图,我们先做一个查询的例子:
- 采用md格式,===上面是sql语句在本文件里的唯一标示,下面则是sql语句。
- @ 和回车符号是定界符号,可以在里面写beetl语句。
- "#" 是占位符号,生成sql语句得时候,将输出?,如果你想输出表达式值,需要用text函数,或者任何以db开头的函数,引擎则认为是直接输出文本。
- isEmpty是beetl的一个函数,用来判断变量是否为空或者是否不存在.
- 文件名约定为类名,首字母小写。
具体说明详见官方网站的文档。这个唯一标识则可以用过
public List select(String sqlId, Class clazz) 根据sqlid来查询,这些方法来使用。
BeetlSQL提供了使用page函数或者pageTag标签,这样才能同时获得查询结果集总数和当前查询的结果。这当然是放在/sql文件夹中的md文件里面、
queryNewUser
===
select
@pageTag(){
a.*,b.name role_name
@}
from user a left join b ...
怎么样,使用原生sql的方式是不是一目了然?Sql放在md文件中也会比Mybatis的xml方式更加的简洁明了,也会比 注解方式写入Sql更加能够减少代码行数。
BeetlSQL还提供了Debug打印sql语句的能力
所有的sql都可以获取执行的语句和参数,执行时间,执行结果。不需要人为另外操作就可以轻松掌握自己写的sql语句是否有错误或者有优化的空间。
当然BeetlSQL还有更多强大的功能。
SpringBoot2 结合BeetlSQL开发相关推荐
- Springboot2 D3 SpringBoot开发实用篇 - 热部署 - 配置高级 - 测试
SpringBoot开发实用篇 运维实用篇完结以后,开发实用篇采用日更新的形式发布给各位小伙伴,基本上是每天一集,目前已经发布完毕. 开发实用篇中因为牵扯到SpringBoot整合各种各样的技 ...
- 十五、SpringBoot2核心技术——web开发(模块引擎Thymeleaf)_下
一.thymeleaf语法说明 1.1.标签与属性 问题: 通过前面的案例,可以发现似乎所有HTML5标签的属性都有一个对应的thymeleaf属性,到底是不是这样的呢? 因为thymeleaf的表达 ...
- SpringBoot2.0基础案例分类总结,后续更新计划说明
一.基础案例 1.基础案例概览 历时一个半月,SpringBoot2.0基础案例的文章基本更新完毕了,基础案例包含了SpringBoot的基础教程,高级应用,日志配置,数据库使用,事务管理等.关于Sp ...
- springboot2初期笔记存档
SpringBoot2 1 springboot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. 该框架使用了特定的方式 ...
- 【Spring Boot 分享】开源项目【8个】
SSM商城系统-非常详细-[原创][开源] 基于springboot+layui的在线教育平台系统 springboot2整合vue开发在线音乐网站[源码开源+完整视频教程] 基于Springboot ...
- github桌面版_GitHub 上周 JavaScript 趋势榜项目
1. yemount/pose-animator 项目地址:https://github.com/yemount/pose-animator ⭐stars:4237 | forks:354 | 211 ...
- app商城源码_海量的SpringBoot和SSM项目【附带源码+视频教程】快速成为全栈
为了帮助更多的小伙伴进行项目的锻炼,孟哥整理较多的实战项目,包括SSM.Springboot.Springcloud.小程序等. 各种项目还在不断的更新中--仅限制学习使用,若有侵权,请联系删除. 点 ...
- springboot crm客户关系管理系统【源码好又多】
项目的介绍: springboot crm客户关系管理系统 系统的说明: CRM-智能办公 项目引见: - 本应用是一个客户关系管理系统,主要包括五大模块,分别是营销dsf管理,客户管理,效劳管理,统 ...
- 【书单】可能会写很久,不过稍有规模时候,就会放送
那么久的时间以后,我希望我想让看到的那个谁,还在....... 先随意写写啊,然后再慢慢整理!(比如,有时间配图以及大概的读后感) 太没流了系列 如果历史是群喵 ~ ~~(1至5 全集 在路上~~~! ...
- 基于javaweb的crm客户关系管理系统(java+springboot+echarts+freemarker+layui+mysql)
基于javaweb的crm客户关系管理系统(java+springboot+echarts+freemarker+layui+mysql) 运行环境 Java≥8.MySQL≥5.7 开发工具 ecl ...
最新文章
- LIVE 预告 | 快手宋洋:千亿特征,万亿参数,快手推荐精排模型的发展史
- 华宇输入法linux,华宇拼音输入法DEB版能切换为五笔输入法,附操作方法
- python经典小游戏-python零基础入门的小游戏。
- 【项目管理】敏捷开发项目管理流程
- 2013.11.18—2013.11.22周总结
- 输入一个正整数n,计算s=1-1/3+1/5-1/7…前n项之和
- android数据存放map_Android存储数据到本地文件
- mysql多表查询取出最后的数据_数据库多表查询,如何取A表中最后一个数据在B表中进行查找?...
- ipv6单播地址包括哪两种类型_IPV6中为啥没有ARP了呢?一文带你搞懂NDP邻居发现协议...
- [React-Native]环境配置amp;HelloWorld
- 在Java中通过线程池实现异步执行
- C++验证奇偶性时求余运算%和位运算的速度比较
- mac 长时间锁屏后进入无声音
- 安装ubuntu黑屏,修复分区表
- 深入理解Character Region Awareness for Text Detection (CRAFT)
- 人可以活很多次,但是七年就是一辈子
- C# NPOI 导出Excel
- MySql通过Data恢复数据库数据
- STM32彩灯控制器
- 关于主机的思维导图_思维导图正流行,现在教孩子还不晚(实操篇)
热门文章
- 【NLP】学不会打我 半小时学会基本操作 13 孪生网络
- SCSA---信息安全概述
- java jdk api文档在哪里下载_JDK API文档下载
- 《算法》第四版中文——学习资料
- 推荐几个代码自动生成器,神器
- Altium designer--DB接口DB9/DB15/DB25/DB37/DB50
- 新翔绩效考核系统 v2022
- 锐起无盘服务器改dns,锐起无盘多配置教程-菜鸟版(老鸟飘过)
- linux服务器运行dyna,dynamips分布式实现详解
- python open mode_open文件操作之mode模式剖析