MyBatis 动态SQL
我们在前面的基础上继续学习动态SQL。
样例:
在项目上面新建dbsql层,并新建类
然后如下代码
public class FatherSQL {
public String queryFather(Map<String,String> params){
return new SQL(){
{
}
}.toString();
}
}
String后面的queryFather是自己起的方法名,与后面在调用时相关联
参数选择的是Map<类型,类型>集合
return new SQL(){
}
在其中内部进行java语言的sql语句书写
dbsql层下类的完整代码:
public class FatherSQL {
public String queryFathers(Map<String,String> map){
return new SQL(){
{
SELECT("*");
FROM("Father");
if(map.get("fid")!=null){
WHERE("fid=#{fid}");
}
}
}.toString();
}
}
然后在Mapper层的FatherMapper新增@SelectProvider
@SelectProvider(type= FatherSQL.class, method="queryFathers")
@Results({
@Result(column="fid", property="fid", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="fname", property="fname", jdbcType=JdbcType.VARCHAR),
@Result(property = "sons",javaType= List.class,column = "fid",
many =@Many(select="com.ryh.mapper.SonMapper.selectSonsByFid"))
})
Father queryFathers(Map<String,String> map);
其中type后面是你写的运行时类的名字,method是你的方法名
下面是你表中字段的映射
select后面的内容是你在Mapper上使用方法的所在位置
将名称改为之前的方法名
然后在FatherService上写查询语句
@Test
public void queryFathers(){
SqlSession session=ssf.openSession();
Map<String,String> map=new HashMap();
map.put("fid","3");
Father f=session.selectOne("com.ryh.mapper.FatherMapper.queryFathers",map);
System.out.println(f.getFname());
f.getSons().forEach(c-> System.out.println(c.getSname()));
session.close();
}
就完成了动态sql的查询