2. 5分钟例子

2.1. 安装

maven 方式:

  1. <dependency>
  2. <groupId>com.ibeetl</groupId>
  3. <artifactId>beetlsql</artifactId>
  4. <version>2.11.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.ibeetl</groupId>
  8. <artifactId>beetl</artifactId>
  9. <version>${最新版本}</version>
  10. </dependency>

或者依次下载beetlsql,beetl 最新版本 包放到classpath里

2.2. 准备工作

为了快速尝试BeetlSQL,需要准备一个Mysql数据库或者其他任何beetlsql支持的数据库,然后执行如下sql脚本

  1. CREATE TABLE `user` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(64) DEFAULT NULL,
  4. `age` int(4) DEFAULT NULL,
  5. `userName` varchar(64) DEFAULT NULL COMMENT '用户名称',
  6. `roleId` int(11) DEFAULT NULL COMMENT '用户角色',
  7. `create_date` datetime NULL DEFAULT NULL,
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

编写一个Pojo类,与数据库表对应(或者可以通过SQLManager的gen方法生成此类,参考一下节)

  1. import java.math.*;
  2. import java.util.Date;
  3. /*
  4. *
  5. * gen by beetlsql 2016-01-06
  6. */
  7. public class User {
  8. private Integer id ;
  9. private Integer age ;
  10. //用户角色
  11. private Integer roleId ;
  12. private String name ;
  13. //用户名称
  14. private String userName ;
  15. private Date createDate ;
  16. }

主键需要通过注解来说明,如@AutoID,或者@AssignID等,但如果是自增主键,且属性是名字是id,则不需要注解,自动认为是自增主键

2.3. 代码例子

写一个java的Main方法,内容如下

  1. ConnectionSource source = ConnectionSourceHelper.getSimple(driver, url, userName, password);
  2. DBStyle mysql = new MySqlStyle();
  3. // sql语句放在classpagth的/sql 目录下
  4. SQLLoader loader = new ClasspathLoader("/sql");
  5. // 数据库命名跟java命名一样,所以采用DefaultNameConversion,还有一个是UnderlinedNameConversion,下划线风格的,
  6. UnderlinedNameConversion nc = new UnderlinedNameConversion();
  7. // 最后,创建一个SQLManager,DebugInterceptor 不是必须的,但可以通过它查看sql执行情况
  8. SQLManager sqlManager = new SQLManager(mysql,loader,source,nc,new Interceptor[]{new DebugInterceptor()});
  9. //使用内置的生成的sql 新增用户,如果需要获取主键,可以传入KeyHolder
  10. User user = new User();
  11. user.setAge(19);
  12. user.setName("xiandafu");
  13. sqlManager.insert(user);
  14. //使用内置sql查询用户
  15. int id = 1;
  16. user = sqlManager.unique(User.class,id);
  17. //模板更新,仅仅根据id更新值不为null的列
  18. User newUser = new User();
  19. newUser.setId(1);
  20. newUser.setAge(20);
  21. sqlManager.updateTemplateById(newUser);
  22. //模板查询
  23. User query = new User();
  24. query.setName("xiandafu");
  25. List<User> list = sqlManager.template(query);
  26. //Query查询
  27. Query userQuery = sqlManager.getQuery(User.class);
  28. List<User> users = userQuery.lambda().andEq(User::getName,"xiandafy").select();
  29. //使用user.md 文件里的select语句,参考下一节。
  30. User query2 = new User();
  31. query.setName("xiandafu");
  32. List<User> list2 = sqlManager.select("user.select",User.class,query2);
  33. // 这一部分需要参考mapper一章
  34. UserDao dao = sqlManager.getMapper(UserDao.class);
  35. List<User> list3 = dao.select(query2);

BeetlSql2.8.11 提供了 SQLManagerBuilder来链式创建SQLManager

2.4. SQL文件例子

通常一个项目还是有少量复杂sql,可能只有5,6行,也可能有上百行,放在单独的sql文件里更容易编写和维护,为了能执行上例的user.select,需要在classpath里建立一个sql目录(在src目录下建立一个sql目录,或者maven工程的resources目录。ClasspathLoader 配置成sql目录,参考上一节ClasspathLoader初始化的代码)以及下面的user.md 文件,内容如下

  1. select
  2. ===
  3. select * from user where 1=1
  4. @if(!isEmpty(age)){
  5. and age = #age#
  6. @}
  7. @if(!isEmpty(name)){
  8. and name = #name#
  9. @}

