1 参数处理(封装map过程)(23)

1.1)F5进入断点:Employee employee1=mapper.selectEmployeeByMap(map);

1.2)进入MapperProxy的invoke方法,跟踪到mapperMethod.execute(sqlSession, args);

1.3)进入MapperMethod的execute方法,可以看到增删改查均有对应case:

Object result;

switch (command.getType()) {

case INSERT: {

Object param = method.convertArgsToSqlCommandParam(args);

result = rowCountResult(sqlSession.insert(command.getName(), param));

break;

}

1.4)进入method.convertArgsToSqlCommandParam(args);方法--》 paramNameResolver.getNamedParams(args);

1.5)ParamNameResolver类的关键方法:

/**

* <p>

* A single non-special parameter is returned without a name.<br />

* Multiple parameters are named using the naming rule.<br />

* In addition to the default names, this method also adds the generic names (param1, param2,

* ...).

* </p>

*/

public Object getNamedParams(Object[] args) {

final int paramCount = names.size();

//为null或0个参数直接返回null

if (args == null || paramCount == 0) {

return null;

//单个参数且没有param注解:args[0];直接返回

} else if (!hasParamAnnotation && paramCount == 1) {

return args[names.firstKey()];

//多个参数或有param注解

} else {

final Map<String, Object> param = new ParamMap<Object>();

int i = 0;

//遍历names集合:{0=id,1=lastName,2=2}

for (Map.Entry<Integer, String> entry : names.entrySet()) {

//封装效果:{id:args[0],lastName:args[1],2=args[2]}

param.put(entry.getValue(), args[entry.getKey()]);

// add generic param names (param1, param2, ...)

final String genericParamName = GENERIC_NAME_PREFIX + String.valueOf(i + 1);

// ensure not to overwrite parameter named with @Param

//除了按注解方式保存外,额外将每个参数也保存到map中,使用新的key:param1,...,paramN

if (!names.containsValue(genericParamName)) {

param.put(genericParamName, args[entry.getKey()]);

}

i++;

}

return param;

}

}

(@Param(“id”) Integer id,@Param(“lastName”) String lastName)

ParamNameResolver解析参数封装map的:

1、names:{0=id,1=lastName}构造器时即确定好

确定流程:

1)获取每个param注解参数的@Param值:id,lastName;赋值给name

2)每次解析一个参数给map中保存信息:(key:参数索引,value:name的值)

Name的值:

标注了param注解则为注解的值

没有标注:

1)全局配置:isUseActualParamName :name=参数名

2)Name=map.size()相当于当前元素的索引{0=id,1=lastName,2=2}

2参数处理#与$区别(24,25)

获取参数方法

作用

备注

#

#{};

1)一般用法:以预编译形式,将参数设置到sql中,类似于preparedstatement;防止sql注入

2)更丰富用法:

规定参数规则:javaType,jdbcType,mode(存储过程),numericScale,resultmap,typehandler,jdbctypename,expression(未来准备支持的)

其中jdbcType在某种特定条件下设置(数据为null时,有些数据库可能不能识别mybatis对null的默认处理,如oracle(会报错)。因为mybatis对所有的null都映射为原生jdbc的other类型,由于全局配置中,jdbcTypeForNull=other而oracle不支持

占位符?

大部分情况下使用#

可在全局配置文件中配置

jdbcTypeForNull设置为null

<setting name=jdbcTypeForNull value=NULL/>

$

${}:取出的值直接拼接sql中,会有安全问题

原生jdbc不支持占位符的地方:

1)查询表名(分表操作,如按年份分表拆分)

Select * from ${year}_salary where ***;

2)排序(order)

Select * from salary order by ${name}  ${order};

示例:

select * from myemployeee where id = ${id}

and last_name=#{lastName}

对应执行情况:

select * from myemployeee where id = 2

and last_name=?

Parameters:test(string)

3select 返回list(26)

<select id="selectEmployeeByName" resultType="com.mybatis.bean.Employee">

select * from myemployeee where last_name=#{lastName}

</select>

//返回list

List<Employee> selectEmployeeByName(String name);

3select 返回封装为map(27)

单条记录

<!-- 返回封装为map -->

<select id="selectEmployeeMap" resultType="map">

select * from myemployeee where last_name=#{lastName}

</select>

//返回map(单个)

