MyBatis笔记

MyBatis学习笔记,记录细小易忘知识点,持续更新中……

DDL

最近有个需求是,前端上传excel文件,然后根据这个excel创建数据表,并将数据插入。由于excel没有具体的格式,那么不能预先创建表。

mapper.xml

我们都知道,MyBatis对数据库的操作都是通过mapper.xml文件进行的,那我们就首先创建一个针对DDL操作的Mapper.xml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.newland.wlfx.dao.DDLMapper"><!--指定与该Mapper.xml文件对应的Dao-->
<update id="createNewTableAndInsert" keyColumn="">
CREATE TABLE ${newTableName}(
${newTableName}_id SERIAL PRIMARY KEY,
<foreach collection="fieldModel" item="l" separator=",">
${l.field} ${l.fieldType}
</foreach>
,field_end INT DEFAULT 0<!--迭代末尾不会添加分隔符,这里有其他值的话就要在其前面添加分隔符。这里的字段是为了演示。-->
);
INSERT INTO ${newTableName}(
<foreach collection="fieldModel" item="l" separator=",">
${l.field}
</foreach>
)VALUES
<foreach collection="data" item="perD" separator=",">
(
<foreach collection="perD" item="d" separator=",">
#{d}
</foreach>
)
</foreach>
</update>
</mapper>

看上去没啥特别的,需要注意的是:

${}#{}的区别:

  • #如果传入的值是字符串,则会自动为该值添加双引号,eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id ='1'.如果不是字符串,就不会添加了。

  • $是将传入的数据直接显示生成sql语句,eg:select id,name,age from student where id =${id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id = 1.

  • 使用#可以很大程度上防止sql注入,用于拼接sql,select id,name,age from student where id =?用于为语句提供对应的值。其他情况就用$.

  • 但是如果使用在order by 中就需要使用 $.

  • 在大多数情况下还是经常使用#,但在不同情况下必须使用$.
    上面代码中,表名,字段名等是字符串的形式,但是,不能给它们添加双引号。因此必须使用$,而后面在插入语句中(嵌套的<foreach>用于批量插入),使用了#因为遇到字符串的时候,必须给它们添加双引号。
    在一个操作中,可以将多个语句拼接在一起,一次性执行。

<foreach>标签

foreach元素的属性主要有:

  • item表示集合中每一个元素进行迭代时的别名,
  • index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,
  • open表示该语句以什么开始,
  • separator表示在每次进行迭代之间以什么符号作为分隔符,它是必须的属性
  • close表示以什么结束。

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key。

Dao

mapper.xml写好了,根据参数设置写Dao即可,很简单了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import com.newland.wlfx.model.FieldModel;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface DDLMapper {
/**
* 根据传入的表名,创建新的表并且添加数据
* @param newTableName 表名
* @param fieldModel 字段模型
* @param data 数据
*/

void createNewTableAndInsert(@Param("newTableName") String newTableName,
@Param("fieldModel") List<FieldModel> fieldModel,
@Param("data") List<Object[]> data);
}

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. DDL
    1. 1.1. mapper.xml
    2. 1.2. ${}和#{}的区别:
    3. 1.3. <foreach>标签
    4. 1.4. Dao
,