上一章【Mybatis】MyBatis对表执行CRUD操作(三),已经讲了基本操作,本章介绍Sql配置文件中常用功能

  1、插入返回主键

  2、参数值的获取方式

  3、resultMap使用

插入返回主键

  在实际项目中,插入一条数据,id是数据库自动生成的,但是我们插入完数据,往往需要返回数据的id进行使用。

  1、在EmployeeMapper.xml映射文件中加入2条sql

 1 <!-- parameterType 可写可不写 -->
2 <insert id="insertEmployee" parameterType="com.hd.test.pojo.Employee">
3 insert into employee(last_name, email, gender) values(#{lastName}, #{email}, #{gender})
4 </insert>
5
6 <!--
7 获取自增主键的值:
8 mysql支持自增主键,自增主键值的获取,mybatis也是利用statement.genGenreatedKeys()
9 useGeneratedKeys="true",使用自增主键获取主键值策略
10 keyProperty:指定对应的主键属性,也就是mybatis获取到主键值以后,将这个值封装给JavaBean的属性
11 -->
12 <insert id="insertEmployeeReturnId" parameterType="com.hd.test.pojo.Employee" useGeneratedKeys="true" keyProperty="id">
13 insert into employee(last_name, email, gender) values(#{lastName}, #{email}, #{gender})
14 </insert>

  2、EmployeeMapper接口中加入方法

1 // 新增
2 public Integer insertEmployee(Employee employee);
3
4 // 新增并返回id
5 public Integer insertEmployeeReturnId(Employee employee);

  3、单元测试类方法

 1 @Test
2 public void test5() throws IOException {
3
4 // 获取SqlSessionFactory
5 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
6 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
7
8 // 获取的sqlsession自动提交数据
9 SqlSession session = sqlSessionFactory.openSession(true);
10 try {
11 EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
12
13 // 插入数据
14 Employee employee = new Employee("小黑", "1", "xiaoHei@163.com");
15 Integer returnValue = mapper.insertEmployee(employee);
16 System.out.println("插入小黑返回值:" + returnValue);
17 System.out.println("插入后小黑对象:" + employee);
18
19 Employee employee2 = new Employee("小白", "1", "xiaoBai@163.com");
20 Integer returnValue2 = mapper.insertEmployeeReturnId(employee2);
21 System.out.println("插入小黑返回值:" + returnValue2);
22 System.out.println("插入后小黑对象:" + employee2);
23
24 } finally {
25 session.close();
26 }
27 }

  4、运行单元测试类,结果如下:

    

参数值的获取方式

  1、#{},可以获取普通变量的值、map中的值或者pojo对象属性的值;

  2、${},只能获取map中的值或者pojo对象属性的值;

  区别:

    #{}:是以预编译的形式,将参数设置到sql语句中;PreparedStatement;防止sql注入

    ${}:取出的值直接拼装在sql语句中;会有安全问题;

    大多情况下,我们去参数的值都应该去使用#{},特色情况可以使用${},

      比如:按照年份分表拆分 select * from ${year}_salary;

  案例:

    使用前面的查询sql

    1、使用#{},获取参数

      sql如下:

1 <select id="getEmployeeByMap" resultType="com.hd.test.pojo.Employee">
2 select id, last_name lastName, gender, email from employee where id = #{id}
3 </select>

      Mapper接口中加入方法

1 public Employee getEmployeeByMap(Map map);

      测试代码

 1 /**
2 * 查询
3 * @throws IOException
4 */
5 @Test
6 public void test() throws IOException {
7
8 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
9 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
10 SqlSession session = sqlSessionFactory.openSession();
11
12 try {
13 EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
14 Map<String, Object> map = new HashMap<String, Object>();
15 Employee employee = mapper.getEmployeeByMap(map);
16 // 输出信息
17 System.out.println("查询返回值:" + employee);
18 } finally {
19 // 关闭session
20 session.close();
21 }
22 } 

      执行,输出结果

     

    2、使用${},获取参数

      修改sql如下:

1 <select id="getEmployeeByMap" resultType="com.hd.test.pojo.Employee">
2 select id, last_name lastName, gender, email from employee where id = #{id}
3 </select>

      测试代码,执行,输出结果

      

    通过日志,可以看出,使用 #{}格式的语法会导致 MyBatis 创建 PreparedStatement 参数并安全地设置参数,而使用${}格式直接在 SQL 语句中插入一个不转义的字符串

resultMap使用

  在项目开发中,表中的字段名和表对应实体类的属性名称不一定都是完全相同的,这是我们可以通过<resultMap>来映射字段名和实体类属性名的一一对应关系

  案例:

    employee表字段如下:

 -- ----------------------------
-- Table structure for employee
-- ----------------------------
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`last_name` varchar(255) DEFAULT NULL,
`gender` char(1) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

    Employee实体类:

 package com.hd.test.pojo;

 public class Employee {

     private Integer id;
private String lastName;
private String gender;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Employee [id=" + id + ", lastName=" + lastName + ", gender=" + gender + ", email=" + email + "]";
} }

    可以看到其中表字段last_name与实体类中属性lastName不对应,此时需要使用到<resultMap>,sql配置文件如下:

 <!--自定义某个javaBean的封装规则
type:自定义规则的Java类型
id:唯一id方便引用
-->
<resultMap type="com.hd.test.pojo.Employee" id="EmployeeMap">
<!--指定主键列的封装规则
id定义主键会底层有优化;
column:指定哪一列
property:指定对应的javaBean属性
-->
<id column="id" property="id"/>
<!-- 定义普通列封装规则 -->
<result column="last_name" property="lastName"/>
<!-- 其他不指定的列会自动封装:我们只要写resultMap就把全部的映射规则都写上。 -->
<result column="email" property="email"/>
<result column="gender" property="gender"/>
</resultMap> <select id="getEmployeeById" resultMap="EmployeeMap">
select id, last_name, gender, email from employee where id = #{id}
</select>

    通过测试代码,执行,调用getEmployeeById方法,可以看出查出来的Employee对象,属性lastName也是有值的。

【Mybatis】MyBatis之Sql配置文件的使用(四)的更多相关文章

  1. JavaWeb_(Mybatis框架)主配置文件介绍_四

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  2. springmvc 项目完整示例04 整合mybatis mybatis所需要的jar包 mybatis配置文件 sql语句 mybatis应用

    百度百科: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBat ...

  3. mybatis源码-解析配置文件(四-1)之配置文件Mapper解析(cache)

    目录 1. 简介 2. 解析 3 StrictMap 3.1 区别HashMap:键必须为String 3.2 区别HashMap:多了成员变量 name 3.3 区别HashMap:key 的处理多 ...

  4. mybatis源码-解析配置文件(四)之配置文件Mapper解析

    在 mybatis源码-解析配置文件(三)之配置文件Configuration解析 中, 讲解了 Configuration 是如何解析的. 其中, mappers作为configuration节点的 ...

  5. 精尽MyBatis源码分析 - SQL执行过程(四)之延迟加载

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  6. MyBatis框架之SQL映射和动态SQL

    使用MyBatis实现条件查询 1.SQL映射文件: MyBatis真正的强大之处就在于SQL映射语句,MyBatis专注于SQL,对于开发人员来说也是极大限度的进行SQL调优,以保证性能.下面是SQ ...

  7. Mybatis解析动态sql原理分析

    前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...

  8. 详解Java的MyBatis框架中SQL语句映射部分的编写

    这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...

  9. mybatis 使用动态SQL

    RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...

随机推荐

  1. 嵌入式linux——时钟(三)

    今天写第一篇,S3C2440的时钟,配置好时钟系统,各个模块才能正常有效的工作,为了了解始终系统,必须要阅读芯片手册,尽量看英文版的,这样还能捎带着增加一下阅读英语计数文档的能力. 概览 在2440数 ...

  2. EasyUI 1.3.2 中 Combobox自动检索 键盘上下选择Bug问题

    EasyUI 自带的Combobox控件,提供了下拉列值自动检索功能. 在用到的EasyUI 1.3.2版本中还是有点问题,在键盘上下键移动选择过程中只能定位在第一个,不能正常向下移动 问题解决方式: ...

  3. [Flutter] 因为不讲这个重点, 全网所有 flutter 实战视频沦为二流课程

    二流课程也有其存在的价值,看到不同组件的轮流使用也是不断熟悉的过程,不过太眼花缭乱了. 授人以渔,基础用法是其一,讲清套路是其二,不然坑萌新. 那么 flutter 的套路是什么呢,我认为有下面几点: ...

  4. 虚拟机中安装完Lunix系统后,开机黑屏,只显示一个-,解决方法

    1,查看设置->硬盘是不是SCSI,如果是,先关闭虚拟机,移除该硬盘(实际数据不会删除) 2,添加一个新的虚拟硬盘,最后位置选IDE设备 3,确定,重启虚拟机即可

  5. Mac 下安装nvm 后vscode 输入node -v 不起作用

    今天下午,我因为要安装不同的node版本,所有安装了nvm下载了两个不同版本的node,并且配置了环境变量. 在命令行窗口中使用起来没有任何问题,但是在vs code中敲的时候node -v 显示no ...

  6. IDEA中使用中jetty启动java项目(非springboot)

    1.安装maven helper插件,略 2.项目pom.xml文件中添加jetty插件配置 <build> <plugins> <plugin> <grou ...

  7. 初学python笔记---列表

    ---恢复内容开始--- 1.列表的格式:用方括号([])来表示的,逗号来分隔元素,下标从0开始 2.根据下标来查看列表中元素,当索引为-1时,显示的是最后一个元素 print(a[0])-----1 ...

  8. liteUploader上传控件的封装使用

    //原来的绑定方式 $('#' + frm_name).liteUploader({ script: url, params: { type: "image", size: siz ...

  9. JASPER打印单据,标签开发培训, 界面开发培训

    JASPER打印单据,标签开发培训软件:TIBC JASPER Studio.Jaspersoft Studio是一个专为JasperReports报表引擎而开发的报表设计器,是 iReport设计器 ...

  10. 浏览器登录EBS系统遇到问题总结

    1.可以登录EBS系统,但是职责位置为空白 这是兼容性视图问题,将ERP域名加入兼容性视图列表即可. 加入即可: 2.可以登录EBS系统,但是职责位置显示 “undefined” 这也是兼容性视图问题 ...