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=123456xml文件部分修改如下
<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>測試類:
@Testpublic void getUserById(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserDao dao = sqlSession.getMapper(UserDao.class);//獲得接口User user = dao.getUserById(3);System.out.println(user);sqlSession.close();}運行結果:
也可以指定一個包名,在包名下搜索需要的JavaBean
掃描實體類的包,它的默認別名就為這個類的類名,首字母小寫如果實體類十分多,建議使用掃描實體類的包名,這種方法不能自定義別名,但如果非要改也可以通過在實體上增加注解
映射器
名稱映射規則
property屬性或別名要和對象中屬性的名字相同,實際匹配時,mybatis會先將兩者都轉化為大寫形式,再判斷是否相同
每一個Mapper.xml都需要在Mybatis的核心配置文件中注冊!注冊的 三種方式
方式一:
方式二:使用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(結果集映射)
查看表的字段:
實體中的數據名稱:
測試類:
@Testpublic void query(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserDao que = sqlSession.getMapper(UserDao.class);User user = que.query(2);System.out.println(user);sqlSession.close();}在不解決問題時輸出:
原來的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最優秀的地方在于,雖然你已經對它相當了解了,但是根本不需要顯式地用到它們
總結
以上是生活随笔為你收集整理的mybatis的mapper.xml文件中含有中文注释时运行出错,mybatis配置优化和别名优化 mybatis配置之映射器说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA第一个mybatis程序 myb
- 下一篇: task2:opencv的python接