Map<String,Object> selectEmployeeMap(String name);

Map<String,Object> returnMap= mapper.selectEmployeeMap("test");

System.out.println(returnMap);

多条记录:

<!-- 返回封装为map,多条 -->

<select id="selectEmployeeMaps" resultType="com.mybatis.bean.Employee">

select * from myemployeee where last_name like #{lastName}

</select>

//返回map(多条) Map<Integer,Employee> 键:主键;值:Employee

@MapKey("id")  //通过@MapKey注解封装map时使用指定属性作为key

Map<Integer,Employee> selectEmployeeMaps(String name);

Map<Integer,Employee> returnMap2= mapper.selectEmployeeMaps("%test%");

System.out.println(returnMap2);

也可以将id改为lastName使用名字作为key。

返回结果:

{test3=com.mybatis.bean.Employee@c81cdd1, test=com.mybatis.bean.Employee@1fc2b765}

4select resultMap自定义结果映射规则(28)

<!-- 自定义结果映射规则

type: 自定义规则的java类型

id:该映射的唯一标识,方便映射

-->

<resultMap type="com.mybatis.bean.Employee" id="resultMap">

<!-- column:数据库列;property:javabean属性 -->

<id column="id" property="id" jdbcType="INTEGER"/>

<result column="last_name" property="lastName" jdbcType="VARCHAR"/>

<!-- 其他不指定的列会自动封装 -->

</resultMap>

//返回list

List<Employee> selectEmployeeByName(String name);

List<Employee> selectEmployeeByName = mapper.selectEmployeeByName("test");

System.out.println(selectEmployeeByName);

5select resultMap关联查询(级联属性)(30)

联合查询:级联属性封装结果集

1) bean对象

public class Employee {

private Integer id;

private String lastName;

private String email;

private String gender;

private MyDept myDept;

public class MyDept {

private Integer deptno;

private String dname;

private String dbSource;

2) mybatis xml文件配置

<resultMap type="com.mybatis.bean.Employee" id="DeptResultMap">

<!-- column:数据库列;property:javabean属性 -->

<id column="id" property="id" jdbcType="INTEGER"/>

<result column="last_name" property="lastName" jdbcType="VARCHAR"/>

<!-- 其他不指定的列会自动封装 -->

<result column="deptno" property="myDept.deptno"/>

<result column="dname" property="myDept.dname"/>

<result column="db_source" property="myDept.dbSource"/>

</resultMap>

<select id="selectEmployeeAndDept" resultMap="DeptResultMap">

select e.id,e.last_name,e.email,e.gender

,d.deptno,d.dname,d.db_source

from myemployeee e,mydept d where e.dept_id=d.deptno and e.id = #{id}

</select>

3)测试

Map<String,Object> map=new HashMap<String,Object>();

map.put("id", 1);

map.put("lastName","test");

//   List<Employee> selectEmployeeByName = mapper.selectEmployeeByName("test");

Employee selectEmployeeAndDept = mapper.selectEmployeeAndDept(1);

System.out.println(selectEmployeeAndDept.getMyDept().getDbSource()+"=="+selectEmployeeAndDept.getMyDept().getDname());

6select resultMap关联查询(association)(31)

1) Xml

<resultMap type="com.mybatis.bean.Employee" id="DeptResultMap2">

<!-- column:数据库列;property:javabean属性 -->

<id column="id" property="id" jdbcType="INTEGER"/>

<result column="last_name" property="lastName" jdbcType="VARCHAR"/>

<!-- 其他不指定的列会自动封装 -->

<!-- assocation可以指定联合的javabean对象

property=dept,指定哪个属性是联合的对象

javatype:指定整个属性对象的类型,不能省略 -->

<association property="myDept" javaType="com.mybatis.bean.MyDept">

<id column="deptno" property="deptno"/>

<result column="dname" property="dname"/>

<result column="db_source" property="dbSource"/>

</association>

</resultMap>

2)测试

Map<String,Object> map=new HashMap<String,Object>();

map.put("id", 1);

map.put("lastName","test");

//   List<Employee> selectEmployeeByName = mapper.selectEmployeeByName("test");

Employee selectEmployeeAndDept = mapper.selectEmployeeAndDept(1);

System.out.println(selectEmployeeAndDept.getMyDept().getDbSource()+"=="+selectEmployeeAndDept.getMyDept().getDname());

