热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Mybatis通用DAO设计封装(mybatis)

说明:mybatis默认分页机制为逻辑分页,所以要处理成物理分页需要自己写一个拦截器(当然也可以不用这个分页机制,自己直接在SQL文件中实现也是可以的)RowBoundsrowBoundnew

说明:
mybatis默认分页机制为逻辑分页,所以要处理成物理分页需要自己写一个拦截器(当然也可以不用这个分页机制,自己直接在SQL文件中实现也是可以的)
RowBounds rowBound = new RowBounds(start, pageSize);
具体封装如下:

package util.dao.impl;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import util.bean.BeanMapUtil;
import util.dao.IBaseGenericDAO;
import util.exception.BaseDaoException;
import util.page.GenericDefaultPage;
import util.page.IGenericPage;
import util.reflect.ReflectGeneric;
/**
* 基于Mybatis的基础泛型DAO实现类。
*
* @author 赵士杰
*
* @param 业务实体类型
* @param ID类型 ,如:String、Long、Integer 等
*/
public abstract class MybatisBaseGenericDAOImpl
extends SqlSessionDaoSupport
implements IBaseGenericDAO {

public static final String SQLNAME_SEPARATOR = ".";

public static final String SQL_SAVE = "save";  
public static final String SQL_UPDATE = "update";  
public static final String SQL_GETBYID = "getById";
public static final String SQL_DELETEBYID = "deleteById";
public static final String SQL_DELETEBYIDS = "deleteByIds";
public static final String SQL_FINDPAGEBY = "findPageBy";  
public static final String SQL_FINDLISTBY = "findListBy";
public static final String SQL_GETCOUNTBY = "getCountBy";

private static final String SORT_NAME = "SORT";

private static final String DIR_NAME = "DIR";
/** 不能用于SQL中的非法字符(主要用于排序字段名) */
public static final String[] ILLEGAL_CHARS_FOR_SQL = {",", ";", " ", "\"", "%"};

/**
* 获取默认SqlMapping命名空间。
* 使用泛型参数中业务实体类型的全限定名作为默认的命名空间。
* 如果实际应用中需要特殊的命名空间,可由子类重写该方法实现自己的命名空间规则。
* @return 返回命名空间字符串
*/
@SuppressWarnings("unchecked")
protected String getDefaultSqlNamespace() {
Class clazz = ReflectGeneric.getClassGenricType(this.getClass());
String nameSpace = clazz.getName();
return nameSpace;
}

/**
* 将SqlMapping命名空间与给定的SqlMapping名组合在一起。
* @param sqlName SqlMapping名
* @return 组合了SqlMapping命名空间后的完整SqlMapping名
*/
protected String getSqlName(String sqlName) {
return sqlNamespace + SQLNAME_SEPARATOR + sqlName;
}

/**
* SqlMapping命名空间
*/
private String sqlNamespace = getDefaultSqlNamespace();

/**
* 获取SqlMapping命名空间
* @return SqlMapping命名空间
*/
public String getSqlNamespace() {
return sqlNamespace;
}

/**
* 设置SqlMapping命名空间。
* 此方法只用于注入SqlMapping命名空间,以改变默认的SqlMapping命名空间,
* 不能滥用此方法随意改变SqlMapping命名空间。
* @param sqlNamespace SqlMapping命名空间
*/
public void setSqlNamespace(String sqlNamespace) {
this.sqlNamespace = sqlNamespace;
}

/**
* 生成主键值。
* 默认情况下什么也不做;
* 如果需要生成主键,需要由子类重写此方法根据需要的方式生成主键值。
* @param ob 要持久化的对象
*/
protected void generateId(T ob) {

}

/* (non-Javadoc)
* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#save(java.lang.Object)
*/
public Integer save(T ob) {
generateId(ob);
return this.getSqlSession().insert(
getSqlName(SQL_SAVE), ob);
}

/* (non-Javadoc)
* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#update(java.lang.Object)
*/
public Integer update(T ob) {
return this.getSqlSession().update(
getSqlName(SQL_UPDATE), ob);
}

/* (non-Javadoc)
* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#getById(java.lang.String)
*/
@SuppressWarnings("unchecked")
public T getById(String id) {
return (T) this.getSqlSession().selectOne(
getSqlName(SQL_GETBYID), id);
}

/* (non-Javadoc)
* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#deleteByIds(ID[])
*/
public Integer deleteByIds(ID[] ids) {
return this.getSqlSession().delete(
getSqlName(SQL_DELETEBYIDS), ids);
}

/* (non-Javadoc)
* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#deleteById(java.io.Serializable)
*/
public Integer deleteById(ID id){
return this.getSqlSession().delete(
getSqlName(SQL_DELETEBYID), id);
}

/* (non-Javadoc)
* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#findPageBy(java.lang.Object, int, int, java.lang.String, java.lang.String)
*/
@SuppressWarnings("unchecked")
public IGenericPage findPageBy(
T param, int pageNo, int pageSize, String sort, String dir) {

// 获取满足条件的记录总数,没有记录时返回空页数据
int count = getCountBy(param);
if (count <1) {
return GenericDefaultPage.emptyPage();
}

Map paramMap = null;
try{
paramMap = BeanMapUtil.bean2Map(param);
}catch(Exception e){
throw new BaseDaoException("获取参数失败", e);
}
// Where过滤条件
// paramMap.put("param", param);
// 排序条件
if (sort != null) {
// 排序字段不为空,过滤其中可能存在的非法字符
sort = filterIllegalChars(sort, ILLEGAL_CHARS_FOR_SQL);
}
if (StringUtils.isEmpty(sort) || StringUtils.isEmpty(dir)) {
// paramMap.put("sort", null);
// paramMap.put("dir", null);
} else {
paramMap.put(SORT_NAME, sort);
paramMap.put(DIR_NAME, dir);
}
// 分页条件
int start = GenericDefaultPage.getStartOfPage(
pageNo, pageSize) - 1;
RowBounds rowBound = new RowBounds(start, pageSize);

List lst = this.getSqlSession().selectList(
getSqlName(SQL_FINDPAGEBY),
paramMap, rowBound);

return new GenericDefaultPage(pageNo, pageSize, lst, count);
}

/* (non-Javadoc)
* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#getCountBy(java.lang.Object)
*/
public Integer getCountBy(T param) {
Map paramMap = null;
try{
paramMap = BeanMapUtil.bean2Map(param);
}catch(Exception e){
throw new BaseDaoException("获取参数失败", e);
}
// paramMap.put("param", param);
return (Integer)this.getSqlSession().selectOne(
getSqlName(SQL_GETCOUNTBY), paramMap);
}

/* (non-Javadoc)
* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#findListBy(java.lang.Object, java.lang.String, java.lang.String)
*/
@SuppressWarnings("unchecked")
public List findListBy(T param, String sort, String dir) {
Map paramMap = null;
try{
paramMap = BeanMapUtil.bean2Map(param);
}catch(Exception e){
throw new BaseDaoException("获取参数失败", e);
}
// Where过滤条件
// paramMap.put("param", param);
// 排序条件
if (sort != null) {
// 排序字段不为空,过滤其中可能存在的非法字符
sort = filterIllegalChars(sort, ILLEGAL_CHARS_FOR_SQL);
}
if (StringUtils.isEmpty(sort) || StringUtils.isEmpty(dir)) {
// paramMap.put("sort", null);
// paramMap.put("dir", null);
} else {
paramMap.put(SORT_NAME, sort);
paramMap.put(DIR_NAME, dir);
}
List lst = this.getSqlSession().selectList(
getSqlName(SQL_FINDLISTBY), paramMap);
return lst;
}

public List findListBy(T param){
return findListBy(param, null, null);
}
/**
* 从给定字符串中将指定的非法字符串数组中各字符串过滤掉。
* @param str 待过滤的字符串
* @param filterChars 指定的非法字符串数组
* @return 过滤后的字符串
*/
protected String filterIllegalChars(String str, String[] filterChars) {
String rs = str;
if (rs != null && filterChars != null) {
for (String fc : filterChars) {
if (fc != null && fc.length() > 0) {
str = str.replaceAll(fc, "");
}
}
}
return rs;
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#insert(java.lang.String, java.lang.Object)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @param parameter 参数
* @return 执行结果——插入成功的记录数
* @see org.apache.ibatis.session.SqlSession#insert(java.lang.String, java.lang.Object)
*/
protected int insert(String statement, Object parameter) {
return this.getSqlSession().insert(
getSqlName(statement), parameter);
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#insert(java.lang.String)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @return 执行结果——插入成功的记录数
* @see org.apache.ibatis.session.SqlSession#insert(java.lang.String)
*/
protected int insert(String statement) {
return this.getSqlSession().insert(
getSqlName(statement));
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#update(java.lang.String, java.lang.Object)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @param parameter 参数
* @return 执行结果——更新成功的记录数
* @see org.apache.ibatis.session.SqlSession#update(java.lang.String, java.lang.Object)
*/
protected int update(String statement, Object parameter) {
return this.getSqlSession().update(
getSqlName(statement), parameter);
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#update(java.lang.String)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @param parameter 参数
* @return 执行结果——更新成功的记录数
* @see org.apache.ibatis.session.SqlSession#update(java.lang.String)
*/
protected int update(String statement) {
return this.getSqlSession().update(
getSqlName(statement));
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#delete(java.lang.String, java.lang.Object)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @param parameter 参数
* @return 执行结果——删除成功的记录数
* @see org.apache.ibatis.session.SqlSession#delete(java.lang.String, java.lang.Object)
*/
protected int delete(String statement, Object parameter) {
return this.getSqlSession().delete(
getSqlName(statement), parameter);
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#delete(java.lang.String)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @return 执行结果——删除成功的记录数
* @see org.apache.ibatis.session.SqlSession#delete(java.lang.String)
*/
protected int delete(String statement) {
return this.getSqlSession().delete(
getSqlName(statement));
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @param parameter 参数
* @param rowBounds 用于分页查询的记录范围
* @return 查询结果列表
* @see org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds)
*/
protected List selectList(
String statement, Object parameter, RowBounds rowBounds) {
return this.getSqlSession().selectList(
getSqlName(statement), parameter, rowBounds);
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @param parameter 参数
* @return 查询结果列表
* @see org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object)
*/
protected List selectList(String statement, Object parameter) {
return this.getSqlSession().selectList(
getSqlName(statement), parameter);
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#selectList(java.lang.String)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @return 查询结果列表
* @see org.apache.ibatis.session.SqlSession#selectList(java.lang.String)
*/
protected List selectList(String statement) {
return this.getSqlSession().selectList(
getSqlName(statement));
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#selectOne(java.lang.String, java.lang.Object)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @param parameter 参数
* @return 查询结果对象
* @see org.apache.ibatis.session.SqlSession#selectOne(java.lang.String, java.lang.Object)
*/
protected Object selectOne(String statement, Object parameter) {
return this.getSqlSession().selectOne(
getSqlName(statement), parameter);
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#selectOne(java.lang.String)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @return 查询结果对象
* @see org.apache.ibatis.session.SqlSession#selectOne(java.lang.String)
*/
protected Object selectOne(String statement) {
return this.getSqlSession().selectOne(
getSqlName(statement));
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.Object, java.lang.String, org.apache.ibatis.session.RowBounds)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @param parameter 参数
* @param mapKey 数据mapKey
* @param rowBounds 用于分页查询的记录范围
* @return 查询结果Map
* @see org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.Object, java.lang.String, org.apache.ibatis.session.RowBounds)
*/
protected Map selectMap(
String statement, Object parameter, String mapKey,
RowBounds rowBounds) {
return this.getSqlSession().selectMap(
getSqlName(statement),
parameter, mapKey, rowBounds);
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.Object, java.lang.String)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @param parameter 参数
* @param mapKey 数据mapKey
* @return 查询结果Map
* @see org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.Object, java.lang.String)
*/
protected Map selectMap(
String statement, Object parameter, String mapKey) {
return this.getSqlSession().selectMap(
getSqlName(statement), parameter, mapKey);
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.String)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @param mapKey 数据mapKey
* @return 查询结果Map
* @see org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.String)
*/
protected Map selectMap(String statement, String mapKey) {
return this.getSqlSession().selectMap(
getSqlName(statement), mapKey);
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#select(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @param parameter 参数
* @param rowBounds 用于分页查询的记录范围
* @param handler 结果集处理器
* @see org.apache.ibatis.session.SqlSession#select(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler)
*/
protected void select(
String statement, Object parameter, RowBounds rowBounds,
ResultHandler handler) {
this.getSqlSession().select(
getSqlName(statement),
parameter, rowBounds, handler);
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#select(java.lang.String, java.lang.Object, org.apache.ibatis.session.ResultHandler)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @param parameter 参数
* @param handler 结果集处理器
* @see org.apache.ibatis.session.SqlSession#select(java.lang.String, java.lang.Object, org.apache.ibatis.session.ResultHandler)
*/
protected void select(
String statement, Object parameter, ResultHandler handler) {
this.getSqlSession().select(
getSqlName(statement), parameter, handler);
}

/**
* 对{@link org.apache.ibatis.session.SqlSession#select(java.lang.String, org.apache.ibatis.session.ResultHandler)}的代理。
* 将statement包装了命名空间,方便DAO子类调用。
* @param statement 映射的语句ID
* @param handler 结果集处理器
* @see org.apache.ibatis.session.SqlSession#select(java.lang.String, org.apache.ibatis.session.ResultHandler)
*/
protected void select(String statement, ResultHandler handler) {
this.getSqlSession().select(
getSqlName(statement), handler);
}

// protected Integer update(String sqlName, Object param){
// return this.getSqlSession().update(sqlNamespace+"."+sqlName, param);
// }
// protected Integer save(String sqlName, Object param){
// return this.getSqlSession().insert(sqlNamespace+"."+sqlName, param);
// }
// protected Integer delete(String sqlName, Object param){
// return this.getSqlSession().delete(sqlNamespace+"."+sqlName, param);
// }
// protected Integer delete(String sqlName, Object[] param){
// return this.getSqlSession().delete(sqlNamespace+"."+sqlName, param);
// }
// protected List getMap(String sqlName, Object param){
// Map paramMap = new HashMap();
// paramMap.put("param", param);
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, paramMap);
// }
// protected List getMap(String sqlName, Map param){
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, param);
// }
// protected List findPageBy(String sqlName, Object param,int pageNo, int pageSize,String sort,String dir){
// Map paramMap = new HashMap();
// paramMap.put("param", param);
// if (StringUtils.isEmpty(sort) || StringUtils.isEmpty(dir))
// {
// paramMap.put("sort", null);
// paramMap.put("dir", null);
// }
// int start =0;
// if (pageNo > -1)
// start = (pageNo - 1) * pageSize;
// RowBounds rowBound = new RowBounds(start,pageSize);
// List lst = this.getSqlSession().selectList(sqlNamespace+"."+sqlName, paramMap,rowBound);
// return lst;
// }
//
// protected Integer getCountBy(String sqlName, Object param){
// Map paramMap = new HashMap();
// paramMap.put("param", param);
// return (Integer)this.getSqlSession().selectOne(sqlNamespace+"."+sqlName, paramMap);
// }
// protected Object getBy(String sqlName, String id){
// return this.getSqlSession().selectOne(sqlNamespace+"."+sqlName, id);
// }
// protected List getListBy(String sqlName,String id) {
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, id);
// }
// protected List findListBy(String sqlName,Object[] params) {
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, params);
// }
// protected Object getBy(String sqlName,Object param) {
// return this.getSqlSession().selectOne(sqlNamespace+"."+sqlName, param);
// }
// protected List findByParam(String sqlName,Object param) {
// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, param);
// }
}

原文地址:http://zhaoshijie.iteye.com/blog/2003209


推荐阅读
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 标题: ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
author-avatar
ScorpIo斡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有