关于如何写sql模板,会稍后章节说明,如下是一些简单说明。

  • 采用md格式,===上面是sql语句在本文件里的唯一标示,下面则是sql语句。
  • @ 和回车符号是定界符号,可以在里面写beetl语句。
  • "#" 是占位符号,生成sql语句得时候,将输出?,如果你想输出表达式值,需要用text函数,或者任何以db开头的函数,引擎则认为是直接输出文本。
  • isEmpty是beetl的一个函数,用来判断变量是否为空或者是否不存在.
  • 文件名约定为类名,首字母小写。 sql模板采用beetl原因是因为beetl 语法类似js,且对模板渲染做了特定优化,相比于mybatis,更加容易掌握和功能强大,可读性更好,也容易在java和数据库之间迁移sql语句

注意:sqlId 到sql文件的映射是通过类SQLIdNameConversion来完成的,默认提供了DefaultSQLIdNameConversion实现,即 以 "." 区分最后一部分是sql片段名字,前面转为为文件相对路径,如sqlId是user.select,则select是sql片段名字,user是文件名,beetlsql会在根目录下寻找/user.sql,/user.md ,也会找数据库方言目录下寻找,比如如果使用了mysql数据库,则优先寻找/mysql/user.md,/mysql/user.sql 然后在找/user.md,/user.sql.

如果sql是 test.user.select,则会在/test/user.md(sql) 或者 /mysql/test/user.md(sql) 下寻找“select”片段

2.5. 代码&sql生成

User类并非需要自己写,好的实践是可以在项目中专门写个类用来辅助生成pojo和sql片段,代码如下

  1. public static void main(String[] args){
  2. SqlManager sqlManager = ...... //同上面的例子
  3. sqlManager.genPojoCodeToConsole("user");
  4. sqlManager.genSQLTemplateToConsole("user");
  5. }

注意:我经常在我的项目里写一个这样的辅助类,用来根据表或者视图生成各种代码和sql片段,以快速开发.

genPojoCodeToConsole 方法可以根据数据库表生成相应的Pojo代码,输出到控制台,开发者可以根据这些代码创建相应的类,如上例子,控制台将输出

  1. package com.test;
  2. import java.math.*;
  3. import java.util.Date;
  4. import java.sql.Timestamp;
  5. /*
  6. *
  7. * gen by beetlsql 2016-01-06
  8. */
  9. public class User {
  10. private Integer id ;
  11. private Integer age ;
  12. //用户角色
  13. private Integer roleId ;
  14. private String name ;
  15. //用户名称
  16. private String userName ;
  17. private Date createDate ;
  18. }

注意

生成属性的时候,id总是在前面,后面依次是类型为Integer的类型,最后面是日期类型,剩下的按照字母排序放到中间。

一旦有了User 类,如果你需要写sql语句,那么genSQLTemplateToConsole 将是个很好的辅助方法,可以输出一系列sql语句片段,你同样可以赋值粘贴到代码或者sql模板文件里(user.md),如上例所述,当调用genSQLTemplateToConsole的时候,生成如下

  1. sample
  2. ===
  3. * 注释
  4. select #use("cols")# from user where #use("condition")#
  5. cols
  6. ===
  7. id,name,age,userName,roleId,create_date
  8. updateSample
  9. ===
  10. `id`=#id#,`name`=#name#,`age`=#age#,`userName`=#userName#,`roleId`=#roleId#,`create_date`=#date#
  11. condition
  12. ===
  13. 1 = 1
  14. @if(!isEmpty(name)){
  15. and `name`=#name#
  16. @}
  17. @if(!isEmpty(age)){
  18. and `age`=#age#
  19. @}

beetlsql生成了用于查询,更新,条件的sql片段和一个简单例子。你可以按照你的需要copy到sql模板文件里.实际上,如果你熟悉gen方法,你可以直接gen代码和sql到你的工程里,甚至是整个数据库都可以调用genAll来一次生成

注意

sql 片段的生成顺序按照数据库表定义的顺序显示