7select resultMap关联查询(association分步查询)(32)

1)创建mapper文件

public interface MyDeptMapper {

//查询

MyDept getMyDeptById(Integer id);

}

2)创建xml文件

<mapper namespace="com.mybatis.dao.MyDeptMapper">

<select id="getMyDeptById" resultType="com.mybatis.bean.MyDept">

select * from mydept d where d.deptno=#{deptno}

</select>

</mapper>

3)employee.xml文件中

<!-- 分步查询

1、根据员工id查询员工信息

2、根据员工信息中id查询部门信息

3、部门设置到员工中-->

<resultMap type="com.mybatis.bean.Employee" id="DeptResultByStep">

<!-- column:数据库列;property:javabean属性 -->

<id column="id" property="id" jdbcType="INTEGER"/>

<result column="last_name" property="lastName" jdbcType="VARCHAR"/>

<!-- 其他不指定的列会自动封装 -->

<!-- assocation定义关联对象的封装规则

property:指定关联的对象

select:表明当前属性是调用select指定的方法查出的结果

column:指定哪一列的值传给这个方法

流程:使用select指定的方法(传入column指定的这列参数的值)

查出对象,并封装给property指定的属性

-->

<association property="myDept" select="com.mybatis.dao.MyDeptMapper.getMyDeptById"

column="dept_id" >

</association>

</resultMap>

<select id="selectEmployeeAndDept" resultMap="DeptResultByStep">

select * from myemployeee where id = #{id}

</select>

3)测试

Employee selectEmployeeAndDept = mapper.selectEmployeeAndDept(1);

System.out.println(selectEmployeeAndDept.getMyDept().getDbSource()+"=="+selectEmployeeAndDept.getMyDept().getDname());

8select resultMap关联查询(association分步查询,延迟加载)(33)

默认为全加载,可在全局配置文件中配置

<settings>

<!-- 设置懒加载 -->

<setting name="lazyLoadingEnabled" value="true"/>

<!-- name:设置项名,value:设置项值 -->

<setting name="mapUnderscoreToCamelCase" value="true"/><!--映射数据库下划线-java bean驼峰命名规则 -->

</settings>

9select resultMap关联查询(collection关联集合封装规则)(34)

上面association是针对一对一情况(一个员工对应一个部门),查询一对多(一个部门下所有员工信息)情况使用collection。

1)javabean配置

public class MyDept {

private Integer deptno;

private String dname;

private String dbSource;

private List<Employee> employees;

2)mapper接口

public interface MyDeptMapper {

//查询

MyDept getMyDeptById(Integer id);

//查询(带员工)

MyDept getMyDeptAndEmployeeById(Integer id);

}

3)xml配置

<resultMap type="com.mybatis.bean.MyDept" id="DeptAndEmployeeResultMap">

<id column="deptno" property="deptno"/>

<result column="db_source" property="dbSource"/>

<result column="dname" property="dname"/>

<!--

collection:定义关联集合类型的属性的封装规则

ofType:指定集合里面元素的类型

collection中的属性对应employee属性

-->

<collection property="employees" ofType="com.mybatis.bean.Employee">

<!-- 定义这个集合中元素的封装规则 -->

<id column="id" property="id"/>

<result column="last_name" property="lastName"/>

<result column="dept_id" property="deptId"/>

<result column="email" property="email"/>

<result column="gender" property="gender"/>

<result column="dept_id" property="deptId"/>

</collection>

</resultMap>

<select id="getMyDeptAndEmployeeById" resultMap="DeptAndEmployeeResultMap">

select d.*,e.* from mydept d,myemployeee e where d.deptno=e.dept_id and d.deptno=#{deptno}

</select>

注意!需要的属性必须列出,否则为null。

如:

<collection property="employees" ofType="com.mybatis.bean.Employee">

<!-- 定义这个集合中元素的封装规则 -->

<id column="id" property="id"/>

<result column="last_name" property="lastName"/>

<result column="dept_id" property="deptId"/>

<!-- <result column="email" property="email"/>

<result column="gender" property="gender"/>

<result column="dept_id" property="deptId"/> -->

</collection>

对应输出结果:

test null null 1

test3 null null 4

属性列出后输出结果:

test test@com.cm 男 1

