快速开始

    安装

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

    准备工作

    为了快速尝试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. `create_date` datetime NULL DEFAULT NULL,
    5. PRIMARY KEY (`id`)
    6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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

    代码例子

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

    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的一个函数,用来判断变量是否为空或者是否不存在.
    • 文件名约定为类名,首字母小写。

    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”片段

    代码&sql生成

    1. SqlManager sqlManager = ...... //同上面的例子
    2. sqlManager.genPojoCodeToConsole("user");
    3. 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,create_date
    8. updateSample
    9. = = =
    10. `id`=#id#,`name`=#name#,`age`=#age#,`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来一次生成