MyBatis查询、新增、更新与删除操作指南

调试之控制台打印SQL

Mybatis的使用流程

先来回顾一下mybatis的使用流程

  • 创建mybatis-config.xml 全局的配置⽂件
  • 创建XXXMapper.xml配置⽂件
  • 创建SqlSessionFactory
  • ⽤SqlSessionFactory创建SqlSession对象
  • ⽤SqlSession执⾏增删改查CRUD

打印sql的配置

内置的⽇志⼯⼚提供⽇志功能, 使⽤log4j配置打印sql,添加依赖

<dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 <version>1.7.30</version>
</dependency>

在应⽤的classpath中创建名称为 log4j.properties 的⽂件

log4j.rootLogger=ERROR, stdout
log4j.logger.cn.junko=DEBUG
#打印更多的TRACE内容
#log4j.logger.cn.junko=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

这样,我们在执行操作数据库的时候就会有日志打印出来

查询

多个参数

当需要多个参数进行查询的时候,一般用到取别名,方便识别和使用

<select id="selectByPointAndTitle" resultType="cn.junko.domain.Video">
  select * from video where point = #{point} and title like concat('%',#{title},'%')
 </select>
List<Video> selectByPointAndTitle(@Param("point") int point,@Param("title") String title);

驼峰映射

前面也讲到,数据库字段是下划线,java属性是驼峰,怎么查询映射上去

方法: select cover_img as coverImg from video

但是多字段的时候怎么办,每个参数都进行as操作吗?这里就用到Mybatis的自带配置

 <!--下划线⾃动映射驼峰字段-->
 <settings>
 <setting name="mapUnderscoreToCamelCase" value="true"/>
 </settings>

这样就能够进行自动映射,例如cover_img会自动映射为coverImg

Mybatis入参parameterType

parameterType 参数类型

可以是基本类型

parameterType="java.lang.Long"
parameterType="java.lang.String"

也可以是JAVA集合List或者Map

parameterType="java.util.Map"
parameterType="java.util.List"

或者是自定义的对象

parameterType="cn.junko.domain.Video"

取参数值,具体某个字段的类型,从java类型映射到数据库类型

例⼦ #{title, jdbcType=VARCHAR}

注意:

  • 多数情况不加是正常使⽤,但是如果出现报错:⽆效的列类型,则是缺少jdbcType;
  • 只有当字段可为NULL时才需要jdbcType属性

常见的数据库类型和java列席对比

JDBC Type Java Type
CHAR String
VARCHAR String
LONGVARCHAR String
NUMERIC java.math.BigDecimal
DECIMAL java.math.BigDecimal
BIT boolean
BOOLEAN boolean
TINYINT byte
SMALLINT short
INTEGER INTEGER
INTEGER int
BIGINT long
REAL float
FLOAT double
DOUBLE double
BINARY byte[]
VARBINARY byte[]
LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
CLOB Clob
BLOB Blob
ARRAY Array
DISTINCT mapping of underlying type
STRUCT Struct
REF Ref
DATALINK java.net.URL

插入

编写mapper