test3 test3@com.cm 男 4

10select resultMap关联查询(collection分步查询)(35)

1) Employmapper.xml

<select id="selectEmployeeByDeptno" resultType="com.mybatis.bean.Employee">

select * from myemployeee where dept_id = #{deptno}

</select>

2) Mydeptmapper.xml

<!-- 分步查询 -->

<resultMap type="com.mybatis.bean.MyDept" id="DeptAndEmployeeByStepResultMap">

<id column="deptno" property="deptno"/>

<result column="db_source" property="dbSource"/>

<result column="dname" property="dname"/>

<!--

collection:定义关联集合类型的属性的封装规则

ofType:指定集合里面元素的类型

collection中的属性对应employee属性

-->

<collection property="employees" select="com.mybatis.dao.EmployeeMapper.selectEmployeeByDeptno" column="deptno">

</collection>

</resultMap>

<select id="getMyDeptAndEmployeeStepById" resultMap="DeptAndEmployeeByStepResultMap">

select * from mydept d where d.deptno=#{deptno}

</select>

3) 接口MyDeptMapper

public interface MyDeptMapper {

//查询

MyDept getMyDeptById(Integer id);

//查询(带员工)

MyDept getMyDeptAndEmployeeById(Integer id);

//查询(带员工),分步查询

MyDept getMyDeptAndEmployeeStepById(Integer id);

}

4) 测试

//collection测试

MyDeptMapper mapper=session.getMapper(MyDeptMapper.class);

MyDept myDeptAndEmployeeById = mapper.getMyDeptAndEmployeeStepById(1);

if (null!=myDeptAndEmployeeById && !myDeptAndEmployeeById.getEmployees().isEmpty()) {

for(Employee e:myDeptAndEmployeeById.getEmployees()) {

System.out.println(e.getLastName()+" "+e.getEmail()+" "+e.getGender()+" "+e.getId());

}

}

11select resultMap关联查询(collection分步查询传递多列值)(36)

多列传值,将多列的值封装map传递column=”{key1=column1,key2=column2}”

fetchType=”lazy”表示使用延迟加载

-lazy:延迟;-eager:立即

<collection property="employees"  select="com.mybatis.dao.EmployeeMapper.selectEmployeeByDeptno"

column="deptno" fetchType="lazy">

</collection>

11select resultMap关联查询discriminator鉴别器(37)

鉴别器:mybatis可以使用discriminator判断某列的值,然后根据某列值改变封装行为。

示例:

Employee:查出女生就把部门信息查询出来,否则不查询。

1)修改employeemapper

<resultMap type="com.mybatis.bean.Employee" id="DeptResultByStep">

<!-- column:数据库列;property:javabean属性 -->

<id column="id" property="id"/>

<result column="last_name" property="lastName"/>

<result column="gender" property="gender"/>

<!-- 其他不指定的列会自动封装 -->

<!-- assocation定义关联对象的封装规则

property:指定关联的对象

select:表明当前属性是调用select指定的方法查出的结果

column:指定哪一列的值传给这个方法

流程:使用select指定的方法(传入column指定的这列参数的值)

查出对象,并封装给property指定的属性

-->

<!-- column:指定判定的列名

javatype:列值对应的java类型 -->

<discriminator javaType="string" column="gender">

<!-- 女生resultType:指定封装的结果类型 -->

<case value="女" resultType="com.mybatis.bean.Employee">

<association property="myDept" select="com.mybatis.dao.MyDeptMapper.getMyDeptById"

column="dept_id" >

</association>

</case>

<case value="男" resultType="com.mybatis.bean.Employee">

<id column="id" property="id"/>

<result column="gender" property="gender"/>

<result column="last_name" property="lastName" jdbcType="VARCHAR"/>

</case>

</discriminator>

</resultMap>

2)测试类

//discriminator鉴别器

EmployeeMapper mapper=session.getMapper(EmployeeMapper.class);

Employee employee1=mapper.selectEmployeeAndDept(4);

System.out.println(employee1.getLastName()+" "+employee1.getEmail());

12动态sql(38-39)

OGNL(object graph navigation language)对象图导航语言(apache)。类似el,sqel等表达式

1)Mapper

//返回map

List<Map<String,Object>> selectEmployeeByMap(@Param("employee") Map<String,Object> map);

