mybatis常见问题

1.MyBatis高级映射(一对一、一对多、多对多、延迟加载)

原文链接:https://blog.csdn.net/WangFengFans/article/details/80250159

2.MyBatis两个表 字段名称相同 数据被覆盖

原文链接:https://www.iteye.com/blog/java-007-2304720

方法一:column别名

<resultMap type="Desk" id="resultUserMap">  
        <result property="DESK_ID" column="DESK_ID" />  
        <result property="NAME" column="NAME" />  
        <result property="REMARK" column="REMARK" />  
        <collection property="books" ofType="Book" column="DESK_ID">  
            <id property="BOOK_ID" column="BOOK_ID" />      
            <result property="NAME" column="bNAME"/>  
            <result property="REMARK" column="bREMARK"/>     
            <result property="PRICE" column="PRICE"/>   
        </collection>  
    </resultMap>    
  
    <select id="getBooksByDesk" resultMap="resultUserMap" parameterType="String">  
        SELECT d.DESK_ID,d.NAME,d.REMARK,b.BOOK_ID,b.NAME as bNAME,
        b.REMARK as bREMARK,b.PRICE FROM tb_desk d,tb_book b WHERE 
        b.desk_id=d.desk_id AND d.desk_id=#{desk_id}   
    </select> 

方法二:columnPrefix别名

<resultMap type="Desk" id="resultUserMap" >  
        <result property="DESK_ID" column="DESK_ID" />  
        <result property="NAME" column="NAME" />  
        <result property="REMARK" column="REMARK" />  
        <collection property="books" ofType="Book" column="DESK_ID"  columnPrefix="ks_" >  
            <id property="BOOK_ID" column="BOOK_ID" />      
            <result property="NAME" column="NAME"/>  
            <result property="REMARK" column="REMARK"/>     
            <result property="PRICE" column="PRICE"/>   
        </collection>  
    </resultMap>    
  
    <select id="getBooksByDesk" resultMap="resultUserMap" parameterType="String">  
        SELECT d.DESK_ID,d.NAME,d.REMARK,b.BOOK_ID,b.NAME as ks_NAME,
        b.REMARK as ks_REMARK,b.PRICE FROM tb_desk d,tb_book b WHERE 
        b.desk_id=d.desk_id AND d.desk_id=#{desk_id}   
    </select> 

3.MyBatis常用查询

多条件选择查询:

 List<User> selectByCondition(@Param("params") Map<String, Object> params);
 <select id="selectByCondition" resultMap="BaseResultMap" parameterType="java.util.Map">
        select
        <include refid="Base_Column_List"/>,
        from user 
        <where>
            <if test="params!=null and params.name!=null">
                and name = #{params.name,jdbcType=VARCHAR}
            </if>
            <if test="params!=null and params.position!=null">
                and position = #{params.position,jdbcType=VARCHAR}
            </if>
            <if test="params!=null and params.employeeNoList!=null">
                and employee_no in
                <foreach collection="params.employeeNoList" item="employeeNo" open="" open="(" separator="," close=")">
                    #{employeeNo,jdbcType=VARCHAR}
                </foreach>
            </if>
 	       <if test="params!=null and params.startTime!=null">
                and create_time &gt; #{params.startTime}
            </if>
            <if test="params!=null and params.endTime!=null">
                and create_time &lt; #{params.endTime}
            </if>
            <if test="params!=null and params.keyWord!=null">
                and (employee_no like #{params.keyWord} or name like #{params.keyWord} )
            </if>
        </where>
		 order by create_time desc
    </select>

返回值类型map:

List<Map<String, Object>> queryInfo(@Param("name") String name, @Param("endTime") Date endTime);
  <select id="queryVehicleRelatedInfo" resultType="java.util.Map">
	 SELECT u.name name,u.position position,u.employee_no employeeNo from user u
  		<if test="name!=null">
           and name = #{name,jdbcType=VARCHAR}
        </if>
		<if test="endTime!=null">
           and create_time &lt; #{endTime}
        </if>	
  </select>

MyBatis在insert插入操作时返回主键ID的配置

<insert id="insert" parameterType="....user" useGeneratedKeys="true" keyProperty="id">
    @Test
    public void test1() {
        User user = new User();
        user.setName("a");
        user.setAge(50);
        Long aLong = userMapperExt.insertSelectiveAndReturnId(user);
        System.out.println(aLong);
    }

条件查询 ,参数为对象
传入参数为NULL,查询所有.

    <select id="selectByUser" parameterType="....user" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from user
        where 1=1
        <if test="id != null">
            and id = #{id,jdbcType=BIGINT}
        </if>
        <if test="name != null">
           and `name` = #{name,jdbcType=VARCHAR}
        </if>
        <if test="age != null">
          and  age = #{age,jdbcType=INTEGER}
        </if>
    </select>
 List<User>  selectByUser(User user);

批量插入: 前者批量插入效率高,后者一条一条插入

    <insert id="batchInsertSelective">
        INSERT INTO user( name,age, create_time)
        VALUES
        <foreach collection="total" item="s" separator=",">
            (#{s.name},#{s.age},  #{s.createTime})
        </foreach>
    </insert>
 <insert id="batchInsertSelective1">
        <foreach collection="total" item="s" index="" open="" close="" separator=";">
            insert into user
            <trim prefix="(" suffix=")" suffixOverrides=",">
                <if test="s.name!= null">
                    name,
                </if>
                <if test="s.age!= null">
                    age,
                </if>
                <if test="s.createTime != null">
                    create_time,
                </if>
            </trim>
            <trim prefix="values (" suffix=")" suffixOverrides=",">
                <if test="s.name!= null">
                    #{s.name,jdbcType=VARCHAR},
                </if>
                <if test="s.area != null">
                    #{s.age,jdbcType=INTEGER},
                </if>    
                <if test="s.createTime != null">
                    #{s.createTime,jdbcType=TIMESTAMP},
                </if>
            </trim>
        </foreach>
    </insert>
CREATE TABLE `teacher` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `teacher_no` varchar(20) DEFAULT NULL COMMENT '老师编号',
  `teacher_name` varchar(20) DEFAULT NULL COMMENT '老师姓名',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

CREATE TABLE `student` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `teacher_id` bigint(20) DEFAULT NULL COMMENT '老师id',
  `student_name` varchar(20) DEFAULT NULL COMMENT '老师姓名',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
public class TeacherDto {
    private Long teacherId;
    private String teacherNo;
    private Integer studentCount;
    private Date updateTime;
}

查询不同老师 有学生数量.更新时间为学生表 学生最近时间. 如果老师没有学生,时间为老师新增时间.
(查询学生数量为null,则为0)

  <select id="selectCustomerByStorage" resultType="com...TeacherDto">
           	SELECT
             t.`id`,
             t.`teacher_name`,
             IFNULL(s.studentCount, 0) AS studentCount,
             IF (
               s.update_time IS NULL,
               t.update_time,
               s.update_time
             ) updateTime
           FROM
             teacher t
             LEFT JOIN
               (SELECT
                 teacher_id,
                 COUNT(`student_name`) studentCount,
                 MAX(update_time) update_time
               FROM
                 student
               GROUP BY teacher_id ) s
               ON t.`id` = s.`teacher_id`
    </select>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值