最近一直在用mybatis,由于需要使用到了动态sql,遇到了一些问题,现在来总结一下,经验教训。
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
这是百度出来的一段话,具体讲使用吧,首先将一下,flyway,版本管理工具,个人觉得mybatis migration不如flyway好用,首先在gradle里面下载flyway插件,然后配置参数,语句如下:
以后每次只需运行 gradle flyway即可,mybatis migration还需要配置环境变量,否则每次都要进入目录里面才能执行,需要注意的是,table里会默认帮你建一张帮你管理版本的表,如果缺少table这句话,自己又没有建有相关字段的表会报错。mybatis具体的配置可以看,mybatis的官方网站可以理解。
mybatis注解的方式如下:
@Select(“select * from product where productId=#{productId}”)
public Product findProductById(String productId);
@Select("select * from product")
public List<Product> getAllProduct();
@SelectProvider(type = ImplementProduct.class, method="getPaginationProductList")
public List<Product> getPaginationProductList(@Param("filterName") String filterName, @Param("filterValue") String filterValue
@Param("start")int start,@Param("size")int size)
最下面一条语句将要使用动态注解,前两条注解语句可以直接被注入执行。
动态注解,需要新建一个类,在这里我新建了一个ImplementProduct类,里面有一个方法叫getPaginationProductList.具体文件如下:
直接return sql语句是不会报错的,但是可能会产生注入攻击等原因吧,别人说不能拼sql,然后我就去找了些,动态注解的资料,找到了第二种方法。
注意,多参数的话,一定要用map接受,并且根据编译提示,接收到的字符串一定要是final类型。但在这里遇到了问题,由于mybaitis官网,关于动态注解讲的不够清楚,资料也不够多,没找到limit的拼接方法,直接写会报错,在网上查到了一种方法,但没有解决,网上的的方法是, 添加
StringBuffer sb = new StringBuffer();
sb.append("LIMIT");
sb.append("start,size");
然后在WHERE 语句下面,写上sb.toString。可是我发现拼接并不起作用,于是根据前辈的建议,我该用,xml注解,这种方法比较老,代码更加的少,更加的灵活。
我们只需根据mapper名称,见一个同名的xml文件,在开始加上
namepace里面是mapper.java的路径名,xml建在和mapper.java包名一样的包下,路径如下图
结尾别忘了加上
这里面可以写动态sql语句,如下:
这里使用了动态拼接,id只需喝mapper.java中语句一样即可,使用xml就只用在java中写方法,不用@SELECT这样的注解语句。where中的语句可以根据条件动态拼接。具体的其他方法可以查阅其他资料。