······-config.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config3.0//EN"
"http://mybatis.org//dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="cn.smbms.pojo.User" alias="_User"/> <!-- type实体类包路径被alias替代为_User -->
<package name="cn.smbms.dao.user"/> <!-- package具有属性name,顾名思义就是所在包的名字。 -->
</typeAliases>
<!-- 配置mybatis 多套运行环境 -->
<environments default="development">
<environment id="development">
<!-- 配置事务管理,采用JDBC的事务管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED:mybatis 自带的数据源,JNDI;基于tomcat的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 将mapper文件加入配置文件中 -->
<mappers>
<mapper resource="cn/smbms/dao/user/UserMapper.xml"/>
<mapper class="cn/smbms/dao/user/UserMapper"/>
</mappers>
</configuration>
在上面的代码中我们可以发现在typealiases中,有一段代码被注释了:
<typeAlias type="cn.smbms.pojo.User" alias="_User"/>
typealiase具有两个属性,type和alias。
type中的属性值写的是对应实体的全类名。上面的例子则表示实体类“User”所在的包路径“cn.smbms.pojo.User”两个部分组成。
alias的属性值则是取代type中的属性值,即可以用_User表示所对应的实体类是cn.smbms.pojo.User包下的User。
再看package,package具有属性name。顾名思义就是所在包的名字。
<package name="cn.smbms.dao.user"/>
Mappers是用来在mybatis初始化的时候,告诉mybatis需要引入哪些Mapper映射文件。那什么又是Mapper映射文件呢?它是Java实体类与数据库对象之间的桥梁。在实际的使用过程中,一般一个Mapper文件对应一个数据库操作Dao接口。
在配置文件中,MyBatis加载mappers映射文件有三种方式:
1.通过resource加载映射文件
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
2.通过resource加载映射文件
<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命名。