1.插入后用新id初始化被插入对象

  1. <insert id="insertStudentCatchId">
  2. insert into student (age,name,score) values (#{age},#{name},#{score}); <!-- #{}中写入的是Student类的属性名 -->
  3.  
  4. <!-- 子标签 selectKey 用于获取新插入记录的主键值 -->
  5. <!-- 使用新插入记录的主键值初始化被插入的对象 -->
  6. <selectKey resultType="int" keyProperty="id" order="AFTER">
  7. select @@identity
  8. </selectKey>
  9. </insert>

2.删除数据

  1. <delete id="delecteStudent">
  2. delete from student where id = #{id} <!-- 这里的id就是是直接传过来的一个整数,不是通过对象来进行传递的,所以#{id} 充当的是 占位符,{} 可以写任意字符 -->
  3. </delete>

3.修改数据

  1. <update id="updateStudent">
  2. update student set name = #{name},age = #{age},score = #{score} where id = #{id}
  3. </update>

4.查询所有对象-返回List

  1. <!-- 这里需要使用resultType指定结果类型,不然查询出来了,都不知道构成什么对象 -->
  2. <select id="selectAllStudent" resultType="com.mybatis.model.Student"> <!-- 因为这里没有设置别名,所以需要加上包全名 -->
  3. select * from student
  4. </select>
  1. sqlSession = SqlSessionUtil.getSqlSession();
  2. students = sqlSession.selectList("selectAllStudent");
  1.  

resultType 属性并非指查询结果集最后的类型,而是每查出 DB 中的一条记录,将该记录封装成为指定对象的类型

通过 selectList()方法完成查询操作,该方法会将查询出来的已经封装好的对象,放到一个List中返回

5.查询所有对象-返回Map

  和返回List类似,区别是最后是要放到Map容器中的,所以需要指定将对象 put 进 map时的 key

  1. sqlSession = SqlSessionUtil.getSqlSession();
  2. //查询出的结果是一个Map,这个Map的key是 指定对象的值 (如:xzk)根据这个key 可以查询对应的value,value就是student对象
  3. studentsMap = sqlSession.selectMap("selectStudentMap", "name");

6.查询单个对象

  使用SqlSession的selectOne()方法。其会将查询的结果记录封装为一个指定类型的对象

  1. <select id="selectStudentById" resultType="com.mybatis.model.Student">
  2. select * from student where id = #{id} <!-- 这里 #{id} 同样是占位符-->
  3. </select>
  1. sqlSession = SqlSessionUtil.getSqlSession();
  2. student = sqlSession.selectOne("selectStudentById", id);
  1.  

7.根据Map进行查询

  mapper中SQL语句的动态参数也可以是Map的key

8.模糊查询

  1. <select id="selectStudentsByName" resultType="com.mybatis.model.Student">
  2. select * from student where name like '%' #{name} '%' //1 1和2是等价的
  3. <!-- select * from student where name like concat ('%' #{xx} '%') --> //2
  4. <!-- select * from student where name like '%${value}%' -->
  5. </select>

进行模糊查询时,需要进行字符串的拼接。SQL中字符串的拼接使用的是 concat() 函数,注意不能使用Java中的字符串连接符

第一条和第二条语句都是等价的,都是以动态参数(name=?)的形式出现在SQL语句中

还可以使用第三条语句的方式,只是需要注意,${ } 中只能使用 value,不能使用其它

而且,这种方式是纯粹的字符串拼接,直接将参数拼接到了SQL语句中。这种方式可能会发生SQL注入

$ 和 # 的区别

A、理论区别

  $ 与 # 的 区别是很大的。#为占位符,而$为字符串拼接符

  字符串拼接是将参数值以硬编码的方式直接拼接到了SQL语句中。字符串拼接会引发两个问题:

  SQL注入问题与没有预编译所导致的执行效率底下的问题

  占位符的引入,解决以上两个问题

B、执行区别

  上面已经提到,一个是为SQL动态地进行赋值,一个是直接定死在SQL语句中,类似statement 和 prepareStatement的区别

C、应用场景

一般情况下,动态参数的值是由用户输入的,则不能使用拼接符$,因为有可能会出现SQL 注入;

若动态参数的值是由系统计算生成的,则可以使用拼接符$。但这样虽然不存在SQL 注入的风险,但仍存在执行效率问题。

6.单表的CRUD操作的更多相关文章

  1. 【Java EE 学习 44】【Hibernate学习第一天】【Hibernate对单表的CRUD操作】

    一.Hibernate简介 1.hibernate是对jdbc的二次开发 2.jdbc没有缓存机制,但是hibernate有. 3.hibernate的有点和缺点 (1)优点:有缓存,而且是二级缓存: ...

  2. jdbc笔记(二) 使用PreparedStatement对单表的CRUD操作

    首先声明,本文只给出代码,并不是做教程用,如有不便之处,还请各位见谅. PreparedStatement相较于Statement,概括来说,共有三个优势: 1. 代码的可读性和易维护性:Prepar ...

  3. jdbc笔记(一) 使用Statement对单表的CRUD操作

    jdbc连接mysql并执行简单的CRUD的步骤: 1.注册驱动(需要抛出/捕获异常) Class.forName("com.mysql.jdbc.Driver"); 2.建立连接 ...

  4. Oracle触发器实现监控某表的CRUD操作

    前提:请用sys用户dba权限登录 1.创建一个表来存储操作日志 create table trig_sql( LT DATE not null primary key, SID NUMBER, SE ...

  5. SpringMVC案例1——对User表进行CRUD操作

    ------------------------------------------------------------------web.xml--------------------------- ...

  6. 【Java框架型项目从入门到装逼】第九节 - 数据库建表和CRUD操作

    1.新建学生表 这节课我们来把和数据库以及jdbc相关的内容完成,首先,进行数据库建表.数据库呢,我们采用MySQL数据库,我们可以通过navcat之类的管理工具来轻松建表. 首先,我们得建一个数据库 ...

  7. 通过jdbc完成单表的curd操作以及对JDBCUtils的封装

    概述:jdbc是oracle公司制定的一套规范(一套接口),驱动是jdbc的实现类,由数据库厂商提供.所以我们可以通过一套规范实现对不同的数据库操作(多态) jdbc的作用:连接数据库,发送sql语句 ...

  8. 【nodejs】修改了下对股票表进行crud操作的代码

    表是这样的: id是自增长字段,code和name都是255位的varchar. 下面是主角app.js的代码: 'use strict'; var express=require('express' ...

  9. mybatis入门--单表的增删改操作

    单表的增加操作 前面我们看了如何搭建mybatis框架以及查询操作,这里我们说下如何使用mybatis进行增加用户的操作.首先是在user.xml文件中添加insert的方法.代码如下 <!-- ...

随机推荐

  1. iptables之精髓(二)

    iptables实际操作 使用-v选项后,iptables为我们展示的信息更多了,那么,这些字段都是什么意思呢?我们来总结一下 pkts:对应规则匹配到的报文的个数. bytes:对应匹配到的报文包的 ...

  2. Spring事务管理5-----声明式事务管理(3)

    声明式事务管理  基于注解 在配置文件中需要开启注解驱动<tx:annotation-driven transaction-manager="transactionManager&qu ...

  3. delphi type

    声明: 1. type Name = Existing type; 2. type Name = type Existing type; 3. type Name = (EnumValue1 [=va ...

  4. 启动mongodb报错,无法连接mongodb

    报错原因如下: MongoDB shell version v3.4.2 connecting to: mongodb://127.0.0.1:27017 --01T12:: W NETWORK [t ...

  5. STL标准模板库之set

    目录 一.关联式容器 二.什么是set? 特点 优缺点和适用场景: 三.定义及初始化 四.基本操作 1)容量函数 2)修改函数 3)迭代器 4)其他函数 五.与序列容器的不同点 一.关联式容器 关联式 ...

  6. 【VS开发】内存映射文件3

    内存映射文件 内存映射文件,是由一个文件到一块内存的映射.Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping).内存映射文件与虚拟内存有些类似,通过内存映射文 ...

  7. 最新 汇通达java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 汇通达等10家互联网公司的校招Offer,因为某些自身原因最终选择了 汇通达.6.7月主要是做系统复习.项目复盘.Leet ...

  8. mysql 触发器检测表数据添加,进而调用存储过程检测数据,进而调用存储过程添加数据

    触发器: beginDECLARE user_mes INT(64);SELECT user_id into user_mes FROM order_orderlist where id = new. ...

  9. 如何使用 Issue 管理软件项目?

    软件开发(尤其是商业软件)离不开项目管理,Issue 是最通用的管理工具之一.

  10. TemplateView , ListView ,DetailView三种常用类视图用法

    参考博客: https://blog.csdn.net/weixin_36571185/article/details/74280102