先看下我的项目目录:
方式一:定义别名
mybatis-config.xml
:
<typeAliases>
<typeAlias type="vo.Emp" alias="aliemp"></typeAlias>
</typeAliases>
EmpMapper.xml
:
<select id="findAll" resultType="aliemp">
select * from stu
</select>
上面alias
的属性值是什么,下面的resultType
的属性值就是什么。
方式二:扫描包方式
mybatis-config.xml
:
<typeAliases>
<package name="vo"/>
</typeAliases>
EmpMapper.xml
:
<select id="findAll" resultType="emp">
select * from stu
</select>
上面的package中的name属性指定vo包下面的所有实体类,那么下面的resultType
属性值就写该实体类名称的小写字母。如:我的实体类名称叫Emp.java
,那么resultType
的属性值就是emp
,视图类名称叫XueSheng.java
,那么resultType
的属性值就是xuesheng
。
方式三:注解方式
mybatis-config.xml
:
<typeAliases>
<package name="vo"/>
</typeAliases>
EmpMapper.xml
:
<select id="findAll" resultType="myemp">
select * from stu
</select>
Emp.java
:
package vo;
import java.io.Serializable;
import java.util.Date;
import org.apache.ibatis.type.Alias;
@Alias("myemp")
public class Emp implements Serializable{
private String sname;
private String sex;
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
在Emp.java
实体类中起了个别名@Alias("myemp")
,那么在typeAliases
中还需要定义包的扫描路径,不然会报错!!!
踩坑总结:
刚开始我以为只需在实体类中定义一个别名,resultType
就能使用,于是就把这句给注释了:
报错:
Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'com/sdbairui/mapper/EmpMapper.xml'. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'myemp'. Cause: java.lang.ClassNotFoundException: Cannot find class: myemp
经过一番查阅资料后,得知需在typeAliases
中定义包的扫描路径,于是我这样写上了:
<typeAliases>
<package name="vo.Emp"/>
</typeAliases>
package
标签中的name属性直接定义到了vo包下面的Emp实体类,导致又出现了该错误……
于是,这样写就成功了:
<typeAliases>
<package name="vo"/>
</typeAliases>
这次,name属性值指定到这个包,没有直接指定到这个包中的某个实体类。