一.MyBatis
配置详解
1.类型别名
类型别名可为java
类型设置一个缩写名字,他仅用于XML
配置,意在降低冗余的权限定类名书写。
1.1 typeAliases
<typeAliases>
<typeAlias alias="别名" type="全限定名">
</typeAliases>
这种方式一次只能写一个实体类,比较麻烦,为了解决这个问题,可以直接指定一个包名,MyBatis
会在包名下搜索需要的JavaBean
如下
<typeAliases>
<package name="实体类所在的包名"/>
</typeAliases>
在每个包下面的JavaBean
,在没有注解的情况下,会使用实体类的类名小写,如果在实体类里面写了注解会使用注解里面的.
@Alias("au")
pulic class Autnor(){
}
2.数据库命名规范和实体类命名规范不一致设置
2.1设置驼峰命名
<settings>
<setting name="mapunderscoreTocamelcase" value="ture"> //value值默认是false
</settings>
2.2在数据库中有自增的主键,如何去获取该键
在测试的时候给该主键给值,但是要获取该主键的值。
在执行SQL
语句的的地方加上下面这句话:
<insert id="insert" parameterType="int" userGeneratedkeys="true" keyProperty="id">
执行的SQL语句
</insert>// userGeneratedkey使用数据库生成的自增键,keyProperty 将生成的自增的值放到实体类的哪一个属性上
如果该自增键是数据库自动生成的:
<insert id="insert" parameterType="int">
<selectkey keyProperty="id" order="AFTER" resultTypw="String" >
select last_insert_id(); // keyProperty是指将select last_insert_id();执行的结果放在实体类的哪一个属性上
</selectkey>
执行的SQL语句
</insert>
如果数据库没有自动生成主键,人为怎么生成
<insert id="insert" parameterType="int">
<selectkey keyProperty="id" order="AFTER" resultTypw="String" >
select replace(UUID(),"-" "")
</selectkey>
</selectkey>
执行的SQL语句
</insert>
3.模糊查询
<select id="selectName" resultType="userInfoModel">
select * from userinfo where userName like '${userName}%';
</select>
#{}:会被替换成 ? 作为占位符存在,然后参数注入进去
${}:直接拼接到SQL中,有SQL注入的风险
4.列和字段的映射关系
用于数据库中列和实体类中属性名不一致,如果一致,可以不写
<resultType id="user" type="userinfo">
<id column="数据库列" property="实体字段">//用于指定主键字段
<result column="数据库列" property="实体字段">
<result column="数据库列" property="实体字段">//用于指定非主键字段
</resultType>
id=“user” user是唯一标识,自定义,type="userinfo"
userinfo
是实体类类型
如果写了上面这段代码,在SQL
语句中,要将resultType
="实体类全限定名"替换成resultType="唯一标识"
5.类型处理器
数据库类型和字段类型不一致的时候
5.1 自定义类型处理器
编写一个实体类继承BaseTypeHamdler
或者实现接口
public class GenderHandler extends BaseTypeHandler<String> {
/**
* 设置值时,调用此方法进行转换
*
* @param ps PreparedStatement 对象
* @param i 参数的顺序,第几个参数
* @param parame ter 参数
* @param jdbcType 数据库类型
* @throws SQLException
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String
parameter, JdbcType jdbcType) throws SQLException {
if ("男".equals(parameter)) {
ps.setInt(i, 1);
} else {
ps.setInt(i, 0);
}
}
/**
* 获取到值后进行对象关系映射时调用
*
* @param rs 结果集
* @param columnName 列名
* @return 转换后的结果,用于设置对象的值
* @throws SQLException
*/
@Override
public String getNullableResult(ResultSet rs, String columnName) throws
SQLException {
return rs.getInt(columnName) == 1 ? "男" : "女";
}
/**
* 获取到值后进行对象关系映射时调用
*
* @param rs 结果集
* @param columnIndex 列序号
* @return 转换后的结果,用于设置对象的值
* @throws SQLException
*/
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws
SQLException {
return rs.getInt(columnIndex) == 1 ? "男" : "女";
}
/**
* 用于执行存储过程等数据库操作后设置值时调用
*
* @param cs CallableStatement 对象
* @param columnIndex 列序号
* @return 转换后的结果,用于设置对象的值
* @throws SQLException
*/
@Override
public String getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
return cs.getInt(columnIndex) == 1 ? "男" : "女";
}
}
在 mybatis
的配置文件中,配置类型转换器
<!--
列和属性的映射关系
typeHandler 设置使用的类型转换器,设置这个结果集中这个字段使用自定义类型转换器
-->
<resultMap id="userinfo" type="UserInfo">
<result column="gender" property="gender" javaType="String"
jdbcType="BIT" typeHandler="com.kfm.handler.GenderHandler"/>
</resultMap>
6.Mapper
映射器
6.1 resource
使用相对路径
<mapper resource="com/kfm/dao.UserInfoDao.xml" />
6.2class
使用接口全限定名,和接口同名同路文件
<mapper classe="com/kfm/dao.UserInfoDao.xml" />
6.3 url
使用绝对路径
<mapper url="com/kfm/dao.UserInfoDao.xml" />
6.4 package标签
<Mappers>
<package name="接口的全限定名">
</Mappers>