2) Xml

<!-- 返回封装为map

动态sql:

特殊子父需要使用转义字符

-->

<select id="selectEmployeeByMap" resultType="map">

select * from myemployeee where

1=1

<if test=" null  != employee.lastName and employee.lastName != '' ">

and last_name like CONCAT('%',#{employee.lastName,jdbcType=VARCHAR},'%')

</if>

<if test="null!=employee.id and employee.id != '' ">

and id=#{employee.id,jdbcType=INTEGER}

</if>

</select>

3) 测试

Map<String,Object> map=new HashMap<String,Object>();

//   map.put("id", 1);

map.put("lastName","test");

EmployeeMapper mapper=session.getMapper(EmployeeMapper.class);

List<Map<String,Object>> selectEmployeeByMap = mapper.selectEmployeeByMap(map);

System.out.println(selectEmployeeByMap.toString());

报错:

Caused by: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

原因:sql语句like查询为

and last_name like'%#{employee.lastName,jdbcType=VARCHAR}%'

导致报错,修改为concat即可

13动态sql-where查询条件(40)

1)xml修改

<where>

<if test=" null  != employee.lastName and employee.lastName != '' ">

and last_name like CONCAT('%',#{employee.lastName,jdbcType=VARCHAR},'%')

</if>

<if test="null!=employee.id and employee.id != '' ">

and id=#{employee.id,jdbcType=INTEGER}

</if>

</where>

2)测试

Map<String,Object> map=new HashMap<String,Object>();

//   map.put("id", 1);

map.put("lastName","test");

EmployeeMapper mapper=session.getMapper(EmployeeMapper.class);

List<Map<String,Object>> selectEmployeeByMap = mapper.selectEmployeeByMap(map);

System.out.println(selectEmployeeByMap.toString());

14动态sql-trim自定义字符串截取(41)

后面多出的and或or,where标签不能解决

1)xml文件

<!-- trim自定义字符串截取

prefix:前缀,给拼串后的整个字符串加一个前缀

prefixOverrides:前缀覆盖,去掉整个字符串前面多余字符

suffix:后缀,给拼串后的整个字符串加一个后缀

suffixOverrides:后缀覆盖,去掉整个字符串后面多余的字符

-->

<trim prefix="where" prefixOverrides="and" suffixOverrides="and">

<if test=" null  != employee.lastName and employee.lastName != '' ">

and last_name like CONCAT('%',#{employee.lastName,jdbcType=VARCHAR},'%')

</if>

<if test="null!=employee.id and employee.id != '' ">

and id=#{employee.id,jdbcType=INTEGER}

</if>

</trim>

</select>

2)测试

Map<String,Object> map=new HashMap<String,Object>();

//   map.put("id", 1);

map.put("lastName","test");

EmployeeMapper mapper=session.getMapper(EmployeeMapper.class);

List<Map<String,Object>> selectEmployeeByMap = mapper.selectEmployeeByMap(map);

System.out.println(selectEmployeeByMap.toString());

15动态sql-choose分支选择(42)

If:判断

Choose:(when,otherwise):分支选择,switch-case

如果带了id就用id查,如果带了lastname就用lastname查,只选择一个

Trim:字符串截取

Where

Set:封装修改

Forearch:

1)xml修改

<!-- choose 分支选择

只选择一个

-->

<where>

<choose>

<when test=" null  != employee.lastName and employee.lastName != '' ">

last_name like CONCAT('%',#{employee.lastName,jdbcType=VARCHAR},'%')

</when>

<when test=" null!=employee.id and employee.id != '' ">

id=#{employee.id,jdbcType=INTEGER}

</when>

<otherwise>

gender='男'

</otherwise>

</choose>

</where>

</select>

16动态sql-set与if结合的动态更新(43)

1)set方式

<update id="updateEmp" parameterType="com.mybatis.bean.Employee">

update myemployeee mm

<set>

<if test="lastName !=null and lastName!='' ">

mm.last_name=#{lastName,jdbcType=VARCHAR},

</if>

<if test="email !=null and email !='' ">

mm.email=#{email,jdbcType=VARCHAR},

</if>

<if test="gender !=null and gender !='' ">

mm.gender=#{gender,jdbcType=VARCHAR}

</if>

</set>

where mm.id=#{id,jdbcType=INTEGER}

