- 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
----------------------------------------------------------------分割线------------------------------------------------------------
类型转换器的使用
- List item
现在我们做一个假设现在项目需求是,对User的性别在在Java代码中设置为布尔类型
private boolean sex;
然而我们要在DB中显示的是int类型。男生用1表示,女生用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颜群老师的视频