mybatis的mapper.xml文件中含有中文注释时运行出错,mybatis配置优化和别名优化 mybatis配置之映射器说明

记录一个发现的小问题,刚刚在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&amp;userUnicode=true&amp;-->
<!--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最优秀的地方在于,虽然你已经对它相当了解了,但是根本不需要显式地用到它们
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值