2.1. 安装

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

    2.2. 准备工作

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

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

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

    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. int id = 1;
    15. user = sqlManager.unique(User.class,id);
    16. //模板更新,仅仅根据id更新值不为null的列
    17. User newUser = new User();
    18. newUser.setId(1);
    19. newUser.setAge(20);
    20. sqlManager.updateTemplateById(newUser);
    21. //模板查询
    22. User query = new User();
    23. query.setName("xiandafu");
    24. List<User> list = sqlManager.template(query);
    25. //Query查询
    26. Query userQuery = sqlManager.getQuery(User.class);
    27. List<User> users = userQuery.lambda().andEq(User::getName,"xiandafy").select();
    28. //使用user.md 文件里的select语句,参考下一节。
    29. User query2 = new User();
    30. query.setName("xiandafu");
    31. List<User> list2 = sqlManager.select("user.select",User.class,query2);
    32. // 这一部分需要参考mapper一章
    33. UserDao dao = sqlManager.getMapper(UserDao.class);
    34. List<User> list3 = dao.select(query2);

    2.4. SQL文件例子

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

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

    • 采用md格式,===上面是sql语句在本文件里的唯一标示,下面则是sql语句。
    • @ 和回车符号是定界符号,可以在里面写beetl语句。
    • "#" 是占位符号,生成sql语句得时候,将输出?,如果你想输出表达式值,需要用text函数,或者任何以db开头的函数,引擎则认为是直接输出文本。
    • isEmpty是beetl的一个函数,用来判断变量是否为空或者是否不存在.

    注意: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");

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

    一旦有了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. @}

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