BeetlSQL,简单和强大数据库访问工具(更新)
来源:开源中国 发布日期:2024-07-21
beetlsql 特点
BeetSql是一个全功能DAO工具, 同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求工具能自动能生成大量常用的SQL的应用。
无需注解,自动生成大量内置SQL,轻易完成增删改查功能
数据模型支持Pojo,也支持Map/List这种快速模型,也支持混合模型
SQL 以更简洁的方式,Markdown方式集中管理,同时方便程序开发和数据库SQL调试。
SQL 模板基于Beetl实现,更容易写和调试,以及扩展
简单支持关系映射而不引入复杂的OR Mapping概念和技术。
具备Interceptor功能,可以调试,性能诊断SQL,以及扩展其他功能
内置支持主从数据库,通过扩展,可以支持更复杂的分库分表逻辑
支持跨数据库平台,开发者所需工作减少到最小
5 分钟例子
准备工作
为了快速尝试BeetlSQL,需要准备一个Mysql数据库,然后执行如下sql脚本
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`name` varchar(64) DEFAULT NULL,
`age` int(4) DEFAULT NULL,
`userName` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
编写一个Pojo类,与数据库表对应
public class User {
Integer id;
String name;
Integer age;
public String getName() {
return name;
public void setName(String name) {
this.name = name;
public Integer getId() {
return id;
public void setId(Integer id) {
this.id = id;
public Integer getAge() {
return age;
public void setAge(Integer age) {
this.age = age;
代码例子
写一个java的Main方法,内容如下
// 创建一个简单的ConnectionSource,只有一个master
ConnectionSource source = ConnectionSourceHelper.simple(driver,url,userName,password);
// 采用mysql 习俗
DBStyle mysql = new MysqlStyle();
// sql语句放在classpagth的/sql 目录下
SQLLoader loader = new ClasspathLoader("/sql");
// 数据库命名跟java命名采用驼峰转化
NameConversion nc = newHumpNameConversion();
// 最后,创建一个SQLManager
SqlManager sqlManager = new SqlManager(source,mysql,loader);
//使用内置的生成的sql 新增用户
User user = new User();
user.setAge(19);
user.setName("xiandafu");
sqlManager.insert(user);
//使用内置sql查询用户
int id = 1;
user = sqlManager.unque(User.class,id);
//使用user.md 文件里的select语句,参考下一节
User query = new User();
query.setName("xiandafu");
List
SQL例子
为了能执行user.select,需要在classpath里建立一个user.md 文件,内容如下
select
select * from user where 1=1
@if(!isEmpty(age)){
and age = #age#
@if(!isEmpty(name)){
and name = #name#
关于如何写sql模板,会稍后章节说明,如下是一些简单说明。
@ 和回车符号是定界符号,可以在里面写beetl语句。
"#" 是站位符号,生成sql语句得时候,将输出?,如果你想输出表达式值,需要用text函数,或者任何以db开头的函数,引擎则认为是直接输出文本。
isEmpty是beetl的一个函数,用来判断变量是否为空或者是否不存在.
sql模板采用beetl原因是因为beetl 语法类似js,且对模板渲染做了特定优化,相比于mybatis,更加容易掌握和功能强大。
BeetlSQL 说明
获得SQLManager
SQLManager 是系统的核心,他提供了所有的dao方法。获得SQLManager,可以直接构造SQLManager.并通过过单例获取如:
ConnectionSource source = ConnectionSourceHelper.simple(driver,url,userName,password);
// 采用mysql 习俗
DBStyle mysql = new MysqlStyle();
// sql语句放在classpagth的/sql 目录下
SQLLoader loader = new ClasspathLoader("/sql");
// 数据库命名跟java命名采用驼峰转化
NameConversion nc = newHumpNameConversion();
// 最后,创建一个SQLManager
SqlManager sqlManager = new SqlManager(source,mysql,loader);
更常见的是,已经有了DataSource,创建ConnectionSource 可以采用如下代码
ConnectionSource source = ConnectionSourceHelper.single(datasource);
如果是主从Datasource
ConnectionSource source = ConnectionSourceHelper.getMasterSlave(master,slaves)
Spring集成
cs: 指定ConnectionSource,可以用系统提供的DefaultConnectionSource,支持按照CRUD决定主从。例子里只有一个master库
dbStyle: 数据库类型,目前只支持org.beetl.sql.core.db.MySqlStyle
sqlLoader: sql语句加载来源
nc: 命名转化,有驼峰的HumpNameConversion,有数据库下划线的UnderlinedNameConversion
interceptors:DebugInterceptor 用来打印sql语句,参数和执行时间
注意: 任何使用了Transactional 注解的,将统一使用Master数据源,例外的是@Transactional(readOnly=true),这将让Beetsql选择从数据库。
public class MyServiceImpl implements MyService {
@Autowired
SpringBeetlSql beetlsql ;
@Override
@Transactional()
public int total(User user) {
SQLManager dao = beetlsql.getSQLMananger();
List
int total = list .size();
dao.deleteById(User.class, 3);
User u =new User();
u.id = 3;
u.name="hello";
u.age = 12;
dao.insert(User.class, u);
return total;
可以参考demo https://git.oschina.net/xiandafu/springbeetlsql
JFinal集成
在configPlugin 里配置BeetlSql
JFinalBeetlSql.init();
默认会采用c3p0 作为数据源,其配置来源于jfinal 配置,如果你自己提供数据源或者主从,可以如下
JFinalBeetlSql.init(master,slaves);
由于使用了Beetlsql,因此你无需再配置 数据库连接池插件,和ActiveRecordPlugin,可以删除相关配置。
在controller里,可以通过JFinalBeetlSql.dao 方法获取到SQLManager
SQLManager dao = JFinalBeetlSql.dao();
BigBlog blog = getModel(BigBlog.class);
dao.insert(BigBlog.class, blog);
如果想控制事物,还需要注册Trans
public void configInterceptor(Interceptors me) {
me.addGlobalActionInterceptor(new Trans());
然后业务方法使用
@Before(Trans.class)
public void doXXX(){....+
这样,方法执行完毕才会提交事物,任何RuntimeException将回滚,如果想手工控制回滚.也可以通过
Trans.commit()
Trans.rollback()
如果习惯了JFinal Record模式,建议用户创建一个BaseBean,封装SQLManager CRUD 方法即可。然后其他模型继承此BaseBean
可以参考demo https://git.oschina.net/xiandafu/jfinal_beet_beetsql_btjson
SQLManager API
查询API
模板类查询(自动生成sql)
public List template(T t) 根据模板查询,返回所有符合这个模板的数据库
public List template(T t,RowMapper mapper) 同上,mapper可以提供额外的映射,如处理一对多,一对一
public List template(T t,int start,int size) 同上,可以翻页
public List template(T t,RowMapper mapper,int start,int size) 翻页,并增加额外的映射
public long templateCount(T t) 获取符合条件的个数
通过sqlid查询,sql语句在md文件里
public List select(String sqlId, Class clazz, Map paras) 根据sqlid来查询,参数是个map
public List select(String sqlId, Class clazz, Object paras) 根据sqlid来查询,参数是个pojo
public List select(String sqlId, Class clazz, Map paras, int start, int size), 增加翻页
public List select(String sqlId, Class clazz, Object paras, int start, int size) ,增加翻页
public T selectSingle(String id,Object paras, Class target) 根据sqlid查询,将对应的唯一值映射成指定的taget对象,RowMapper mapper 也随着这些api提供,不在此列出了
public T selectSingle(String id,Map paras, Class target) 同上,参数是map
public Integer intValue(String id,Object paras) 查询结果映射成Integer,输入是objct
public Integer intValue(String id,Map paras) 查询结果映射成Integer,输入是map, 其他还有 longValue,bigDecimalValue
更新API
自动生成sql
public void insert(Class> clazz,Object paras) 插入paras到paras关联的表
public void insert(Class> clazz,Object paras,KeyHolder holder),插入paras到paras关联的表,如果需要主键,可以通过holder的getKey来获取
public int updateById(Object obj) 根据主键更新,组件通过annotation表示,如果没有,则认为属性id是主键
public int[] updateByIdBatch(List> list) 批量更新
通过sqlid更新
public int update(String sqlId, Object obj) 根据sqlid更新
public int update(String sqlId, Map paras) 根据sqlid更新,输出参数是map
public int[] updateBatch(String sqlId,List> list) 批量更新
public int[] updateBatch(String sqlId,Map[] maps) 批量更新,参数是个数组,元素类型是map
BeetlSQL Annotation
对于自动生成的sql,默认不需要任何annotaton,类名对应于表名(通过NameConverstion类),getter方法的属性名对应于列明(也是通过NameConverstion类),但有些情况还是需要anntation。
@