</update>

2)trim方式

<trim prefix="set" suffixOverrides=",">

<if test="lastName !=null and lastName!='' ">

mm.last_name=#{lastName,jdbcType=VARCHAR},

</if>

<if test="email !=null and email !='' ">

mm.email=#{email,jdbcType=VARCHAR},

</if>

<if test="gender !=null and gender !='' ">

mm.gender=#{gender,jdbcType=VARCHAR},

</if>

</trim>

where mm.id=#{id,jdbcType=INTEGER}

</update>

17动态sql-forearch遍历集合(44)

Collection:指定要遍历的集合

List类型的参数会特殊处理在map中,map的key就叫list

Item:将当前遍历出来的元素赋值给指定变量。

#{变量名}即可取出

1)Xml

<!-- 根据list查询 -->

<select id="selectEmployeeByIds" resultMap="resultMap" >

select * from myemployeee

<!-- collection:指定要遍历的集合

list类型的参数会特殊处理封装在map中,map的key即叫list

item:将当前遍历出的元素赋值给指定的变量

#{变量名}即可取出变量的值(即当前遍历出的元素)

index:索引,遍历list时为索引;遍历map时表示map的key(item是值)

-->

where id in

<foreach collection="list" item="item" open="("

separator="," close=")">

#{item,jdbcType=INTEGER}

</foreach>

</select>

2)Javabean

public Employee(Integer id, String lastName, String email, String gender,Integer deptId) {

super();

this.id = id;

this.lastName = lastName;

this.email = email;

this.gender = gender;

this.deptId=deptId;

}

3)测试

//list查询

EmployeeMapper mapper=session.getMapper(EmployeeMapper.class);

List<Integer> ids=new ArrayList<Integer>();

ids=Arrays.asList(1,2,3);

List<Employee> selectEmployeeByIds = mapper.selectEmployeeByIds(ids);

for(Employee e:selectEmployeeByIds) {

System.out.println(e.toString());

}

或者

<foreach collection="list" item="item" open="where id in ("

separator="," close=")">

#{item,jdbcType=INTEGER}

</foreach>

18动态sql-forearch批量插入的2种方式(45)

1)Xml

<!-- 方式一:直接list对象

addEmps(List<Employee> emps)

Insert into (),(),()

-->

<!-- insert into myemployeee(last_name,email,gender,dept_id)

values

<foreach collection="list" item="emp" separator=",">

(#{emp.lastName,jdbcType=VARCHAR},#{emp.email,jdbcType=VARCHAR},

#{emp.gender,jdbcType=VARCHAR},#{emp.deptId,jdbcType=INTEGER})

</foreach> -->

2)Mapper

//批量插入

Integer addEmps(List<Employee> emps);

3)测试

//批量插入

EmployeeMapper mapper=session.getMapper(EmployeeMapper.class);

List<Employee> emps=new ArrayList<Employee>();

emps.add(new Employee(null,"addemps1","addemps1@qq.com","男",1));

emps.add(new Employee(null,"addemps2","addemps2@qq.com","女",2));

System.out.println(mapper.addEmps(emps));

方式二:

<!-- 方式二:封装为map

addEmps(@Param("emps") List<Employee> emps);

-->

insert into myemployeee(last_name,email,gender,dept_id)

values

<foreach collection="emps" item="emp" separator=",">

