一、输出结果封装
1.resultType配置结果类型
我们在前面学习中了解到resultType属性可以指定结果集的类型,支持基本类型和实体类型。当然通过mybaits注册过别名的我们可以直接使用名称,没有注册的必须使用全限定类名,此时要求我们实体类中的属性名称和查询语句中的列保持一致,否则无法实现封装。
(1)基本类型
略(前面查询总数示例:int findTotal();)
(2)实体类
略(前面查询所有用户示例:List<User> findAll();)
(3)特殊示例
第一步:修改实体类,此时实体类和数据库表列名不一致
package com.xhbjava.domain;
import java.io.Serializable;
import java.util.Date;
/**
* User类
*
* @author Mr.wang
* @date 2020年1月7日
*/
public class User implements Serializable {
private Integer userId;
private String userName;
private Date userBirthday;
private String userSex;
private String userAddress;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getUserBirthday() {
return userBirthday;
}
public void setUserBirthday(Date userBirthday) {
this.userBirthday = userBirthday;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", userBirthday=" + userBirthday + ", userSex="
+ userSex + ", userAddress=" + userAddress + "]";
}
}
第二步:DAO接口
/** * 查询所有用户 * * @return */ List<User> findAll();
第三步:持久层配置文件
<select id="findAll" resultType="com.xhbjava.domain.User"> select * from user </select>
第四步:测试类测试
@Test public void testFindAll() { List<User> users = userDao.findAll(); for (User user : users) { System.out.println(user); } }
测试结果:
我们发现只有userName有值,因为mysql在windows中不区分大小写。
第五步:修改持久层配置文件
<select id="findAll" resultType="com.xhbjava.domain.User"> select id as userId,username as userName,birthday as userBirthday,sex as userSex,address as userAddress from user </select>
第六步:再次执行测试类
我们发现结果现在都显示出来了,但是有个问题就是对于表字段少的我们可以这么做,要是表的字段特别多是不是很麻烦?我们下面介绍解决办法。
2.resultMap 结果类型
(1)定义resultMap
<!-- 建立User实体和数据库表的对应关系 type属性;指定全限定类名;id属性:给定一个唯一标识,查询select标签会用 --> <resultMap type="com.xhbjava.domain.User" id="userMap"> <!-- id:指定主键 --> <id column="id" property="userId" /> <!-- result用于指定非主键字段;column:数据库类名;property:实体类属性名称 --> <result column="username" property="userName" /> <result column="sex" property="userSex" /> <result column="address" property="userAddress" /> <result column="birthday" property="userBirthday" /> </resultMap>
(2)修改持久层配置文件
<select id="findAll"resultMap="userMap">
select *from user </select>
(3)执行测试类进行测试
@Test public void testFindAll() { List<User> users = userDao.findAll(); for (User user : users) { System.out.println(user); } }
执行结果:
上述我们发现resultMap标签可以建立查询数据库表字段和实体类属性不一致时建立对于关系。select 标签中使用 resultMap 属性指定引用即可。同时 resultMap 可以实现将查询结果映射为复杂类 型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询
二、SqlMapConfig.xml配置文件
1.配置内容
(1)SqlMapConfig.xml配置内容
environments
environment
transactionManager
dataSource
mappers
mapper
package
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
(2)顺序
在配置SqlMapConfig.xml时,其中的节点是有顺序的,配置顺序依次为:
properties/settings/typeAliases/typeHandlers/objectFactory/objectWrapperFactory/plugins/environments/databaseIdProvider/mappers
2.properties属性
实用properties标签配置时我们可以采用两种方式制定属性配置。
第一种:
<?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> <properties> <property name="driver" value="com.mysql.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/easy_mybatis?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT" /> <property name="username" value="root" /> <property name="password" value="root" /> </properties> <!-- 配置环境 --> <environments default="mysql"> <!-- 配置mysql环境 --> <environment id="mysql"> <!-- 配置事务类型 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源 --> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 配置映射文件 --> <mappers> <!-- <mapper class="com.xhbjava.dao.IUserDao" /> --> <mapper resource="com/xhbjava/dao/IUserDao.xml" /> </mappers> </configuration>
第二种:
<?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> <properties resource="jdbcConfig.properties"> <!-- <property name="driver" value="com.mysql.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/easy_mybatis?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT" /> <property name="username" value="root" /> <property name="password" value="root" /> --> </properties> <!-- 配置环境 --> <environments default="mysql"> <!-- 配置mysql环境 --> <environment id="mysql"> <!-- 配置事务类型 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- 配置映射文件 --> <mappers> <!-- <mapper class="com.xhbjava.dao.IUserDao" /> --> <mapper resource="com/xhbjava/dao/IUserDao.xml" /> </mappers> </configuration>
jdbcConfig.properties文件内容如下:
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/easy_mybatis?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT jdbc.username=root jdbc.password=root
3.typeAliases(类型别名)
(1) 在前面我们说过,对于我们自己的实体类引用必须采用全限定类名形式引用,我们可以通过类别名解决这个问题。
<!-- 自定义别名 --> <typeAliases> <typeAlias alias="user" type="com.xhbjava.domain.User" /> </typeAliases>
在IUserDao.xml文件中使用别名:
<select id="findById" resultType="user" parameterType="int"> select * from user where id = #{uid} </select>
在测试类中测试即可。
(2)上面的定义我是对于一个类这么定义别名的,要是有很多类定义别名会很麻烦,因此我们可以用包(package)
<typeAliases> <!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以) --> <package name="com.xhbjava.domain"/> <package name="其它包"/> </typeAliases>
4.mappers(映射器)
在SqlMapConfig.xml配置文件中我们用到了映射器,映射器有下面几种用法:
<!-- 配置映射文件 --> <mappers> <!-- <mapper class="com.xhbjava.dao.IUserDao" /> --> <mapper resource="com/xhbjava/dao/IUserDao.xml" /> </mappers>
(1)<mapper resource=" " />
使用相对于类路径的资源
如:<mapper resource="com/xhbjava/dao/IUserDao.xml" />
(2)<mapper class=" " />
使用 mapper 接口类路径
如:<mapper class="com.xhbjava.dao.UserDao"/>
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。
(3)<package name=""/>
注册指定包下的所有 mapper 接口
如:<package name="cn.itcast.mybatis.mapper"/>
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。
com.xhbjava.domain.User