背景

  • mybatis的java语言框架常搭配的ORM框架的。(对象-关系映射Object-Relational Mapping,简称ORM),它相当于在JDBC之上包装了一层,提供标准写法。目前由Google团队维护。

写法一:最传统的SQL语句写在XML中

  • 最传统的,注册一个userMapper.xml,注册一个User类,然后在Java中显性调用,注意到在Ibatis中写法是#id#,而在mybatis中改为#{id},特点为SQL语句在xml中
  1. ...
  2. <mapper>
  3. <select id="getUser" parameterType="int"
  4. resultType="me.gacl.domain.User">
  5. select * from users where id=#{id}
  6. </select>
  7. </mapper>
  8. ...
  1. //伪代码片段如下:
  2. public static void main(String[] args) throws IOException {
  3. //mybatis的配置文件
  4. String resource = "conf.xml";
  5. InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);
  6. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
  7. SqlSession session = sessionFactory.openSession();
  8. String statement = "me.gacl.mapping.userMapper.getUser";//映射sql的标识字符串
  9. //执行查询返回一个唯一user对象的sql
  10. User user = session.selectOne(statement, 1);
  11. System.out.println(user);
  12. }

写法二:@SelectKey SQL语句在java的注解中

  • @SelectKey 注解来在插入前读取数据库序列。特点为SQL语句在java的注解中
  1. ...
  2. @Insert("insert into table3 (id, name) values(#{nameId}, #{name})")
  3. @SelectKey(statement="call next value for TestSequence", keyProperty="nameId", before=true, resultType=int.class)
  4. int insertTable3(Name name);
  5. ...

写法三:SQL语句封装成@SqlProvider类

  • 使用 @SqlProvider 注解。
  1. @SelectProvider(type = UserSqlBuilder.class, method = "buildGetUsersByName")
  2. List<User> getUsersByName(String name);
  3. class UserSqlBuilder {
  4. public static String buildGetUsersByName(final String name) {
  5. return new SQL(){{
  6. SELECT("*");
  7. FROM("users");
  8. if (name != null) {
  9. WHERE("name like #{value} || '%'");
  10. }
  11. ORDER_BY("id");
  12. }}.toString();
  13. }
  14. }

其他需注意的要点

  • SqlBuilder 和 SelectBuilder (已经废弃),在3.2版本之前,我们使用了一点不同的做法,通过实现ThreadLocal变量来掩盖一些导致Java DSL麻烦的语言限制。

参考资料