背景
- mybatis的java语言框架常搭配的ORM框架的。(对象-关系映射Object-Relational Mapping,简称ORM),它相当于在JDBC之上包装了一层,提供标准写法。目前由Google团队维护。
写法一:最传统的SQL语句写在XML中
- 最传统的,注册一个userMapper.xml,注册一个User类,然后在Java中显性调用,注意到在Ibatis中写法是#id#,而在mybatis中改为#{id},特点为SQL语句在xml中
...
<mapper>
<select id="getUser" parameterType="int"
resultType="me.gacl.domain.User">
select * from users where id=#{id}
</select>
</mapper>
...
//伪代码片段如下:
public static void main(String[] args) throws IOException {
//mybatis的配置文件
String resource = "conf.xml";
InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sessionFactory.openSession();
String statement = "me.gacl.mapping.userMapper.getUser";//映射sql的标识字符串
//执行查询返回一个唯一user对象的sql
User user = session.selectOne(statement, 1);
System.out.println(user);
}
写法二:@SelectKey SQL语句在java的注解中
- @SelectKey 注解来在插入前读取数据库序列。特点为SQL语句在java的注解中
...
@Insert("insert into table3 (id, name) values(#{nameId}, #{name})")
@SelectKey(statement="call next value for TestSequence", keyProperty="nameId", before=true, resultType=int.class)
int insertTable3(Name name);
...
写法三:SQL语句封装成@SqlProvider类
@SelectProvider(type = UserSqlBuilder.class, method = "buildGetUsersByName")
List<User> getUsersByName(String name);
class UserSqlBuilder {
public static String buildGetUsersByName(final String name) {
return new SQL(){{
SELECT("*");
FROM("users");
if (name != null) {
WHERE("name like #{value} || '%'");
}
ORDER_BY("id");
}}.toString();
}
}
其他需注意的要点
- SqlBuilder 和 SelectBuilder (已经废弃),在3.2版本之前,我们使用了一点不同的做法,通过实现ThreadLocal变量来掩盖一些导致Java DSL麻烦的语言限制。
参考资料