背景
- 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麻烦的语言限制。
参考资料