网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
int insert(T entity);
int deleteById(Serializable id);
int deleteByMap(@Param("cm") Map<String, Object> columnMap);
int delete(@Param("ew") Wrapper<T> wrapper);
int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
int updateById(@Param("et") T entity);
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
T selectById(Serializable id);
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
T selectOne(@Param("ew") Wrapper<T> queryWrapper);
Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
}
然后数据库表的接口继承BaseMapper,各个数据库表接口的实现继承ServiceImpl类就具备了增删改查的基本功能了。
/**
-
IService 实现类( 泛型:M 是 mapper 对象,T 是实体 , PK 是主键泛型 )
*/
public class ServiceImpl<M extends BaseMapper, T> implements IService {protected Log log = LogFactory.getLog(getClass());
@Autowired
protected M baseMapper;@Override
public M getBaseMapper() {
return baseMapper;
}
//… 省略 …
}
#### 泛型方法
上面的栗子里其实包含了泛型类、泛型接口和泛型方法,下面再举一个单纯的泛型方法,直接打印泛型的数据类型。
private static <T> void printGeneric(T t){
System.out.println(t.getClass().getName());
}
#### 实际应用
下面看一个实际应用,比如以太专线和以太专网的公共属性类为以太连接。
以太连接父类:
@Data
public class EthConnection {
private String attribute;
}
以太专线子类:
@Data
public class ELineConnection extends EthConnection{
private String uuid;
}
以太专网子类:
@Data
public class ELanConnection extends EthConnection{
private String uuid;
}
比如我想对以太专线和以太专网子类传入它们共有的属性,那么我得像下面这么做,
public class GenericDemo {
public static void main(String[] args) {
String attr = “commonAttribute”;
List eLanConnectionList = buildELanConnection(attr);
List eLineConnectionList = buildELineConnection(attr);
eLanConnectionList.stream().forEach(System.out::println);
eLineConnectionList.stream().forEach(System.out::println);
}
private static List<ELanConnection> buildELanConnection(String attr) {
ELanConnection connection = new ELanConnection();
connection.setAttribute(attr);
return Lists.newArrayList(connection);
}
private static List<ELineConnection> buildELineConnection(String attr) {
ELineConnection connection = new ELineConnection();
connection.setAttribute(attr);
return Lists.newArrayList(connection);
}
}
这里共有属性不多,感觉没啥,但如果它们需要传入的共有属性很多且都相同,那么重复的代码就太多了。设置共同属性的代码段可以抽取出来,如果属性不多,我下面这种做法也许显得很多余。这样设计是否合适大家可以一起品一品。
public class GenericDemo {
private static final int ELAN_TAG = 1;
private static final int ELINE_TAG = 2;
public static void main(String[] args) {
String attr = “commonAttribute”;
List eLanConnectionList = buildELanConnection(attr);
List eLineConnectionList = buildELineConnection(attr);
eLanConnectionList.stream().forEach(System.out::println);
eLineConnectionList.stream().forEach(System.out::println);
}
private static List<ELanConnection> buildELanConnection(String attr) {
return castELanConnection(buildConnection(attr, ELAN_TAG));
}
private static List<ELineConnection> buildELineConnection(String attr) {
return castELineConnection(buildConnection(attr, ELINE_TAG));
}
private static List<ELanConnection> castELanConnection(List<? extends EthConnection> connections) {
if (CollectionUtils.isEmpty(connections)){
return Lists.newArrayList();
}
return connections.stream().map(ELanConnection.class::cast).collect(Collectors.toList());
}
private static List<ELineConnection> castELineConnection(List<? extends EthConnection> connections) {
if (CollectionUtils.isEmpty(connections)){
return Lists.newArrayList();
}
return connections.stream().map(ELineConnection.class::cast).collect(Collectors.toList());
}
private static List<? extends EthConnection> buildConnection(String attr, int tag) {
if (tag == ELINE_TAG) {
ELineConnection connection = new ELineConnection();
addAttribute(attr, connection);
return Lists.newArrayList(connection);
} else if (tag == ELAN_TAG) {
ELanConnection connection = new ELanConnection();
addAttribute(attr, connection);
return Lists.newArrayList(connection);
}
return Lists.newArrayList();
}
private static void addAttribute(String attr, EthConnection connection) {
connection.setAttribute(attr);
}
}
>
> 《Effective Java中文版第2版》第五章提到的泛型使用原则:
>
>
> 1、请不要再新代码中使用原生态类型(raw type)——原生态类型即不带任何实际类型参数的泛型名称,例如与List<E>相对应的原生态类型是List。
>
>
> 2、消除非受检警告——在可以证明引起警告的代码是类型安全的时候可以使用@SuppressWarnings("unchecked")注解来禁止这条警告。
>
>
> 3、列表优先于数组——数组与泛型相比,数组是协变的(covariant),而泛型是不可变的(invariant)。
![img](https://img-blog.csdnimg.cn/img_convert/a9a11882f550606900a34026ce4f8abe.png)
![img](https://img-blog.csdnimg.cn/img_convert/3ef65839f58409b8e70333e15bba0f15.png)
![img](https://img-blog.csdnimg.cn/img_convert/93f9afed28a6a8b02f90a111e5f07931.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**
8-1715793834483)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**