• mybatis插入数据时返回主键以及MySQL根据时间区间查询问题总结


    最近做项目的过程中,在数据库方面遇到了两个问题,一是在插入一条数据的时候需要将该条数据的主键返回、二是根据时间区间进行查询时某一天的数据查询不到,在此总结记录一下。

    1、如何在插入一条数据的同时将主键返回

    在实体类的映射文件 "Mapper.xml" 中这样写:
    <insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.ue.entity.User">
    insert into user(userName,password,comment)
    values(#{userName},#{password},#{comment})
    </insert>
    useGeneratedKeys="true"表示给主键设置自增长
    keyProperty="userId"表示将自增长后的Id赋值给实体类中的userId字段

    parameterType="com.ue.entity.User"这个属性指向传递的参数实体类
    注意,<insert></insert>中是没有resultType属性的,不要乱加

    实体类中uerId要有getter() and setter()方法
    如果在数据库中已经设置了主键自增,则可以在 "Mapper.xml" 中这样写:
    <insert id="insertProduct" parameterType="com.ue.entity.ProductBean" >
    <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="productId">
    SELECT LAST_INSERT_ID()
    </selectKey>
    INSERT INTO t_product(productName,productDesrcible,merchantId)
    values(#{productName},#{productDesrcible},#{merchantId})
    </insert>
    <insert></insert>中没有resultType属性,但是<selectKey></selectKey>标签是有的
    order="AFTER" 表示先执行插入语句,之后再执行查询语句,可设置为BEFORE或AFTER;

    如果设置为BEFORE,那么它会首先选择主键,设置keyProperty然后执行插入语句;
    如果设置为AFTER,那么先执行插入语句,然后是selectKey元素;这和Oracle数据库相似,可以在插入语句中嵌入序列调用

    keyProperty="userId"表示将自增长后的Id赋值给实体类中的userId字段
    SELECT LAST_INSERT_ID()表示MySQL语法中查询出刚刚插入的记录自增长Id

    实体类中productId要有getter() and setter()方法
    上述两种方式都是在执行插入语句后将查询到的主键封装进了parameterType中的参数实体类中,所以直接用该参数实体的get()方法就可以将主键取出来

    2、MySQL根据时间区间进行查询时某一天的数据查询不到的问题

    例如:

    SELECT * FROM 表名 WHERE 开始时间字段名 BETWEEN '2019-05-01' AND '2019-06-14'
    发现6月14号的数据没有出来,因为between……and……是左闭右开,即[a,b),即包含a的值,不包含b的值

    将上面的SQL修改成下面的语句即可,将原来的日期加上一天:

    select * from 表名 where 字段名 BETWEEN '2019-05-01' and DATE_ADD('2019-06-14',INTERVAL 1 DAY)
    即使是用>=和<=也是跟用between......and......的效果一样的,也需要将原来的日期加上一天,如下是mapping.xml文件中的片段:

    <if test="开始时间字段名 != null and 开始时间字段名 != ''">
    AND 开始时间字段名 &gt;= #{前台传的值}
    </if>
    <if test="结束时间字段名!= null and 结束时间字段名!= ''">
    AND 结束时间字段名 &lt;= DATE_ADD(#{前台传的值},INTERVAL 1 DAY)
    </if>
     
    ---------------------

  • 相关阅读:
    .NET 中的Cache
    ASP.NET Forms身份认证
    深入浅出JavaScript (一)初识
    在线生成 Loading进度条图片网站
    放眼2011:中国管理软件四大趋势分析
    2011BI展望:移动商业智能决胜未来
    企业关注:国内BI市场将呈四大趋势发展
    安家啦
    清理SqlServer日志方法
    云计算添翼移动BI 企业决策运筹帷握
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11173760.html
Copyright © 2020-2023  润新知