首先看一个配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<!-- <typeAlias type="zq.mybatis.test1.User" alias="_User"/> -->
<package name="com.how2java.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/how2java?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/how2java/pojo/Category.xml"/>
<mapper class="com.how2java.mapper.CategoryMapper"/>
</mappers>
</configuration>
在上面的代码中我们可以发现在typealiases中,有一段代码被注释了:
<typeAlias type="zq.mybatis.test1.User" alias="_User"/><package name="com.how2java.pojo"/>
typealiase具有两个属性,type和alias。
type中的属性值写的是对应实体的全类名。上面的例子则表示实体类“User”所在的包路径“zq.mybatis.test1.”两个部分组成。
alias的属性值则是取代type中的属性值,即可以用_User表示所对应的实体类是zq.mybatis.test1包下的User。
再看package,package具有属性name。顾名思义就是所在包的名字。
<package name="zq.mybatis.test1.User"/>
Mappers是用来在mybatis初始化的时候,告诉mybatis需要引入哪些Mapper映射文件。那什么又是Mapper映射文件呢?它是Java实体类与数据库对象之间的桥梁。在实际的使用过程中,一般一个Mapper文件对应一个数据库操作Dao接口。
在配置文件中,MyBatis加载mappers映射文件有三种方式:
1、通过resource加载映射文件
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
2、通过mapper接口加载映射文件
<mappers>
<!-- 通过mapper接口加载映射文件 -->
<!-- 遵循规范:需要将mapper接口类名与xml文件映射名称保持一致,且在一个目录中,规范的前提是:使用的是mapper代理的方法 -->
<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>
</mappers>
3、批量加载映射文件
<mappers>
<!-- 批量加载
指定接口的包名称,自动扫描包下的所有mapper接口进行加载
-->
<package name="cn.itcast.mybatis.mapper"/>
</mappers>
下面通过一段对应的映射文件来比较别名的使用情况:
<!-- 插入对象是的传入参数为整个实体类,相对应的参数要与实体中属性相同 -->
<insert id="insertUser" parameterType="_User">
insert into users(name,age) values(#{name},#{age})
</insert>
<!-- 查询所有结果时,因为是将一个一个的USer实体添加到list中,
所以在指定其返回结果参数只需要指定为返回实体就可以了 -->
<select id="getAllUser" resultType="_User">
select * from users
</select>
上面这段映射使用的是typealias定义出来的别名_User,当我们使用package时,并没有定义别名,如果我们还是使用这种方式的话,就会出现java.lang.ExceptionInInitializerError的错误。
Cause: java.lang.RuntimeException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class .
Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias ‘_User’.
Cause: java.lang.ClassNotFoundException: Cannot find class: _User
<update id="updateUser" parameterType="User">
update users set name=#{name},age=#{age} where id=#{id}
</update>
<select id="getAllUser" resultType="User">
select * from users
</select>
使用package时候,我们指定了他的包名,那这个包下面的所有实体相当于已经被设置了别名,而这个别名实际上就是某一个实体自己的实体名。
比如返回类型是该包下的User,我们就直接写User就可以了。