• MyBatis框架使用过程中出现的问题以及解决方案


    目录

    使用场景:

    数据库内容:

     实体类以及映射文件内容:

    Employee映射文件:

    Department映射文件:

    mysql核心配置文件:

    问题描述1

    原因分析1:

    解决方案1:

     问题描述2

    原因分析2:

    解决方案2:

     问题描述3

    原因分析3:

    解决方案3:

     问题描述4

    原因分析4:

    解决方案4:

     问题描述5

    原因分析5:

    解决方案5:

    总结:

    使用场景:

    使用MyBatis框架对于员工实体以及部门实体进行添加、按条件查询时出现的问题。


    数据库内容:

     

     实体类以及映射文件内容:

    实体类(get()、set()方法以及toString()方法省略):

    1. package com.apesource.entity;
    2. // 员工实体类
    3. public class Employee {
    4. private int empId; // 员工编号
    5. private String empName; // 员工姓名
    6. private double empSalary; // 月薪
    7. private Department dept; // 所在部门
    8. private String phoneNumber; // 手机号码
    9. // 无参构造
    10. public Employee() {
    11. }
    12. // 有参构造
    13. public Employee(String empName, double empSalary, int deptNo, String phoneNumber) {
    14. this.empName = empName;
    15. this.empSalary = empSalary;
    16. this.dept = new Department();
    17. this.dept.setDeptNo(deptNo);
    18. this.phoneNumber = phoneNumber;
    19. }
    20. }
    1. package com.apesource.entity;
    2. import java.util.List;
    3. // 部门实体类
    4. public class Department {
    5. private int deptNo; // 部门编号
    6. private String deptName; // 部门名称
    7. private String deptManager; // 部门经理
    8. private List employeeList; // 属于该部门的员工集合
    9. }

    Employee映射文件:

    1. "1.0" encoding="UTF-8"?>
    2. mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="com.apesource.mapper.EmployeeMapper">
    6. <insert id="insertNewEmployee">
    7. INSERT INTO employee_info
    8. (emp_name, dept_id, emp_salary, phone_number)
    9. VALUES (#{empName},#{dept},#{empSalary}, #{phoneNumber})
    10. insert>
    11. <resultMap type="com.apesource.entity.Employee" id="selectResult">
    12. <id column="emp_id" property="empId"/>
    13. <result column="emp_name" property="empName"/>
    14. <result column="phone_number" property="phoneNumber"/>
    15. <result column="emp_salary" property="empSalary"/>
    16. <association property="dept" javaType="com.apesource.entity.Department">
    17. <id column="dept_id" property="deptNo"/>
    18. <result column="dept_name" property="deptName"/>
    19. <result column="dept_manager" property="deptManager"/>
    20. association>
    21. resultMap>
    22. <select id="selectEmployeeListInDeptNames" resultType="selectResult">
    23. SELECT * FROM employee_info ei
    24. INNER JOIN department_info di ON ei.dept_id = di.dept_id
    25. WHERE dept_name IN
    26. <foreach collection="list" item="item" separator="," open="(" close=")">
    27. #{item}
    28. foreach>
    29. select>
    30. <select id="selectWebsiteListLikeName" resultMap="selectResult">
    31. SELECT * FROM employee_info ei
    32. INNER JOIN department_info di ON ei.dept_id = di.dept_id
    33. WHERE emp_name LIKE concat('%',#{empName},'%')
    34. ORDER BY emp_id ${order}
    35. select>
    36. <select id="selectEmployeeListByCondition" resultMap="selectResult">
    37. SELECT * FROM department_info AS di
    38. INNER JOIN employee_info as ei ON di.dept_id = ei.dept_id
    39. <where>
    40. <if test="empName != null and empName !=''">
    41. and emp_name like concat('%',#{empName},'%')
    42. if>
    43. <if test="empSalary != null and empSalary !=''">
    44. and emp_salary <= #{empSalary}
    45. if>
    46. <if test="phoneNumber != null and phoneNumber !=''">
    47. and phone_number = #{phoneNumber}
    48. if>
    49. where>
    50. select>
    51. <resultMap type="com.apesource.entity.Condition" id="result">
    52. <result column="dept_name" property="name"/>
    53. <result column="AVG(ei.emp_salary)" property="avg"/>
    54. <result column="MIN(ei.emp_salary)" property="min"/>
    55. <result column="MAX(ei.emp_salary)" property="max"/>
    56. <result column="SUM(ei.emp_salary)" property="sum"/>
    57. resultMap>
    58. <select id="statisticEmployeeGroupDept" resultMap="result">
    59. SELECT di.dept_name,AVG(ei.emp_salary),MIN(ei.emp_salary),MAX(ei.emp_salary),SUM(ei.emp_salary)
    60. FROM employee_info ei
    61. INNER JOIN department_info di ON ei.dept_id = di.dept_id
    62. GROUP BY dept_name
    63. order by SUM(ei.emp_salary)
    64. select>
    65. mapper>

    Department映射文件:

    1. "1.0" encoding="UTF-8"?>
    2. mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="com.apesource.mapper.DepartmentMapper">
    6. <resultMap type="com.apesource.entity.Department" id="selectResultMap">
    7. <id column="dept_id" property="deptNo"/>
    8. <result column="dept_name" property="deptName"/>
    9. <result column="dept_manager" property="deptManager"/>
    10. <collection property="employeeList" ofType="com.apesource.entity.Employee">
    11. <id column="emp_id" property="empId"/>
    12. <result column="emp_name" property="empName"/>
    13. <result column="emp_salary" property="empSalary"/>
    14. <result column="phone_number" property="phoneNumber"/>
    15. collection>
    16. resultMap>
    17. <select id="selectDepartmentById" resultMap="selectResultMap">
    18. SELECT * FROM department_info di
    19. INNER JOIN employee_info ei ON di.dept_id = ei.dept_id
    20. WHERE di.dept_id = #{id}
    21. select>
    22. mapper>

    mysql核心配置文件:

    1. "1.0" encoding="UTF-8"?>
    2. configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    4. <configuration>
    5. <settings>
    6. <setting name="logImpl" value="LOG4J" />
    7. settings>
    8. <environments default="development">
    9. <environment id="development">
    10. <transactionManager type="JDBC" />
    11. <dataSource type="POOLED">
    12. <property name="driver" value="com.mysql.cj.jdbc.Driver" />
    13. <property name="url" value="jdbc:mysql://localhost:3306/zhangyong?charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8" />
    14. <property name="username" value="********" />
    15. <property name="password" value="*********" />
    16. dataSource>
    17. environment>
    18. environments>
    19. <mappers>
    20. <package name="com.apesource.mapper"/>
    21. mappers>
    22. configuration>

    问题描述1

    执行任意方法时:提示Cause: java.lang.ClassNotFoundException: Cannot find class: com.mysql.cj.jdbc.Driver

     


    原因分析1:

    添加了MyBatis的核心驱动包以及相关jar包,但忘记添加mysql驱动包,导致无法连接到数据库,所以在加载MyBatis配置文件时出错。


    解决方案1:

    下载mysql核心驱动包mysql-connector-java-8.0.21.jar并配置到MyBatis框架

    mysql-connector-java-8.0.21.jar下载地址:Central Repository: mysql/mysql-connector-java/8.0.21


     问题描述2

    在进行批处理添加员工时,控制台显示Could not set parameters for mapping: ParameterMapping{property='dept', mode=IN, javaType=class java.lang.Object

    无法给Employee实体的dept属性赋值。

     


    原因分析2:

    Employee实体的字段的类型是Department,因此在设置mapper映射文件时#{dept}无法将值正确与Employee实体映射。


    解决方案2:

    在EmployeeMapper文件中,修改映射文件的字段,将dept修改为#{dept.deptNo}就可以了

    数据库中数据也就正确添加进去了。

     


     问题描述3

    在按照指定部门名称列表查询数据时,当解析映射文件时, 显示 Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'selectResult'.

     


    原因分析3:

    在设置映射文件时,ResultMap元素误写为ResultType,导致数据库在解析到数据后,不知道应该以哪一种方式存。


    解决方案3:

    重新修改返回结果元素ResultType为ResultMap即可

           将resultMap元素修改后,就可以查询到数据了

     


     

     问题描述4

    在按照员工姓名进行模糊查询,并按照员工编号,排序规则由OrderMode指定,同时传入两个参数,映射文件中依旧使用形参进行传参,控制台报Parameter 'order' not found. Available parameters are [arg1, arg0, param1, param2]

     


    原因分析4:

    在查询时,如果传入的是一个参数,那么映射文件中的传参可以是任意字符,但如果是多个字符,映射文件就无法找到具体参数,从而无法完成SQL语句的编写。

    解决方案4:

    一般多个参数的传递可以通过注解@param来保证映射文件能识别参数,也可以通过封装多个参数为一个实体类来进行传参,因为我只传递两个参数,所以选择注解传参。

     

     


     问题描述5

    在查询指定部门时,查询字段有部门名称、部门经理、员工列表,SQL语句在映射文件中已经完整拼接了,但结果集无法显示,控制台显示: Could not set property 'employeeList' of 'class com.apesource.entity.Department' with value'com.apesource.entity.Employee@64bce832' 

     


     

     

    原因分析5:

    在映射文件中,JavaType元素是在单步查询一对一时才使用的元素,而一个部门对应了多个员工,这就形成了一对多的关系,所以此时应该使用元素ofType才能匹配一对多问题。


    解决方案5:

    将collection标签中的javaType元素修改为ofType元素即可。

     

    总结:

    MyBatis作为一款完全开源的框架,对于原生的JDBC做了一个很好封装,简化了我们对于JDBC的操作,将更多的精力放在注重SQL映射文件上,给程序的维护带来了很大的便利,我们也可以结合数据库自身的特点灵活的控制SQL语句,因此能够实现比Hibernate等全自动ORM框架更高的查询效率,高效的完成复杂查询。

  • 相关阅读:
    javascript实战开发:json数据求指定元素的和算法
    python绘制三维图
    IB的IA EE TOK区别介绍
    泛创轻量化5G专网核心网,助力5G行业应用
    多线程(安全 同步 线程池)
    计算机视觉40例之案例16KNN英文字母识别
    数据中台方案分析和发展方向
    SSL证书:网络通信安全的基石
    想问下这个选什么?感觉正确答案是错误的,但又不知道正确的是哪个
    python中xpath解析
  • 原文地址:https://blog.csdn.net/qq_17845335/article/details/126372556