mybatis 取查询值_Mybatis --- 映射文件、参数处理、参数值的获取、select元素

这样就可以在insert函数中获取新添加的用户的 id主键,否则获取不到

select * from student where id = #{id}

insert into student(name,password,email) values(#{name},#{password},#{email})

编写测试单元:

private EmployeeMapper mapper = null;

private SqlSession session = null;

@Before

public void testBefore(){

//1.获取sqlSessionFactory对象

SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

//2.利用sqlSessionFactory创建一个session对象,表示和数据库的一次会话

session = sqlSessionFactory.openSession();

//3.用session对象获取mapper接口的代理对象

//因为sql映射文件给相应的接口创建了一个代理对象,所以mapper接口类不需要实现类

mapper = session.getMapper(EmployeeMapper.class);

}

@Test

public void testSelect(){

mapper = session.getMapper(EmployeeMapper.class);

//4.通过mapper接口的代理对象就可以对数据库进行增删改查操作

Employee employee = mapper.getEmployeeById(4);

System.out.println(employee);

}

@Test

public void testInsert(){

Employee emp = new Employee("zhangsan", "1234567", "zhangsan@q.com");

mapper.insertEmp(emp);

int id = emp.getId();

System.out.println(id);

}

@After

public void testAfter(){

//增删改需要提交事务

session.commit();

session.close();

}

//@Before、@After自动在@Test之前和之后运行

//查询不需要提交事务,增删改都需要提交事务

2.获取自增主键值【当向数据库中插入一条数据的时候,默认是拿不到主键的值的, 需要设置如下两个属性才可以拿到主键值!】

insert into tbl_employee(last_name,email,gender) values(#{lastName},#{gender},#{email})

3.SQL节点:

1).可以用于存储被重用的SQL片段

2).在sql映射文件中,具体使用方式如下:

name,password,email

