本文整理自网络,侵删。
可能有些人也有过类似需求,一般都会选择使用其他的方式如Spring-JDBC等方式解决。
能否通过MyBatis实现这样的功能呢?
为了让通用Mapper更彻底的支持多表操作以及更灵活的操作,在2.2.0版本增加了一个可以直接执行SQL的新类SqlMapper。
我们来了解一下SqlMapper。
SqlMapper提供的方法
SqlMapper提供了以下这些公共方法:
- Map<String,Object> selectOne(String sql)
- Map<String,Object> selectOne(String sql, Object value)
- <T> T selectOne(String sql, Class<T> resultType)
- <T> T selectOne(String sql, Object value, Class<T> resultType)
- List<Map<String,Object>> selectList(String sql)
- List<Map<String,Object>> selectList(String sql, Object value)
- <T> List<T> selectList(String sql, Class<T> resultType)
- <T> List<T> selectList(String sql, Object value, Class<T> resultType)
- int insert(String sql)
- int insert(String sql, Object value)
- int update(String sql)
- int update(String sql, Object value)
- int delete(String sql)
- int delete(String sql, Object value)
一共14个方法,这些方法的命名和参数和SqlSession接口的很像,只是基本上第一个参数都成了sql。
其中Object value为入参,入参形式和SqlSession中的入参一样,带有入参的方法,在使用时sql可以包含#{param}或${param}形式的参数,这些参数需要通过入参来传值。需要的参数过多的时候,参数可以使用Map类型。另外这种情况下的sql还支持下面这种复杂形式:
String sql = "<script>select * from sys_user where 1=1" + "<if test=\"usertype != null\">usertype = #{usertype}</if></script>";
这种情况用的比较少,不多说。
不带有Object value的所有方法,sql中如果有参数需要手动拼接成一个可以直接执行的sql语句。
在selectXXX方法中,使用Class<T> resultType可以指定返回类型,否则就是Map<String,Object>类型。
实例化SqlMapper
SqlMapper构造参数public SqlMapper(SqlSession sqlSession),需要一个入参SqlSession sqlSession,在一般系统中,可以按照下面的方式获取:
SqlSession sqlSession = (...);//通过某些方法获取sqlSession //创建sqlMapper SqlMapper sqlMapper = new SqlMapper(sqlSession);
如果使用的Spring,那么可以按照下面的方式配置<bean>:
<bean id="sqlMapper" class="com.github.abel533.sql.SqlMapper" scope="prototype"> <constructor-arg ref="sqlSession"/> </bean>
在Service中使用的时候可以直接使用@Autowired注入。
简单例子
在src/test/java目录的com.github.abel533.sql包中包含这些方法的测试。
下面挑几个看看如何使用。
相关阅读 >>
sql server 分组统计并合计总数及with rollup应用
sql server 2008中的代码安全(八)透明加密(tde)
更多相关阅读请进入《sql》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。