<insert id="addVideo" parameterType="cn.junko.domain.Video" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
    INSERT INTO `video`(`title`, `summary`, `cover_img`, `price`, `create_time`, `c_id`, `point`)
    VALUES (#{title},#{summary},#{coverImg},#{price},#{createTime},#{cid},#{point});
  </insert>

获取自增主键,则需要在标签头加入这三段,即可自动映射到实体类中
useGeneratedKeys="true" keyProperty="id" keyColumn="id"

测试

@Test
  public void addVideo(){
    Video video = new Video();
    video.setTitle("测试数据3");
    video.setSummary("nihao.com");
    video.setCoverImg("wangyi");
    video.setPrice(8777);
    video.setCreateTime(new Date());
    video.setCid(7);
    video.setPoint(5.7);
    int rows = videoMapper.addVideo(video);
    System.out.println("自增主键:"+video.getId());
    System.out.println(video.toString());
  }

foreach 批量插入

foreach批量插⼊多条视频记录,⽤于循环拼接的内置标签,常⽤于 批量新增、in查询等常⻅

包含以下属性:

collection:必填,值为要迭代循环的集合类型,情况有多种
 ⼊参是List类型的时候,collection属性值为list
 ⼊参是Map类型的时候,collection 属性值为map的key值

item:每⼀个元素进⾏迭代时的别名
index:索引的属性名,在集合数组情况下值为当前索引值,当迭代对象是map时,这个值是
map的key
open:整个循环内容的开头字符串
close:整个循环内容的结尾字符串
separator: 每次循环的分隔符

例子
需要注意的是item别名取值iteam.xxx

<insert id="addVideoList" parameterType="cn.junko.domain.Video" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
    INSERT INTO `video`(`title`, `summary`, `cover_img`, `price`, `create_time`, `c_id`, `point`)
    VALUES
    <foreach collection="list" separator="," item="video">
    (#{video.title},#{video.summary},#{video.coverImg},#{video.price},#{video.createTime},#{video.cid},#{video.point})
    </foreach>
  </insert>
list.add(video1);
    list.add(video2);
    int rows = videoMapper.addVideoList(list);
    System.out.println(list);

主键自增同样适用

更新

普通的更新比较简单,这里使用一下if test标签

  • 可以选择性更新⾮空字段
  • if test标签介绍
    • if 标签可以通过判断传⼊的值来确定查询条件,test 指定⼀个OGNL表达式
    • 常⻅写法
//当前字段符合条件才更新这个字段的值
<if test='title != null and id == 87 '> title = #{title}, </if>
<if test="title!=null"> title = #{title}, </if>

代码

<!-- /*suffixOverrides=","去掉后缀,*/-->
  <update id="updateVideo" parameterType="cn.junko.domain.Video">
    UPDATE `video`
    <trim prefix="set" >
      <if test="title != null">`title` = #{title},</if>
      <if test="summary != null">`summary` = #{summary},</if>
      <if test="coverImg != null">`cover_img` = #{coverImg},</if>
      <if test="price != 0">`price` = #{price},</if>
      <if test="createTime != null">`create_time` = #{createTime},</if>
      <if test="cid != 0">`c_id` = #{cid},</if>
      <if test="point > 7.0">`point` = #{point}</if>
    </trim>
    WHERE `id` = #{id};
  </update>

⼀定要看pojo类⾥⾯的是基本数据类型,还是包装数据类型

删除

delete删除语法

需求:删除某个时间段之后 且⾦额⼤于 10元的数据

<delete id="deleteByCreateTimeAndPrice" parameterType="java.util.Map">
 delete from video where create_time <![CDATA[ > ]]> #{createTime}
and price <![CDATA[ >= ]]> #{price}
</delete>

为什么要转义字符:

由于MyBatis的sql写在XML⾥⾯, 有些sql的语法符号和xml⾥⾯的冲突

⼤于等于 <![CDATA[ >= ]]>
⼩于等于 <![CDATA[ <= ]]>

总结

到此这篇关于MyBatis查询、新增、更新与删除操作指南的文章就介绍到这了,更多相关MyBatis查询、新增、更新删除操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解MyBatis模糊查询LIKE的三种方式

    模糊查询也是数据库SQL中使用频率很高的SQL语句,使用MyBatis来进行更加灵活的模糊查询. 直接传参法 直接传参法,就是将要查询的关键字keyword,在代码中拼接好要查询的格式,如%keyword%,然后直接作为参数传入mapper.xml的映射文件中. public void selectBykeyWord(String keyword) { String id = "%" + keyword + "%"; String roleType = "

  • Mybatis自动创建表和更新表结构

    最近有小伙伴问我mybatis有没有自动创建表结构的功能,因为他们之前一直使用hibernate用习惯了,理所当然的认为,在实体类上配置下注解或者写写映射文件,系统启动后就可以自动创建表. 我只能很遗憾的告诉他,mybatis并没有这个功能,看他兴致阑珊的样子,我只能安慰他,就算没有这功能,我们可以自己开发啊~~ 所以就有了下面这套系统,已开源大家可以下来看看~~ Mybatis_BuildTable_V0.2 https://git.oschina.net/sunchenbin/Mybatis

  • Mybatis多表关联查询的实现(DEMO)

    概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入几条测试数据. create table Category ( Id int not null auto_increment, Name varchar(80) null, constraint pk_category primary key (Id) ); INSERT INTO category

  • Mybatis批量更新三种方式的实现

    Mybatis实现批量更新操作 方式一: <update id="updateBatch" parameterType="java.util.List"> <foreach collection="list" item="item" index="index" open="" close="" separator=";">

  • Mybatis批量删除数据操作方法

    MyBatis的作用我想不用多说,今天说说MyBatis中的批量删除操作.废话不多说,先给大家一段代码片段! <delete id="deleteByStandardIds"> delete from t_standard_catalog where standard_id in <foreach collection="array" item="standardId" open="(" close=&quo

  • mybatis 模糊查询的实现方法

    mybatis 模糊查询的实现方法 mybatis的逆向助手确实好用,可以省去很多编写常规sql语句的时间,但是它没办法自动生成模糊查询语句,但开发中模糊查询是必不可少的,所以,需要手动对mapper编写模糊查询功能. 这里先明确MyBatis/Ibatis中#和$的区别: 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解

  • Mybatis入门教程之新增、更新、删除功能

    上一节说了Mybatis的框架搭建和简单查询,这次我们来说一说用Mybatis进行基本的增删改操作: 一. 插入一条数据 1.首先编写USER.XML(表的xml)使用insert元素,元素写在mapper中: <insert id="insertitem" parameterType="cn.qkp.po.user"> INSERT INTO user(username,birthday,sex,address) VALUES(#{username},

  • MyBatis实现模糊查询的几种方式

    在学习MyBatis过程中想实现模糊查询,可惜失败了.后来上百度上查了一下,算是解决了.记录一下MyBatis实现模糊查询的几种方式. 数据库表名为test_student,初始化了几条记录,如图: 起初我在MyBatis的mapper文件中是这样写的: <select id="searchStudents" resultType="com.example.entity.StudentEntity" parameterType="com.exampl

  • Mybatis查不到数据查询返回Null问题

    mybatis突然查不到数据,查询返回的都是Null,但是 select count(*) from xxx查询数量,返回却是正常的. Preparing: SELECT id,a9004,a9005,a9015 FROM a90 where a9010 = ? ORDER BY id LIMIT 1 [DEBUG] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:139):http-bio-8080

  • Mybatis批量更新报错问题

    下面给大家介绍mybatis批量更新报错问题, allowMultiQueries=true 后来发现是jdbc链接没有加允许批量更新操作的参数引起的,不加会报badsql,mysql版的mybatis批量更新操作如下 <update id="updateOrderOverdueStatus" parameterType="java.util.List"> <foreach collection="list" item=&quo

随机推荐