通用Mapper实现查询总记录数
实现步骤:
0.引入通用Mapper的jar包
Pom.xml代码:
<!-- 通用Mapper,所有的单表的代码都不用编写 -->
<dependency>
<groupId>com.github.abel533</groupId>
<artifactId>mapper</artifactId>
<version>2.3.2</version>
</dependency>
- 在Mybatis核心配置文件里,配置mapperInterceptor插件
- 写一个泛型接口,并让其他所有mapper接口继承这个泛型接口
- 写一个类,继承MapperTemplate模板
- 开发具体方法
- 在泛型接口里,利用@XXXProvider注解,调用类里的方法
- 测试
一、查询数据库总记录数
SysMapperProvider.class代码:
public class SysMapperProvider extends MapperTemplate{
public SysMapperProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
super(mapperClass, mapperHelper);
System.out.println(mapperClass.getName());
}
public SqlNode selectCount(MappedStatement ms){
/*
* 1.ms.getId()得到的是namespace.id;
* 比如:当ModuleMapper接口执行 父接口里的 selectCount()方法时,mybatis会通过@SelectProvider
* 形成如下的结构:
* namepace=cn.tarena.ht.mapper.ModuleMapper
* <select id="selectCount" resultType="待设置">
* sql语句
* </select>
* 2.所以此时,ms.getId()=cn.tarena.ht.mapper.ModuleMapper.selectCount
* 3.我们的目的是动态的获取表名,而这个表名我们是在实体类上,加@Talbe(name="表名")来做的,所以最终的目的就是获取Module这个实体类
* 4.获取实体类的步骤如下:
* ①把cn.tarena.ht.mapper.ModuleMapper.selectCount截串,截出cn.tarena.ht.mapper.ModuleMapper,得到ModuleMapper接口
* ②得到ModuleMapper接口之后,可以获得它的父接口,SysMapper<Module>
* ③得到父接口后,因为这个接口含有泛型,所以可以把这个父接口转换为泛型类型,即ParameterizedType
* ④得到ParameterizedType后,就可以获得泛型里的实体type,强转成通配类型的class<?>
* ⑤有了class<?>之后,就能获得class上的指定类型的注解
* ⑥通过@Table注解的name属性,就可以获得表名
* 这样,表名就可以动态获得了
*
*/
String namespaceId=ms.getId();//cn.tarena.ht.mapper.ModuleMapper.selectCount
String interfaceClassName=namespaceId.substring(0, namespaceId.lastIndexOf("."));
String tableName=null;
try {
Class<?> interfaceClass=Class.forName(interfaceClassName);
Type[] types=interfaceClass.getGenericInterfaces();
Type t=types[0];
if(t instanceof ParameterizedType){
ParameterizedType superInterfaceType=(ParameterizedType) t;
Type[] entityClasses=superInterfaceType.getActualTypeArguments();
Class<?> entityClass=(Class<?>) entityClasses[0];
tableName=entityClass.getAnnotation(Table.class).name();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String text="select count(*) from "+tableName;
SqlNode sqlNode=new StaticTextSqlNode(text);
return sqlNode;
}
}
SysMapper接口代码:
public interface SysMapper<T> {
@SelectProvider(type=SysMapperProvider.class,method="dynamicSQL")
public int selectCount();
}
ModuleMapper接口代码:
public interface ModuleMapper extends SysMapper<Module>{
}
Module(pojo)代码:
@Table(name="dept_p")
public class Module extends BasePojo{
}
通用Mapper实现查询所有模块信息
SysMapperProvider代码:
public SqlNode select(MappedStatement ms){
//得到父接口里泛型的实体类
Class<?> entityClass=this.getSelectReturnType(ms);
//设置返回值类型
this.setResultType(ms, entityClass);
//得到表名
String tableName=entityClass.getAnnotation(Table.class).name();
String text="select * from "+tableName;
SqlNode sqlNode=new StaticTextSqlNode(text);
return sqlNode;
}
SysMapper代码:
@SelectProvider(type=SysMapperProvider.class,method="dynamicSQL")
public List<T> select();
商品新增—商品分类树展现
ItemCatController代码:
@Controller
public class ItemCatController {
@Autowired
private ItemCatService itemCatService;
/*商品分类树展示要求的json格式
* easyui树要求的json格式:
* {"id":2,"text":"商品名",state:"closed"}state的属性如果是closed,表示这个是父节点,它还有子节点。open代表子节点
* 商品分类树实现思路:
* 商品分类树,最开始只展示第一级商品分类,然后,当点击某个一级商品分类时,前台会把这个一级商品分类的id传过来,根据这个id,去查询它的二级子分类
* 然后把二级子分类展现出来,也就是说,当你点击某一个父节点时,它才会去加载对应的数据,不会一起把所有数据都查出来,这样能够避免出现过大的数据量在网络中进行传输
* 当点击某个二级子分类时,会根据这个二级分类的id,去查询对应的第三级分类
*
* 对应的前台代码在web-app/js/common.js的99行到140行
*/
@RequestMapping("/item/cat/list")
@ResponseBody
public List<ItemCat> list(@RequestParam(value="id",defaultValue="0")Long parentId){
return itemCatService.findItemCatByParentId(parentId);
}
}
EasyUI树的JSON格式说明
initItemCat : function(data){
$(".selectItemCat").each(function(i,e){
//i= index 下标,e:element:元素
var _ele = $(e);
if(data && data.cid