记录一个发现的小问题,刚刚在UserMapper.xml文件中有一段中文注释掉的内容:
<!-- <resultMap id="Usermap" type="User">-->
<!-- column:数据库中的字段 property:实体类中的属性-->
<!-- <result column="id" property="id"/>-->
<!-- <result column="pwd" property="password"/>-->
<!-- </resultMap>-->
<!-- <select id="query" resultMap="Usermap">-->
<!-- select * from data1.user where id = #{id}-->
<!-- </select>-->
运行测试类一直报错:
然后查看报错信息:
这一行刚好是注释所在行,于是删掉注释
再次运行成功了;
(类型处理器 插件 对象工厂暂时不用了解)
配置优化
别名
映射器
配置优化
解决属性名和字段名不一致的问题
之前只有mybatis-config.xml,现在新建db.properties:
#第一步优化:引入外部配置文件
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3308/data1?useSSL=true&userUnicode=true&characterEncoding=UTF-8
username=heziyi
password=123456
xml文件部分修改如下
<configuration>
<properties resource="db.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<!-- <property name="url" value="jdbc:mysql://localhost:3308/data1?useSSL=true&userUnicode=true&-->
<!--characterEncoding=UTF-8"/>-->
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 每一个mapper.xml都需要在mybatis的核心配置文件中注册!!-->
<mapper resource="com/kuang/dao/UserMapper.xml"/>
</mappers>
</configuration>
别名
类型别名是JAVA类型配置设置的一个短的名字,它只和XML配置有关,它存在的意义在于减少类完全限定名的冗余。如:
<typeAliases>
<typeAlias alias = "Author" type = "domain.blog.Ahthor"/>
</typeAliases>
现在在自己的项目中加上:
<!-- //可以给实体类起别名-->
<typeAliases>
<typeAlias type="com.kuang.pojo.User" alias="Usera"/>
</typeAliases>
关于resultmap
resultMap 中的id 和result 标签包含的属性相同,不同的地方在于, id 代表的是主键(或唯一值)的字段(可以有多个),它们的属性值是通过setter 方法注入的。id 和result 标签包含的属性。
column : 从数据库中得到的列名, 或者是列的别名。
property :映射到列结果的属性。可以映射简单的如“ username ”这样的属性,也可以映射一些复杂对象中的属性, 例如“ address.street.number ”,这会通过“ .”方式的属性嵌套赋值。
javaType : 一个Java 类的完全限定名,或一个类型别名(通过typeAlias 配置或者默认的类型)。如果映射到一个JavaB ean, MyB at is 通常可以自动判断属性的类型。如果映射到HashMap ,则需要明确地指定java Type 属性。
jdbcType : 列对应的数据库类型。JDBC 类型仅仅需要对插入、更新、删除操作可能
为空的列进行处理。这是JDBC j dbcType 的需要,而不是MyBatis 的需要。
**接口中定义的返回值类型必须和xml中配置的resultType 类型一致,否则就会因为类型
不一致而抛出异常。**返回值类型是由XML 中的resul tType (或resultMap 中的type )决定的,不是由接口中写的返回值类型决定的
在UserMapper.xml中修改resultType:(Usera是自定义的别名)
<select id="getUserById" parameterType="int" resultType="Usera">
select * from data1.user where id = #{id}
</select>
测试类:
@Test
public void getUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao dao = sqlSession.getMapper(UserDao.class);//获得接口
User user = dao.getUserById(3);
System.out.println(user);
sqlSession.close();
}
运行结果:
也可以指定一个包名,在包名下搜索需要的JavaBean
<typeAliases>
<package name = "com.kuang.pojo"/>
</typeAliases>
扫描实体类的包,它的默认别名就为这个类的类名,首字母小写如果实体类十分多,建议使用扫描实体类的包名,这种方法不能自定义别名,但如果非要改也可以通过在实体上增加注解
映射器
名称映射规则
property属性或别名要和对象中属性的名字相同,实际匹配时,mybatis会先将两者都转化为大写形式,再判断是否相同
每一个Mapper.xml都需要在Mybatis的核心配置文件中注册!注册的 三种方式
方式一:
<mappers>
<mapper resources = "com/kuang/dao/UserMapper.xml"/>
</mappers>
方式二:使用class文件绑定注册
<mappers>
<mapper class = "com.kuang.dao.UserMapper"/>
</mappers>
使用class的注意点:
- 接口和他的Mapper配置文件必须同名
- 接口和他的Mapper配置文件必须在同一个包下
方式三:使用包扫描
<package name=com.kuang.dao"/>
使用包扫描的注意点:
- 接口和他的Mapper配置文件必须同名
- 接口和他的Mapper配置文件必须在同一个包下
解决属性名和字段名不一致的问题
问题:数据库中的字段名和实体属性名不一致
pojo.User下面private String password;
而数据库的字段为pwd
- 起别名
- 利用resultmap(结果集映射)
查看表的字段:
实体中的数据名称:
public class User {
private int id;
private String name;
// private String pwd;
private String password;}
//省略getter setter tostring的方法
测试类:
@Test
public void query(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao que = sqlSession.getMapper(UserDao.class);
User user = que.query(2);
System.out.println(user);
sqlSession.close();
}
在不解决问题时输出:
原来的select语句:
(注释掉了)
<!-- <select id="query" resultType="com.kuang.pojo.User">-->
<!-- select * from data1.user where id = #{id}-->
<!-- </select>-->
改为:
<resultMap id="Usermap" type="com.kuang.pojo.User">
<result column="id" property="id"/>
<result column="pwd" property="password"/>
<result column="name" property="name"/>
</resultMap>
<select id="query" resultMap="Usermap">
select * from data1.user where id = #{id}
</select>
显示结果发现pwd一项不再是null:(原来的select语句输出时pwd一项为null)
- resultmap是mybatis中最强大的元素
- Resultmap的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系
- Resultmap最优秀的地方在于,虽然你已经对它相当了解了,但是根本不需要显式地用到它们