1.MyBatis自定义TypeHandler
2.联想+手写笔记本电脑(联想笔记本电脑怎么可以手写)
MyBatis自定义TypeHandler
MyBatis自定义TypeHandler1什么是手写TypeHandler
TypeHandler根据字面意思即为类型处理器
引用官方文档的描述:MyBatis在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时,都会用类型处理器将获取到的源码值以合适的方式转换成Java类型
MyBatis存在一些默认的类型处理器,可参考官方文档
2为什么要使用TypeHandler在开发过程中,当默认的TypeHandler无法满足需求时,例如遇到MyBatis不支持的数据类型或需要特殊处理的类型转换,便需要自己定制对应的TypeHandler
笔者会在下面的代码实现中完成如下几种情况的TypeHandler:
逗号分隔保存在数据库中的数据,在对应的Java类中为数组
自定义枚举
3如何自定义TypeHandlerMyBatis提供了接口org.apache.ibatis.type.TypeHandler和类org.apache.ibatis.type.BaseTypeHandler
官方文档给出的示例为继承BaseTypeHandler,笔者在这里也使用这种方式
先来观察一下官方的StringTypeHandler:
publicclassStringTypeHandlerextendsBaseTypeHandler<String>{ @OverridepublicvoidsetNonNullParameter(PreparedStatementps,inti,Stringparameter,JdbcTypejdbcType)throwsSQLException{ ps.setString(i,parameter);}@OverridepublicStringgetNullableResult(ResultSetrs,StringcolumnName)throwsSQLException{ returnrs.getString(columnName);}@OverridepublicStringgetNullableResult(ResultSetrs,intcolumnIndex)throwsSQLException{ returnrs.getString(columnIndex);}@OverridepublicStringgetNullableResult(CallableStatementcs,intcolumnIndex)throwsSQLException{ returncs.getString(columnIndex);}}方法名称和代码都简洁明了,观察可知,只需要完成四个方法的覆盖,即可实现自定义TypeHandler
3.1逗号分隔字符串转数组假设用户表t_user设计如下:
idusernametags1adminadmin,user对应的Java类为:
@Data@NoArgsConstructor@SuperBuilder(toBuilder=true)publicclassUser{ privateStringid;privateStringusername;privateString[]tags;}tags属性在数据库中用逗号分隔的字符串保存,但User类对应的属性为String数组
可以创建StringArrayTypeHandler来解决类型转换的问题:
publicclassStringArrayTypeHandlerextendsBaseTypeHandler<String[]>{ @OverridepublicvoidsetNonNullParameter(PreparedStatementpreparedStatement,inti,String[]strings,JdbcTypejdbcType)throwsSQLException{ preparedStatement.setString(i,StringUtils.join(strings,","));}@OverridepublicString[]getNullableResult(ResultSetresultSet,Strings)throwsSQLException{ returnconvert(resultSet.getString(s));}@OverridepublicString[]getNullableResult(ResultSetresultSet,inti)throwsSQLException{ returnconvert(resultSet.getString(i));}@OverridepublicString[]getNullableResult(CallableStatementcallableStatement,inti)throwsSQLException{ returnconvert(callableStatement.getString(i));}/***将查询值转换为数组**@paramvalue查询值,String*@return转换结果,String[]*/privateString[]convert(Stringvalue){ returnStringUtils.isEmpty(value)?newString[0]:value.split(",");}}3.2自定义枚举如何创建包含中文名称的枚举,可以参考MyBatis中使用Java类与枚举
先创建工具类用于根据code获取枚举实体:
publicclassValueNameEnumUtils{ privateValueNameEnumUtils(){ }publicstatic<EextendsValueNameEnum>EvalueOf(Class<E>enumClass,intvalue){ E[]enumConstants=enumClass.getEnumConstants();for(Ee:enumConstants){ if(e.getValue()==value){ returne;}}returnnull;}}和3.1中的情况不同,枚举的具体类型是不确定,所以我们要使用泛型的方式处理TypeHandler
创建ValueNameEnumTypeHandler:
publicclassValueNameEnumTypeHandler<EextendsValueNameEnum>extendsBaseTypeHandler<ValueNameEnum>{ privatefinalClass<E>type;publicValueNameEnumTypeHandler(Class<E>type){ if(type==null){ thrownewIllegalArgumentException("Typeargumentcannotbenull");}this.type=type;}}泛型虽然名之为泛,但在编译过程中实际会发生类型擦除
总之,对于泛型TypeHandler,我们需要声明一个用来标识具体类型的属性privatefinalClass<E>type和创建对应的构造函数publicValueNameEnumTypeHandler(Class<E>type)
接下来和3.1中的一致,重写四个方法:
publicclassValueNameEnumTypeHandler<EextendsValueNameEnum>extendsBaseTypeHandler<ValueNameEnum>{ privatefinalClass<E>type;publicValueNameEnumTypeHandler(Class<E>type){ if(type==null){ thrownewIllegalArgumentException("Typeargumentcannotbenull");}this.type=type;}@OverridepublicvoidsetNonNullParameter(PreparedStatementps,inti,ValueNameEnumparameter,JdbcTypejdbcType)throwsSQLException{ ps.setInt(i,parameter.getValue());}@OverridepublicEgetNullableResult(ResultSetrs,StringcolumnName)throwsSQLException{ intcode=rs.getInt(columnName);returnrs.wasNull()?null:valueOf(code);}@OverridepublicEgetNullableResult(ResultSetrs,intcolumnIndex)throwsSQLException{ intcode=rs.getInt(columnIndex);returnrs.wasNull()?null:valueOf(code);}@OverridepublicEgetNullableResult(CallableStatementcs,intcolumnIndex)throwsSQLException{ intcode=cs.getInt(columnIndex);returncs.wasNull()?null:valueOf(code);}/***根据枚举值返回枚举示例**@paramcode枚举值*@return枚举实例*/privateEvalueOf(intcode){ try{ returnValueNameEnumUtils.valueOf(type,code);}catch(Exceptionex){ thrownewIllegalArgumentException("Cannotconvert"+code+"to"+type.getSimpleName()+"bycodevalue.",ex);}}}完成上述代码直接启动,会抛出异常:Unabletofindausableconstructorforclasscn.houtaroy.springboot.common.MyBatis.handler.ValueNameEnumTypeHandler
产生异常的源码如下:
public<T>TypeHandler<T>getInstance(Class<?>javaTypeClass,Class<?>typeHandlerClass){ //未指定JavaType,此处为falseif(javaTypeClass!=null){ try{ Constructor<?>c=typeHandlerClass.getConstructor(Class.class);return(TypeHandler<T>)c.newInstance(javaTypeClass);}catch(NoSuchMethodExceptionignored){ //ignored}catch(Exceptione){ thrownewTypeException("Failedinvokingconstructorforhandler"+typeHandlerClass,e);}}try{ //此处抛出异常Constructor<?>c=typeHandlerClass.getConstructor();return(TypeHandler<T>)c.newInstance();}catch(Exceptione){ thrownewTypeException("Unabletofindausableconstructorfor"+typeHandlerClass,e);}}报错的原因直白,没有找到ValueNameEnumTypeHandler的构造函数
首先我们要了解下Java类构造函数的机制:如果定义了构造函数,则使用定义,否则默认生成空构造函数
在3.1中的StringArrayTypeHandler,我们没有定义构造函数,自动生成空构造函数,typeHandlerClass.getConstructor()不会抛出异常
但ValueNameEnumTypeHandler定义了一个构造函数ValueNameEnumTypeHandler(Class<E>type),且没有指定JavaType,typeHandlerClass.getConstructor()自然抛出异常
解决方法有两种:
创造空的构造函数
指定JavaType
笔者推荐第二种,因为第一种方式枚举类属性type会产生NPE(空指针异常),MyBatis官方也我们提供了注解@MappedTypes用于指定JavaType:
@MappedTypes(ValueNameEnum.class)publicclassValueNameEnumTypeHandler<EextendsValueNameEnum>extendsBaseTypeHandler<ValueNameEnum>{ //...}4如何使用TypeHandler在上一章节中,我们完成了编码实现自定义TypeHandler,但完成的TypeHandler还没办法进行使用,需要手动进行配置
有两种配置方式:局部使用和全局使用
以StringArrayTypeHandler举例:
4.1局部使用在ResultMap中使用:
<resultMapid="UserResultMap"type="cn.houtaroy.springboot.common.system.model.User"><idcolumn="id"property="id"/><resultcolumn="tags"property="tags"typeHandler="cn.houtaroy.springboot.extension.mybatis.handler.StringArrayTypeHandler"/></resultMap>在语句中使用:
updatet_usersettags=#{ tags,typeHandler=cn.houtaroy.springboot.extension.mybatis.handler.StringArrayTypeHandler}4.2全局使用使用配置文件指定handler包名:
@Data@NoArgsConstructor@SuperBuilder(toBuilder=true)publicclassUser{ privateStringid;privateStringusername;privateString[]tags;}0注意,此配置类型为String,只能配置一个包,推荐使用下面的方式
手写配置类:
@Data@NoArgsConstructor@SuperBuilder(toBuilder=true)publicclassUser{ privateStringid;privateStringusername;privateString[]tags;}1StringArrayTypeHandler不适合全局配置,它会在全部JavaType为String[]的属性上使用
5拓展阅读MyBatis3官方文档中TypeHandler内容:mybatis–MyBatis3|配置
网上搜索的在SpringBean声明周期中进行全局配置:Mybatis自定义全局TypeHander_chuobenggu的博客-CSDN博客
联想+手写笔记本电脑(联想笔记本电脑怎么可以手写)
1. 联想笔记本电脑怎么可以手写
1,以搜狗输入法为例,首先下载并安装搜狗输入法。手写
2,源码然后将电脑输入法切换至搜狗输入法,点击打开齿轮状的手写图标。
3,源码坑后上涨源码公式打开后在工具箱中找到手写输入
4,设置之后,打开手写输入板后,手写点击鼠标左键,源码移动鼠标即可写字,手写写完一个字选择即可。源码
2. 联想 手写笔记本电脑怎么开机
联想笔记本u深度一键u盘启动bios设置教程:
1、手写打开联想笔记本电脑,源码反马丁格尔策略源码文华版在出现开机logo时按f2进入bios设置界面,手写
2、源码接着使用上下方向键将光标移至advanced选项,手写按回车键执行,在弹出的小窗口中使用上下方向键将光标移至sata
mode
selection选项,将模式改成ahci按回车键确认选择,
3、再次使用上下方向键将光标移至boot选项,此时就可以看到usb驱动u盘启动的选项了,调整启动优先顺序,按f保存并退出
4、公交车上的同乘溯源码完成上述的所有操作后电脑便会从u盘启动并进入u深度的主菜单界面。
3. 联想可以手写的笔记本电脑
第一:惠普大师本兹布克uG5
惠普的笔记本电脑配备了十大绘图笔记本排名中的Core I7处理器,是一款性能强劲的单一产品,其外观采纳高端加工铝合金制成,当作办公时尚轻巧便携。
第二:ThinkPad联想P
联想的笔记本电脑质量向来很好,支持多点触控,操作非常方便。高清分辨率使图像看起来更清晰,绘图更完美,%色域使整个图像更精巧。ai电销机器人源码搭建
第三,艳羡惠普CNTX
这款笔记本电脑可以说是性能超强。它配备了第八代处理器,运行速度非常快。充满血液的独立显卡使综合性能更强。如果用于寻常的平面设计和绘图,工作效率会更高。
第四,表面书2代
这款单品超级有用,性价比高,设计精美。共享按摩椅源码系统开发专业的手写笔和灵敏的屏幕使其易于操作,震撼的图像分辨率和色彩非常适合绘图工作。
V.微卫星WS-8SJ
MSI品牌的这款单品采纳专业的绘图显示,操作流畅度非常好。毕竟,它携带的处理器非常强大,而且它的综合性价比值得一提。
第六,未来人类总部
未来人类大家庭的这款产品在十大绘图笔记本排名中配备了升级版的专业图像显示卡。与前代产品相比,整体图像计算能力有了巨大提高,其强大的性能也适用于寻常游戏和娱乐。
七.镭波X-W3
这个产品的激光波家园将是相当好的平面设计和三维建模。强大的高性能处理器不仅运行速度快,而且即使长时间运行也不用担心发热或图像不清晰。
八、华硕凌瑶S 2代
华硕拥有的这款笔记本的处理器非常强大,精巧小巧的设计非常吸引人。宽窄的屏幕让视野更开阔,高清分辨率可以清晰显示图像的每个详情。
九.惠普ZBOOK工作室G4
惠普笔记本在市场上享有很高的声誉。它搭载的英特尔多核处理器在各方面的处理器速度和效率都非常出色,高速内存也非常完美。
X.惠普妒忌薄夏普x
这款产品在十大绘图笔记本中的性价比极高。其出色的处理器和高速多核内核使图像呈现更加清晰细腻,从长远来看无需担心图像的不稳定和不清晰。
4. 联想笔记本电脑手写笔怎么用
输入法要用调成手写的。
例如搜狗要设置成手写输入,搜狗工具箱里面有。点击搜狗输入法的那个小齿轮会出现。
5. 联想手写笔记本电脑价格
联想笔记本的一个手写笔是通过的,要进行个年纪,我们只要对手写笔的蓝牙和电脑的那样进行一个配对就可以了。
6. 联想 手写笔记本电脑哪款好
目前市面上好的手写板品牌有Wacom和冠,汉王,大将军,友基Ugee,联想Lenovo这些,都是买购大品牌门户网上推荐的最新的手写板品牌,手写板的硬件参数影响价格最大的是板子大小。
如果是初学者不建议买高端产品,给楼主推荐一个,汉王的创意高手+性价比相对好。还有最主要的一点就是要亲自去试试手感,再好的手写板,你用着不舒服就等于没用,试用的时候主要在驱动设置里试验压感分别调至最低和最高都试一试。
7. 联想手写笔记本电脑价格一览表
可以手写写字的,可下载一款方便的输入法,以下以万能输入法为例。
2、先下载安装万能五笔,首先用快捷键“Ctrl+Shift”切换出万能五笔输入法,在其状态栏上的“主菜单”中打开“工具箱”。
3、打开“工具箱”后就可以看到“手写输入”的功能了,如果是第一次使用还需点击它下载安装;
4、打开“手写输入”后在弹出的手写框中就可以用鼠标写字了,写完后在右边的检字框中点击想要输入的字即可。