42.大数据之旅——java分布式项目03

通用Mapper实现查询总记录数


实现步骤:
0.引入通用Mapper的jar包
Pom.xml代码:

<!-- 通用Mapper,所有的单表的代码都不用编写 -->
<dependency>
<groupId>com.github.abel533</groupId>
<artifactId>mapper</artifactId>
<version>2.3.2</version>
</dependency>
  1. 在Mybatis核心配置文件里,配置mapperInterceptor插件
  2. 写一个泛型接口,并让其他所有mapper接口继承这个泛型接口
  3. 写一个类,继承MapperTemplate模板
  4. 开发具体方法
  5. 在泛型接口里,利用@XXXProvider注解,调用类里的方法
  6. 测试

一、查询数据库总记录数
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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值