MyBatis的类型转换器

  1. MyBatis全局参数
    在config.xml中设置格式如下:
<!-- 设置是否缓存-->
<settings>
			<setting name="cacheEnable" vaiue="false"  />
</settings>
  • 定义别名
    在我们定义parameterType时候会大量用到对象edu.ahau.entity.User,会比较麻烦。我们可以根据以下方法设置别名:

a.设置单个别名 设置的别名不区分大小写

<typeAliasaes>
		<typeAlias type="edu.ahau.entity.User" alias="User"
</typeAliasaes>

b.批量定义别名 在该包下的类的别名就是类名

<typeAliasaes>
		<package name="edu.ahau.entity">
</typeAliasaes>

除了自定义别名之外。MyBatis还内置了一些常见类的别名。这有详细的别名介绍

https://blog.csdn.net/qasrc6/article/details/78244628?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158995199219724848304493%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=158995199219724848304493&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-2-78244628.first_rank_v2_rank_v28&utm_term=MyBatis%E5%88%AB%E5%90%8D

----------------------------------------------------------------分割线------------------------------------------------------------

类型转换器的使用

  1. List item

现在我们做一个假设现在项目需求是,对User的性别在在Java代码中设置为布尔类型

private boolean sex;

然而我们要在DB中显示的是int类型。男生用1表示,女生用0表示
默认显示0
2. 直接上代码

public class BooleanAndIntConverter extends BaseTypeHandler<Boolean>{
    //java--->DB
	/**
	 * ps:PreparedStatement对象
	 * i: PreparedStatement对象操作参数的位置
	 * parameter :java类型
	 * jdbyType : 数据库类型
	 * 
	 * @param ps
	 * @param i
	 * @param parameter
	 * @param jdbcType
	 * @throws SQLException
	 */
	@Override
	public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType)
			throws SQLException {
		if (parameter) {
			ps.setInt(i, 1);
		}else {
			ps.setInt(i, 0);
		}
		
	}

	
	//DB--->java
	@Override
	public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {
		// TODO Auto-generated method stub
		int sex = rs.getInt(columnName);
		return sex == 1?true:false ;
	}

	@Override
	public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
		// TODO Auto-generated method stub
		int sex = rs.getInt(columnIndex);
		return sex == 1?true:false ;
	}

	@Override
	public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
		// TODO Auto-generated method stub
		int sex = cs.getInt(columnIndex);
		return sex == 1?true:false ;
	}
}

代码段中继承的是BaseTypeHandler,泛型是可以改变的,根据Java中属性的类型确定。
比如,我现在是要改变布尔类型的sex,因此泛型里面的是Boolean。

set设置的是Java到DB的类型转换
get设置的是DB到java的类型转换

3.修改User的Mapper

这是不带转换器的查询

<select id="selectUserByID" resultType="User" parameterType="int">
		select * from user where id = #{id}
	</select>

这是带转换器的查询

为什么要用resultMap而不是resultType
答:因为由前面知道Java的Boolean不能转换成DB的int

<select id="selectUserByIDWithConverter" resultMap="UserResult" parameterType="int">
		select * from user where id = #{id}
</select>
	<resultMap type="edu.ahau.lxy.entity.User" id="UserResult">
			<!-- 主键 和非主键 
			property属性(User类中)
			column字段名(db中)
			property,column一一对应
			-->			
			<id property="id" column="id" />
			<result property="name" column="name"/>
			<result property="age" column="age"/>
			<result property="sex" column="sex" javaType="boolean" jdbcType="INTEGER"/>
	</resultMap>

jdbcType的INTEGER最好是大写,虽然大小写都行,但是小写有可能会出问题,为了避免这些问题还是最好大写。
在这里插入图片描述
3.测试
查询
添加
添加一个用户的结果,可以看到sex处是1,对应着true。
在这里插入图片描述
这里我用的是接口,但是用我上一个没啥区别,但是一定要记得,sqlSession.commit();是对数据进行修改后一定要使用的。

所有的知识来自于bilibili颜群老师的视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值