beetlSql是一个orm框架。
据官方文档所述:比hibernete和mybatis综合素质要强的太多。
它的核心是SQLManager
代码如下所示:
public static void main(String[] args) {
String driver = "com.mysql.jdbc.Driver";
String url ="jdbc:mysql://localhost:3306/test1";
String userName="root";
String password = "123456";
DBStyle dbStyle = new MySqlStyle();
SQLLoader sqlLoader = new ClasspathLoader();
ConnectionSource ds = ConnectionSourceHelper.getSimple(driver, url, userName, password);
NameConversion nc = new UnderlinedNameConversion();
Interceptor[] inters =new Interceptor[]{new DebugInterceptor()};
SQLManager sqlManager = new SQLManager(dbStyle, sqlLoader, ds, nc, inters);
List list = sqlManager.all(User.class);
System.out.println(list);
}
解释:
DBStyle:方言。不同的数据库总有些不同的sql,作者做了很多的方言处理。这里新建的是mysql
SQLLoader :sql模板加载器。hibernate是完全没有sql。mybatis是全部都是sql。而beetlsql对于一些简单的单表查询已经有现成的封装方法,可以直接使用。但项目中总会有些特殊的sql,这时候sql就要写到sql模板里面去。
ConnectionSource:这个不必说,数据源
NameConversion:表名和类名的映射关系,以及列名和属性名的映射关系。
官方包里给出了三个实现:
- DefaultNameConversion 数据库名和java属性名保持一致,如数据库表User,对应Java类也是User,数据库列是sysytemId,则java属性也是systemId,反之亦然
- UnderlinedNameConversion 将数据库下划线去掉,首字母大写,如数据库是SYS_USER(oralce数据库的表和属性总是大写的), 则会改成SysUser
- JPA2NameConversion 支持JPA方式的映射,适合不能用确定的映射关系(2.7.4以前采用JPANameConversion过于简单,已经不用了)
Interceptor是拦截器,在执行sql前和sql后执行。它不能针对特殊的sql进行拦截,而是所有的sql都要拦截。本例添加了一个DebugInterceptor,当有sql执行时,会在控制台打印sql语句参数及返回值
SQLManager:核心管理器。
这里面方法很多。
比如:public
List all(Class clazz) 这是根据class类型返回所有的List.它是怎么做到的呢?它拿到了class的name,然后根据NameConversion推断出表的名字,接着就是select * from 表名了。
比如: public int insert(Class> clazz, Object paras)
这是个插入方法,也是根据clazz推测出表名,然后根据paras对象的fieldName/fieldvalue转换成
insert into 表名 (fieldName1,fieldName2,fieldName3....) values(fieldvalue1,fieldvalue2,fieldvalue3....)
这个要注意,beetsql有两个注解:
@AutoID:代表着自增id,标在pojo的id上
@AssignID:代表着非自增id,标在pojo的id上
在插入表有自增id的情况下,应该使用这个:
insert(Class> clazz, Object paras, KeyHolder holder),这个KeyHolder还会返回自增id.
比如:public int updateById(Object obj)
这个是修改方法,根据object的class推测出表名,并且根据类里带@AutoID或者@AssignID的那个属性当作id去修改。如果属性为null,也会修改为null.如下sql语句:
update xxx set aaa= 1 ,bbb =2,ccc = null where id =2
比如: public int updateTemplateById(Object obj)
这个和上个差不多,只是为null的属性不参与更新。
SqlManager有很多很多的方法供使用,但这些都是单表操作,满足不了日益增长的需要。对于特殊的sql语句,我们在下一章介绍。