insert into student() values(#{name},#{password},#{email})

参数处理:

- 单个参数:Mybatis 不会特殊处理

#{参数名}: 取出参数值,参数名任意写

- 多个参数:Mybatis会做特殊处理,多个参数会被封装成一个map

key:param1...paramN,或者参数的索引也可以(0,1,2,3.....)

value:传入的参数值

#{ }就是从map中获取指定的key的值

命名参数:明确指定封装参数时map的key:@param("id")

多个参数会被封装成一个map,

key:使用@Param注解指定的值

value:参数值

#{指定的key}取出对应的参数值

public void updateEmp(@Param("id")Integer id,

@Param("name")String name,

@Param("password")String password,

@Param("email")String email);

update student set name=#{name},password=#{password},email=#{email} where id=#{id}

- POJO参数:如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入POJO

#{属性名}:取出传入的POJO的属性值

public void insertEmp(Employee employee);

name,password,email

insert into student() values(#{name},#{password},#{email})

@Test

public void testReturnVal(){

Employee employee = mapper.getEmployeeById(30);

System.out.println(employee);

}

- Map:如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,我们也可以传入Map

#{key}:根据 key 取出map中对应的值

public void updateName(Map map);

update student set name=#{name} where id=#{id}

@Test

public void testMap(){

Map map = new HashMap<>();

map.put("id", 33);

map.put("name", "刘德华");

mapper.updateName(map);

}

#关于参数的问题:

①.使用#{}来传递参数

②.若目标方法的参数类型为对象类型,则调用其对应的getter方法,如getEmail()

③.若目标方法的参数类型为Map类型,则调用其get(key)

④.若参数是单个的,或者列表,需要使用@param注解来进行标记

⑤.注意:若只有一个参数,则可以省略@param注解

若有多个参数,必须要写@param注解

参数值的获取:

#{}:可以获取map中的值或者pojo对象属性的值

${}: 可以获取map中的值获取pojo对象属性的值

用例子简单区分一下:

select * from tbl_employee where id = ${id} and last_name = #{lastName}

preparing:select * from tbl_employee where id = 2 and last_name = ?

也就是说:对于${} 在日志中可以看到你输入的值,不安全;

对于#{} 在日志中是?,所以相对安全

具体区别:

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

update student set name=#{name},password=#{password},email=#{email} where id=#{id}

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

update student set name='${name}',password='${password}',email='${email}' where id='${id}'

大多情况下,我们取参数的值都应该去使用#{}

但是原生JDBC不支持占位符的地方我们就可以使用${}进行取值

比如获取表名、分表、排序;按照年份分表拆分

- select * from ${year}_salary where xxx;[表名不支持预编译]

- select * from tbl_employee order by ${f_name} ${order} :排序是不支持预编译的!

select 元素 :

select元素来定义查询操作。

Id:唯一标识符。

用来引用这条语句,需要和接口的方法名一致

parameterType:参数类型。

可以不传,MyBatis会根据TypeHandler自动推断

resultType:返回值类型。

别名或者全类名,如果返回的是集合,定义集合中元素的类型。不能和resultMap同时使用

1.返回类型为一个List

public List getEmps();

select * from student

@Test

public void testReturnList(){

List emps = mapper.getEmps();

for (Employee employee : emps) {

System.out.println(employee);

}

}

2.返回记录为一个Map

只能查询单条数据,如果多条的话,多个key 值,找不到

public Map getEmpInfoById(Integer id);

resultType 是 Map 的全类名

select * from student where id = #{id}

key:列名;value:值

@Test

public void testReturnMap(){

Map emp = mapper.getEmpInfoById(30);

Set> entrySet = emp.entrySet();

for (Entry entry : entrySet) {

System.out.println(entry.getKey()+":"+entry.getValue());

}

}

数据库列名与实体类的属性名不对应的情况下有几种处理方式:

1.sql 语句 用 as 换名

2.下划线转换成驼峰式命名

在全局配置文件中

3.利用ResultMap:

public Employee getEmpInfoById(Integer id);

//相同的也可以不写,但因为规范建议写

select * from student where id = #{id}

@Test

public void testReturnMap(){

Employee emp = mapper.getEmpInfoById(30);

System.out.println(emp);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单片机8×8点阵显示简单汉字的程序_干货 | 浅析单片机制作贪吃蛇游戏

为了让大家更深入地了解底层的原理&#xff0c;在讲解时特意选择了51单片机(而非STM系列)&#xff0c;另外16*16点阵由译码器和移位缓存器直接驱动(而非MAX系列芯片)&#xff0c;摇杆也利用ADC功能判断方向。那如何让单片机驱动这256个点呢&#xff1f;直接用IO口驱动显然不够且…

怎样在linux中创建硬盘,在linux中添加新硬盘并创建LVM组

1、以虚拟机为例&#xff0c;给虚拟机添加一块新硬盘&#xff0c;并创建LVM组&#xff0c;将新硬盘用于存放oracle数据库文件。2、fdisk -ll查看新添加的硬盘是否被识别&#xff0c;如图已经识别出sdb。3、# pvcreate /dev/sdb (创建PV&#xff0c;相当于win中将基础磁盘转换…

python 输入框查询_Element输入框带历史查询记录

需求描述页面的查询框增加一下显示历史查找记录实现及踩坑记录使用Element带输入建议的输入框来实现此需求。用法详见官网1. 坑1&#xff1a;不能直接在querySearch里返回数组&#xff0c;一定要调用回调函数cb来处理数据看了一下例子&#xff0c;建议列表应该是个数组&#xf…

双代号网络图基础算法_软考网络工程师之系统开发和运行基础(软件分类、测试、模型)...

系统开发和运行基础(软件的分类、软件生存周期、软件开发模型、软件测试、软件项目管理)软件的分类系统软件&#xff0c;如操作系统。支撑软件&#xff0c;如开发工具。应用软件&#xff0c;如office。实时处理软件&#xff0c;一般是工业软件。软件生存周期1、软件定义问题定义…

linux怎么添加更新源,在Deepin 15.7系统中不需要在/etc/apt/sources.list添加更新源

Deepin 15.7和其他的Linux发行版在添加/etc/apt/sources.list更新源上明显不同&#xff0c;比如Ubuntu 18.04可以往该文件中添加国内的高速更新源&#xff0c;如Ubuntu 18.04更换国内高速源一文介绍的&#xff0c;而在Deepin 15.7系统中的/etc/apt/sources.list手动添加更新源后…

embedv.php_PHP与视频播放插件功能实现,非常简单

PHP与视频播放插件功能实现&#xff0c;非常简单龙行 PHP 2018-8-28 2579 0评论最近在研究maccms所以会接触到这个ckplayer播放器&#xff0c;那么如何php与视频播放器插件的功能&#xff0c;说白了就是前端是播放器的插件&#xff0c;直接调用后端传递过来的播放地…

python安卓版开发环境搭建_React Native Android 开发环境搭建(Windows 版)

补上之前说的 Windows 系统的 React Native 开发环境搭建&#xff0c;坑还是比 Mac 环境下的多些。此文的受众还是已经搭建过 Android 开发环境的同学。 需要安装的软件 Chocolatey Chocolatey是一个在 Windows 上比较受欢迎的包管理器&#xff0c;安装命令如下&#xff1a; 1 …

linux 的内核参数优化,Linux服务器内核参数优化

Linux服务器内核参数优化cat >> /etc/sysctl.conf << EOF#kernel optimizationnet.ipv4.tcp_fin_timeout 2net.ipv4.tcp_tw_reuse 1net.ipv4.tcp_tw_recycle 1net.ipv4.tcp_syncookies 1net.ipv4.tcp_keepalive_time 600net.ipv4.ip_local_port_range 4000 6…

aspen求理论塔板数_aspen 塔设计

果。方法&#xff1a;对第 5 步的计算结果(如&#xff1a;塔径等)按设计规范要求进行必要的圆整&#xff0c;用 RateFrace 或 RateFrace 模块的Tray Rating(填料塔用PAking Sizing)&#xff0c;对塔进行设计核算。结果&#xff1a;塔工艺设计的所有需要的结果。如果仅是完成设计…

在学Python前学Linux,Python原来这么好学-1.2节: 在Linux中安装python

这里将告诉您Python原来这么好学-1.2节: 在Linux中安装python,具体操作过程:在Linux系统的主要发行版中&#xff0c;按其软件包格式来进行划分&#xff0c;可分为Deb系以及RPM系操作系统。Linux系统与Windows系统有一个很重要的区别&#xff0c;Linux系统完全免费&#xff0c;开…

python关键字的意思_python 关键字(Keywords)

2018-04-30 python 关键字&#xff08;Keywords&#xff09; 声明&#xff1a;本文章大部分来自下面博客&#xff0c;对其作者表示感谢。以后会有详细的关键字说明。 1、and&#xff1a; 表示逻辑‘与’ 2、del&#xff1a; 用于list列表操作&#xff0c;删除一个或者连续几个元…

python modulenotfounderror_python 服务器运行代码报错ModuleNotFoundError的解决办法

一、问题描述一段 Python 代码在本地的 IDE 上运行正常&#xff0c;部署到服务器运行后&#xff0c;出现了 ModuleNotFoundError: No module named ‘xxx" 错误。二、问题原因在代码中引入了其他文件的包(自己写的包&#xff0c;非 pip 安装的)&#xff0c;问题出在 impor…

python金融大数据分析视频_Python金融大数据分析 PDF 全书超清版

给大家带来的一篇关于Python相关的电子书资源&#xff0c;介绍了关于Python金融、大数据分析方面的内容&#xff0c;本书是由人民邮电出版社出版&#xff0c;格式为PDF&#xff0c;资源大小47.8 MB&#xff0c;希尔皮斯科编写&#xff0c;目前豆瓣、亚马逊、当当、京东等电子书…

linux批量切割图片,MAC中用Shell脚本批量裁剪各种尺寸的App图标

在APP上架前&#xff0c;一次一次自己剪裁上架需要的各个尺寸的Icon不是程序员该干的事&#xff0c;使用Mac中自带的sips工具可以解决这个需求。关于sips&#xff0c;在终端中直接执行可以出现以下信息&#xff1a;sips 10.4.4 - scriptable image processing system.This tool…

刘卫国python实验答案_MATLAB(刘卫国)部分实验答案

实验3第一题&#xff1a;clear allm[-5.0,-3.0,1.0,2.0,2.5,3.0,5.0];for xmif x<0&x~-3y1x^2x-6;disp([y ,num2str(y1)])elseif x>0&x<5&x~2&x~3y2x^2-5*x6;disp([y ,num2str(y2)])elsey3x^2-x-1;disp([y ,num2str(y3)])endend第二题&#xff1a;cle…

kaggle房价预测特征意思_机器学习-kaggle泰坦尼克生存预测(一)-数据清洗与特征构建...

1、背景&#xff1a;1.1 关于kaggle&#xff1a;谷歌旗下的 Kaggle 是一个数据建模和数据分析竞赛平台。该平台是当下最流行的数据科研赛事平台&#xff0c;其组织的赛事受到全球数据科学爱好者追捧。 如果学生能够在该平台的一些比赛中获得较好的名次&#xff0c;不仅可以赢得…

linux docker安装svn,使用docker镜像搭建svn+Apache环境

环境准备虚拟机装好之后&#xff0c;按照官网步骤检查虚拟机内核版本&#xff0c;必须在3.10以上版本&#xff0c;故此处安装redhat_7.2# uname -r3.10.0-327.el7.x86_64安装docker&#xff1a;yum install docker-io有依赖是直接安装具体的依赖软件&#xff0c;解决依赖docker…

感恩工作平台心得体会_感恩工作心得体会6篇

2016全新精品资料-全新公文范文-全程指导写作–独家原创1/9感恩工作心得体会6篇感恩是世界最美好的语言&#xff0c;是心中最美的境界。感恩不但是一种美德&#xff0c;也是我们工作中必须要有的一种心态。下面是美文网带来的感恩工作的心得体会&#xff0c;仅供参考。感恩工作…

springboot 设置ico_Spring Boot--Thymeleaf模板引擎/静态页面

点关注&#xff0c;不迷路&#xff1b;持续更新Java相关技术及资讯&#xff01;&#xff01;&#xff01;1.Spring Boot对静态资源的映射规则如果静态资源文件夹下有 index.html的话,直接访问localhost:8080的话,index就是欢迎页使用自己的图标:在静态资源文件夹放一个 favicon…

linux shell 豆瓣,用Linux shell脚本爬取豆瓣邮箱

前两天总结一下邮箱格式的正则表达式&#xff0c;写了一个脚本来判断输入的邮箱地址是否符合邮箱的格式(有兴趣的朋友可以翻一下我的博客去看一下)。在网上找资料的时候&#xff0c;发现基本都是用Python和Java来做爬虫&#xff0c;当然Python的居多。本着学习的心态&#xff0…