MyBatis直接执行SQL的工具SqlMapper

  

可能有些人也有过类似需求,一般都会选择使用其他的方式如spring jdbc等方式解决。

  

能否通过MyBatis实现这样的功能呢?

  

为了让通用映射器更彻底的支持多表操作以及更灵活的操作,在2.2.0版本增加了一个可以直接执行SQL的新类SqlMapper。

  

我们来了解一下SqlMapper。

  

<强> SqlMapper提供的方法

  

SqlMapper提供了以下这些公共方法:

  
      <李> Map<字符串,Object>李selectOne (String sql)   <李> Map<字符串,Object>selectOne (sql字符串、对象价值)   <李> & lt; T>T selectOne (String sql, Class李resultType)   <李> & lt; T>T selectOne (sql字符串、对象的价值,Class李resultType)   <李> List比;李selectList (String sql)   <李> List比;selectList (sql字符串、对象价值)   <李> & lt; T>ListselectList (String sql, Class李resultType)   <李> & lt; T>ListselectList (sql字符串、对象的价值,Class李resultType)   <李> int(字符串插入sql)   <李> int插入(sql字符串、对象价值)   <李> int更新(String sql)   <李> int更新(sql字符串、对象价值)   <李> int删除字符串(sql)   <李> int删除(sql字符串、对象值)   
  

一共14个方法,这些方法的命名和参数和SqlSession接口的很像,只是基本上第一个参数都成了sql。

  

其中对象价值为入参,入参形式和SqlSession中的入参一样,带有入参的方法,在使用时sql可以包含# {param}或{param}美元形式的参数,这些参数需要通过入参来传值。需要的参数过多的时候,参数可以使用地图类型。另外这种情况下的sql还支持下面这种复杂形式:

        字符串sql=" & lt; script>从sys_user选择* 1=1”+   ”& lt;如果测试=\“usertype !=null \“祝辞usertype=# {usertype} & lt;/if> & lt;/script>”;      

这种情况用的比较少,不多说。

  

不带有对象价值的所有方法,sql中如果有参数需要手动拼接成一个可以直接执行的sql语句。

  

在selectXXX方法中,使用ClassresultType可以指定返回类型,否则就是Map<字符串,Object>类型。

  

<>强实例化SqlMapper

  

SqlMapper构造参数公共SqlMapper (SqlSession SqlSession),需要一个入参SqlSession SqlSession,在一般系统中,可以按照下面的方式获取:

        SqlSession SqlSession=(…);//通过某些方法获取SqlSession//创建sqlMapper   SqlMapper SqlMapper=new SqlMapper (sqlSession);      

如果使用的春天,那么可以按照下面的方式配置& lt; bean>:

        & lt; bean id=皊qlMapper”类=" com.github.abel533.sql。SqlMapper”范围="原型"比;   & lt; constructor-arg ref=" sqlSession "/比;   & lt;/bean>      

在服务中使用的时候可以直接使用@ autowired注入。

  

<强>简单例子

  

在src/测试/java目录的com.github.abel533.sql包中包含这些方法的测试。

  

下面挑几个看看如何使用。

  

<强> selectList

     //查询,返回List   List比;=sqlMapper列表。selectList (“select * from国度id & lt;11”);//查询,返回指定的实体类   ListcountryList=sqlMapper。selectList (“select * from国度id & lt;11”,Country.class);//查询,带参数   countryList=sqlMapper。selectList (“select * from国度id & lt;# {id}”, 11日Country.class);//复杂点的查询,这里参数和上面不同的地方,在于传入了一个对象   国家国家=new ();   country.setId (11);   countryList=sqlMapper.selectList (“& lt; script>”+   “select * from国家”+   “& lt; where>”+   " & lt;如果测试=\ " id !=null \“在”+   “id, lt;+ # {id}”   “& lt;/if>”+   “& lt;/where>”+   “& lt;/script>”、国家Country.class);      

<强> selectOne

        Object> Map<字符串;=sqlMapper地图。selectOne (“select * from国度id=35 ");=sqlMapper地图。selectOne (“select * from id=# {id}”的国家,35);   国家国家=sqlMapper。selectOne (“select * from id=35”的国家,Country.class);   国家=sqlMapper。selectOne (“select * from id=# {id}”的国家,35岁,Country.class);      

<强>插入、更新、删除

     //插入   结果=sqlMapper int。插入(“插入值(1921年,“天朝”,TC) ");   国家tc=new ();   tc.setId (1921);   tc.setCountryname(“天朝”);   tc.setCountrycode (TC);//注意这里的countrycode和countryname故意写反的   结果=sqlMapper。插入(“插入值(# {id}, {countrycode} #, # {countryname})”   、tc);//更新   结果=sqlMapper。更新(“更新国家设置countryname='天朝的id=35”);   tc=新国家();   tc.setId (35);   tc.setCountryname(“天朝”);   结果=sqlMapper int。更新(“更新国家设置countryname=# {countryname}”+   “在id(从国家,选择id countryname像“%”)”、tc);//删除   结果=sqlMapper.delete(从国家“删除id=35 ");   结果=sqlMapper.delete(从国家“删除id=# {id}”, 35);

MyBatis直接执行SQL的工具SqlMapper