mybatis有没有annotation的动态SQL语句?

蓝血的阿健 发布于 2015/09/22 18:23
阅读 5K+
收藏 1

软件工程师和算法工程师速来!正在直播:如何使用英特尔oneAPI工具实现PyTorch 优化>>>

最近做系统需要用到mybatis
由于过去用了太多的xml配置框架,这次想摒弃以前那些配置太多的缺点,使用annotation的方法。
使用mybatisGenerator的工具,生成annotation的mapper
参见代码

@Insert({
        "insert into contactinfo (idcontactinfo, contact_idcontact, ",
        "firstname, secondname, ",
        "address, state, ",
        "country, city, email, ",
        "telephone, mobile)",
        "values (#{idcontactinfo,jdbcType=INTEGER}, #{contactIdcontact,jdbcType=INTEGER}, ",
        "#{firstname,jdbcType=VARCHAR}, #{secondname,jdbcType=VARCHAR}, ",
        "#{address,jdbcType=VARCHAR}, #{state,jdbcType=VARCHAR}, ",
        "#{country,jdbcType=VARCHAR}, #{city,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, ",
        "#{telephone,jdbcType=VARCHAR}, #{mobile,jdbcType=VARCHAR})"
    })
    int insert(ContactInfo record);



现在问题来了,我需要实现如下一样的动态SQL拼接,功能主要应用在多条件查询的地方
参见代码
<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #{title}
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>
</select>



我也去网上搜索了半天,就是没有关于annotation的用法
如果我在代码中控制就变成
参加代码
ContactExample example = new ContactExample();
		ContactExample.Criteria cri = example.createCriteria();
		System.out.println(contact.getUsername() + ":" + contact.getPassword());

		if (null != contact.getUsername() || !"".equals(contact.getUsername())) {
			cri.andUsernameLike(contact.getUsername() + "%");
		}
		if (null != contact.getPassword() || !"".equals(contact.getPassword())) {
			cri.andPasswordEqualTo(contact.getPassword());
		}
		ContactMapper vcontactMapper = sqlSession
				.getMapper(ContactMapper.class);
		List<Contact> returnList = vcontactMapper.selectByExample(example);
		return returnList;



如果这么做,就不太舒服了,也感觉不是一种公认的普遍解决方法
所以,想到这里来问问大家,有没有更好的方法呢?
谢谢大家了。

加载中
1
双城记
双城记

以前看到一个mybatis项目,一个mapper xml有1900多行,混杂了各种<if test=""></if>判断逻辑和各种奇葩的mapper映射,同样的mapper换成jpa或者spring-jpa-data或是hibernate,代码量可以缩到300行左右。

有时候我很搞不懂这么好多人无脑推崇mybatis是因为对自己驾驭不了jpa、hibernate的恨呢还是单纯为了所谓逼格而强迫自己去接受这一奇葩mybatis框架。


把大堆逻辑写进xml里然后还美其名曰的称是好维护,,,,,估计是我这辈子见过好笑的笑话啦。

taojintianxia
taojintianxia
呵呵,jap写个复杂的sql看看?而且如果mybatis的XML太长,多半是因为引入了自动化代码生成工具.自己喷一个框架的时候根本不考虑该框架的适用场景,显得自己很浅薄.
w
wgsq
回复 @双城记 : 呵呵请问您会么,go是什么语言还得百度吧,您呀别搞笑了,以后呀别动不动就说这个框架不行,理解不了别人为什么用,只是因为你太菜,谢谢,别回了,朽木不可雕。连虚心学习的心态都没有,你活的真是生不如死呀。
双城记
双城记
回复 @wgsq : 嘴炮一流。满篇就是架构师、多学几门语言。好像学几门语言就了不起一样。有开发经验的人要喷也不会这么喷啊,看别人搞java的就YY别人只知道java不懂php、python,然后就喷人见识低,哈哈哈角度真是奇特。哦对了,你到底是不是大公司出来的啊?还是纯属自己YY大公司??不是的话我就走了啊。
w
wgsq
回复 @双城记 : 自己垃圾自己就闭嘴吧,真恶心
w
wgsq
回复 @双城记 : 博客上的东西意义在哪?能百度能google的还需要你么,书上写的很明白吧,不看书就看博客就行了?培训机构出来的吧,真搞笑
下一页
0
pantrick
pantrick
mybatis支持同时注解和xmlsql,如果annotation的不行就直接写xml
0
CoderLeon
CoderLeon

给你关键字去搜吧,@SelectProvider @InsertProvider..省略update和delete

为什么要用注解呢,xml配置很好啊,代码和sql语句分离,容易维护

maradona
maradona
回复 @蓝血的阿健 : 有的地方用注解方便,有的地方用xml方便,哪个方便就用哪种方案,你这样想也太教条了点吧
蓝血的阿健
蓝血的阿健
注解不是可以省去很多配置的烦恼吗,减少配置文件的管理。 难道我又错了。。。现在大家还是倾向于看得见的xml配置吗? 求指教~!
0
小99
小99
如果你用mybatis,那么请使用xml的方式吧,因为后期新人维护都熟悉,还有就是因为官方都不推荐注解方式
0
狐狸糊涂
狐狸糊涂

注解就一定好吗?如果把配置都放到注解,会导致配置多余分离和分散化,给维护带来不便。现在很多框架都是滥用注解,把什么配置都往注解里扔。

注解的原意就是元数据,是个特殊的数据,用来描述你所标注的东西的。比如,描述一个属性活方法有哪些特殊的数据,而不是把方法里面需要用到的数据和配置放到注解里。最后引用一段来自wikipedia的解释。

An annotation is metadata (e.g. a comment, explanation, presentational markup) attached to text, image, or other data.[1] Often, annotations refer to a specific part of the original data.

0
Im柏杨
Im柏杨
mybatis注解功能上本来就不如配置文件吧,而且后期维护性上,配置文件更好些,而且复杂查询配置文件更方便。
0
RegnoiX
RegnoiX

mybatis比较简单,不用学什么新东西。

要是写在注解里 还不如用jdbctemplate之类的 直接写在java里

0
TSC9526
TSC9526
该评论暂时无法显示,详情咨询 QQ 群:点此入群
TSC9526
TSC9526
回复 @双城记 : 最新版本的动态SQL语句可以直接写在Java代码中,并能够像配置文件一样加载更新的SQL。
TSC9526
TSC9526
回复 @双城记 : 多表关联需要手工写SQL, 当然多表关联写的动态SQL代码自动生成DTO仍然是能够正常工作的。
双城记
双城记
您好,请问下,你这个框架,对于多表关联查询支持如何?
0
小魂师

注解可以写,用<script>的关键字就好了,配置比代码还多,何苦呢,做怎么灵活,浪费时间,浪费精力,99%的变动都不会发生。

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部
返回顶部
顶部