可能有些人也有过类似需求,一般都会选择使用其他的方式如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
一共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方法中,使用Class
<>强实例化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 强>
//查询,返回ListList 比;=sqlMapper列表。selectList (“select * from国度id & lt;11”);//查询,返回指定的实体类 List countryList=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