• Java MyBatis查询数据库&结果映射 之ResultMap的使用


     案例大致文件结构:

    BrandMapper接口类,存放有sql的查询方法

    pojo下的Brand是实体类

    BrandMapper.xml与mybatis-config.xml是配置文件

    test包下的myBatisTest是测试类

    准备环境
    1.数据库表tb_Brand
    2.实体类 Brand
    3.测试用例
    4.安装MyBatisX插件

    1.数据库表tb_Brand 

    2.实体类 Brand

    1. package com.itheima.pojo;
    2. /*
    3. 在实体类中,基本数据类型,建议使用其对应的包装类
    4. */
    5. public class Brand {
    6. //id主键
    7. private Integer id;
    8. //品牌名称
    9. private String brandName;
    10. //企业名称
    11. private String companyName;
    12. //排序字段
    13. private Integer ordered;
    14. //描述信息
    15. private String discription;
    16. //状态 0:禁用 1:启用
    17. private Integer status;
    18. public Brand(Integer id, String brandName, String companyName, Integer ordered, String discription,
    19. Integer status) {
    20. super();
    21. this.id = id;
    22. this.brandName = brandName;
    23. this.companyName = companyName;
    24. this.ordered = ordered;
    25. this.discription = discription;
    26. this.status = status;
    27. }
    28. public Brand() {
    29. }
    30. @Override
    31. public String toString() {
    32. return "Brand [id=" + id + ", brandName=" + brandName + ", companyName=" + companyName + ", ordered=" + ordered
    33. + ", discription=" + discription + ", status=" + status + "]";
    34. }
    35. public Integer getId() {
    36. return id;
    37. }
    38. public void setId(Integer id) {
    39. this.id = id;
    40. }
    41. public String getBrandName() {
    42. return brandName;
    43. }
    44. public void setBrandName(String brandName) {
    45. this.brandName = brandName;
    46. }
    47. public String getCompanyName() {
    48. return companyName;
    49. }
    50. public void setCompanyName(String companyName) {
    51. this.companyName = companyName;
    52. }
    53. public Integer getOrdered() {
    54. return ordered;
    55. }
    56. public void setOrdered(Integer ordered) {
    57. this.ordered = ordered;
    58. }
    59. public String getDiscription() {
    60. return discription;
    61. }
    62. public void setDiscription(String discription) {
    63. this.discription = discription;
    64. }
    65. public Integer getStatus() {
    66. return status;
    67. }
    68. public void setStatus(Integer status) {
    69. this.status = status;
    70. }
    71. }

    4.安装MyBatisX插件(更好用)

    1.查询所有数据


        (1).编写接口方法Mapper接口   List selectAll();
            参数:无
            返回值结果为:List
        (2).编写sql语句:sql映射文件
            
        (3).执行方法,测试

    (1).编写接口方法Mapper接口 List selectAll(); 参数:无 返回值结果为:List

    1. package com.itheima.mapper;
    2. /*
    3. 使用mapper代理方式完成入门案例
    4. 1.定义sql映射文件同名的mapper接口,并且将mapper接口和sql映射文件防止在同一目录下
    5. 2.设置sql映射文件的namespace属性为mapper接口全限定名
    6. 3.在mapper接口中定义方法,方法名就是sql映射文件中的sql语句中的id,并保持参数类型和返回值类型一致
    7. 4.编码
    8. 1.通过SqlSession的getMapper方法获取,Mapper接口的代理对象
    9. 2.调用对应方法完成sql的执行
    10. 细节:如果Mapper接口名称和sql映射文件名称相同,并在同意目录下,则就可以使用包扫描的方式简化sql映射文件的加载
    11. 更换为
    12. */
    13. import com.itheima.pojo.Brand;
    14. import java.util.List;
    15. public interface BrandMapper {
    16. //1.查询所有
    17. public List selectAll();
    18. //2.查看详情
    19. }

     (2).编写sql语句:sql映射文件
            

      (3).执行方法,测试

    (结果是成功的!)但是也可以发现公司名称和商品名称的值为null,这是由于

    数据库表的字段名称  和  实体类的属性名  不一样,则不能自动封装数据
    

    接下来我们来准备解决这个问题

    有三种方式

    1.起别名

    2.起别名并且定义sql片段

    3.使用resultMap

     1.起别名(缺点:太笨重)

    1. <select id="selectAll" resultType="com.itheima.pojo.Brand">
    2. select
    3. id,brand_name as brandName,company_name as companyName,ordered,discription,status
    4. from tb_brand;
    5. select>

    2.起别名并且定义sql片段(缺点:笨重,不灵活)

    1. <sql id="brand_column">
    2. id,brand_name as brandName,company_name as companyName,ordered,discription,status
    3. sql>
    4. <select id="selectAll" resultType="com.itheima.pojo.Brand">
    5. select
    6. <include refid="brand_column">include>
    7. from tb_brand;
    8. select>

    3.使用resultMap(缺点:看似不方便,其实方便的一批)

    1. <resultMap id="brandResultMap" type="com.itheima.pojo.Brand">
    2. <result column="brand_name" property="brandName">result>
    3. <result column="company_name" property="companyName">result>
    4. resultMap>
    5. <select id="selectAll" resultMap="brandResultMap">
    6. select
    7. *
    8. from tb_brand;
    9. select>

    对于这个问题做出总结:

    数据库表的字段名称  和  实体类的属性名  不一样,则不能自动封装数据
         起别名 缺点:每一次都需要重写
         定义sql片段(不灵活)
         ResultMap(以后最常用)
             id:完成主键字段的映射的
             column:数据库表的列名
             property:实体类的属性名
             result:完成一般字段的映射
             resultMap步骤:
                 1.定义resultMap标签
                 2.在select标签中把resultType换成resultMap属性
    
  • 相关阅读:
    红色模板和黑色模板的区别
    LAMP及论坛搭建
    Docker镜像与容器的工作原理
    LeetCode 2312. 卖木头块
    linux之linux下载软件包
    程序员合作保密协议
    QT--线程
    《TCP/IP网络编程》阅读笔记--进程间通信
    阿里P8架构师强推java程序员人手一套116页JVM吊打面试官专属秘籍
    AWS SAA知识点整理(作成中)
  • 原文地址:https://blog.csdn.net/qq_51272114/article/details/125915899