(#{emp.lastName,jdbcType=VARCHAR},#{emp.email,jdbcType=VARCHAR},

#{emp.gender,jdbcType=VARCHAR},#{emp.deptId,jdbcType=INTEGER})

</foreach>

方式三:一次执行多个语句

<!-- 方式三:封装为map,且使用;分割为多个插入语句,

一次执行多个语句;

需要配置连接属性:&allowMultiQueries=true

jdbc.url=jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true

addEmps(@Param("emps") List<Employee> emps);

-->

<foreach collection="emps" item="emp" separator=";">

insert into myemployeee(last_name,email,gender,dept_id)

values

(#{emp.lastName,jdbcType=VARCHAR},#{emp.email,jdbcType=VARCHAR},

#{emp.gender,jdbcType=VARCHAR},#{emp.deptId,jdbcType=INTEGER})

</foreach>

以上为mysql情况下;下面为oracle批量插入

oracle批量插入

注意:oracle不支持values(),(),()

Oracle使用

Begin

Insert into myemployeee(last_name,email,gender,dept_id)

Values (#{emp.lastName,jdbcType=VARCHAR},#{emp.email,jdbcType=VARCHAR},

#{emp.gender,jdbcType=VARCHAR},#{emp.deptId,jdbcType=INTEGER});

Insert into myemployeee(last_name,email,gender,dept_id)

Values (#{emp.lastName,jdbcType=VARCHAR},#{emp.email,jdbcType=VARCHAR},

#{emp.gender,jdbcType=VARCHAR},#{emp.deptId,jdbcType=INTEGER});

End;

包括在begin和end中间

mybatis学习系列二的更多相关文章

  1. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  2. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

  3. MyBatis学习系列一之环境搭建

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 学习一个新的知识,首先做一个简单的例子使用一下,然后再逐步深入.MyBat ...

  4. MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存

    目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...

  5. MyBatis学习 之 二、SQL语句映射文件(1)resultMap

    目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...

  6. 【转】MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作

    [转]MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作 上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据, ...

  7. Maven学习系列二(1-5)

    Maven学习系列二(1-5) 本文转自 QuantSeven 博客,讲解精炼易懂,适合入门,链接及截图如下 http://www.cnblogs.com/quanyongan/category/47 ...

  8. mybatis入门系列二之输入与输出参数

    mybatis入门系列二之详解输入与输出参数   基础知识   mybatis规定mapp.xml中每一个SQL语句形式上只能有一个@parameterType和一个@resultType 1. 返回 ...

  9. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

随机推荐

  1. 【BJOI2019】删数 线段树

    题目大意:一个数列若能在有限次数内删空,则称这个数列可以删空,一次删除操作定义如下: 记当前数列长度为$k$,则删掉数列中所有等于$k$的数. 现在有一个长度为$n$的数列$a$,有$m$次修改操作, ...

  2. Ubuntu16.04 安装 wps (不推荐安装)

    一.下载与安装 1.下载:WPS For Linux 下载地址:http://community.wps.cn/download/     ,  下载 wps-office_10.1.0.5672~a ...

  3. Web渗透:PHP字符编码绕过漏洞总结

    其实这东西国内少数黑客早已知道,只不过没有共享公布而已.有些人是不愿共享,宁愿烂在地里,另外的一些则是用来牟利. 该漏洞最早2006年被国外用来讨论数据库字符集设为GBK时,0xbf27本身不是一个有 ...

  4. 1. Spring 框架简介及官方压缩包目录

    一.Spring 框架简介及官方压缩包目录介绍 1.主要发明者:Rod Johnson 2.轮子理论推崇者:     2.1 轮子理论:不用重复发明轮子.     2.2 IT 行业:直接使用写好的代 ...

  5. Android开源系列:仿网易Tab分类排序控件实现

    前言 产品:网易新闻那个Tab排序好帅. 开发:哦~ 然后这个东东在几天后就出现了..... (PS:差不多一年没回来写博客了~~~~(>_<)~~~~,顺便把名字从 enjoy风铃 修改 ...

  6. Android多线程编程<一>Android中启动子线程的方法

          我们知道在Android中,要更新UI只能在UI主线程去更新,而不允许在子线程直接去操作UI,但是很多时候,很多耗时的工作都交给子线程去实现,当子线程执行完这些耗时的工作后,我们希望去修改 ...

  7. SQL 必知必会·笔记<18>管理事务处理

    事务处理是一种机制,用来管理必须成批执行的SQL操作,保证数据库不包含不完整的操作结果.利用事务处理,可以保证一组操作不会中途停止,它们要 么完全执行,要么完全不执行(除非明确指示).如果没有错误发生 ...

  8. 深度学习论文翻译解析(一):YOLOv3: An Incremental Improvement

    论文标题: YOLOv3: An Incremental Improvement 论文作者: Joseph Redmon Ali Farhadi YOLO官网:YOLO: Real-Time Obje ...

  9. ASP.NET MVC 5 Authentication Breakdown

    In my previous post, "ASP.NET MVC 5 Authentication Breakdown", I broke down all the parts ...

  10. FFmpeg流媒体处理-收流与推流

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10623968.html 1. 简介 流媒体是使用了流式传输的多媒体应用技术.如下是维基百 ...