九江网站建设排行榜,网站建设公司信息,推广小程序的营销策略,免费网站制作app目录 基础操作
准备#xff1a;
删除#xff1a;
新增#xff1a;
更新#xff1a;
查询#xff1a;
条件查询#xff1a;
XML映射文件
动态SQL
if
foreach
sqlinclude 基础操作
准备#xff1a;
准备数据库表
创建一个新的springboot工程#xff0…目录 基础操作
准备
删除
新增
更新
查询
条件查询
XML映射文件
动态SQL
if
foreach
sqlinclude 基础操作
准备
准备数据库表
创建一个新的springboot工程选择引入对应的起步依赖mybatis、mysql驱动、lombok
application.properties中引入数据库连接信息
创建对应的实体类实体类属性采用驼峰命名
准备Mapper接口
删除 Delete(delete from teachnewstudent where id#{id})public void delete(Long id);
特别指出占位符 #{id}
删除是由返回值的数据的返回值改为int即可删除数据
注意事项如果mapper接口方法形参只有一个普通类型的参数#{...}里面的属性名可以随便写如#{id}、#{value}。
日志输出
可以在application.properties中打开mybatis的日志并指定输出到控制台。
#指定mybatis输出日志的位置输出控制台mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl
预编译SQL
优势性能更高
更安全防止SQL注入 SQL注入
SQL注入是通过操作输入的数据来修改事先定义好的SQL语句以达到执行代码对服务器进行攻击的方法。 使用#{}即为预编译 新增 Insert(insert into user(name,intro,state) values(#{name},#{intro},#{state})public void insert(User user); 如果有多个参数可使用实体类来封装多个参数
主键返回
描述在数据添加成功后需要获取插入数据库的主键。如添加套餐数据时还需要维护套餐菜品关系表数据。
实现加上注解Options框架会自动将生成的主键值赋值给user对象的id属性 Options(keyPropertyid, useGeneratedKeys true)Insert(insert into user(name,intro,state)values(#{name},#{intro},#{state})public void insert(User user);
更新
一般是根据主键来修改因为主键是不改变的 Update(update user set name#{name},intro#{intro},state#{state} where id#{id})public void update(User user);查询
根据id查询 Select(select * from user where id#{id})public User getById(Long id);
数据封装
实体类属性名 和 数据库表查询返回的字段名一致mybatis会自动封装。
如果实体类属性名 和 数据库表查询返回的字段名不一致不能自动封装。
解决方案
方案一给字段起别名让别名与实体类属性一致 Select(select id,name,create_time createTime,update_time updateTime from user where id#{id})public User getById(Long id);
方案二通过ResultsResult 注解手动映射封装 Results({Result(column,property)})Select(select * from user where id#{id})public User getById(Long id); column为需要封装的字段property为封装到的属性
方案三开启mybatis的驼峰命名自动映射开关 即a_ column------aColumn
在application.properties配置mybatis.configuration.map-underscore-to-camel-casetrue
需要严格遵守数据库名为下划线类型名为驼峰命名 条件查询 Select(select * from user where name like %${name}% and state#{state})public ListUser list1(String name,Short state);因为#{}是预编译符不能出现在之内所以需要用$符号来代替所以存在问题性能低、不安全、存在SQL注入问题
解决方法concat 字符串拼接函数 Select(select * from user where name like concat(%,#{name},%) and state#{state})public ListUser list1(String name,Short state);在springboot的2.x版本参数名与注解中引用部分相同否则需要单独加入注解 XML映射文件
规范
XML映射文件的名称与Mapper接口名称一致并且将XML映射文件和Mapper接口放置在相同包下同包同名。 XML映射文件的namespace属性为Mapper接口全限定名一致。 XML映射文件中sql语句的id与Mapper接口中的方法名一致并保持返回类型一致。
目录使用/来分隔
约束
官方文档入门_MyBatis中文网
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespacecom.example.demo.mapper.UserMapper/mapper
namespace的属性值和接口全类名保持一致
mapper namespacecom.example.demo.mapper.UserMapperselect idlist resultTypecom.example.pojo.Userselect * from user where name like%${name}% and state#{state}/select
/mapper 插件MyBatisX提高MyBatis效率能够快速定位 动态SQL
动态SQL
随着用户的输入或外部条件的变化而变化的SQL语句我们称之为 动态SQL if
if用于判断条件是否成立。使用test属性进行条件判断如果条件为true则拼接SQL。
mapper namespacecom.example.mapper.Usermapperselect idlist resultTypecom.example.pojo.Userselect * from userwhereif testname ! nullname like%${name}%/ifif teststate! nulland state#{state}/if/where/select
/mapper
where标签会自动去除多余的and关键字而且会判断条件成不成立当条件不成立时不会生成where关键字 而且会自动去除子句开头的AND或者OR
需求动态更新员工信息如果更新时传递有值则更新如果更新时没有传递值则不更新。
在 if 中添加 test属性即可
set标签替换set关键字能够去除掉多余的逗号
foreach
进行循环遍历的标签通常用在批量删除中
属性
collection遍历的集合与参数名保持一致
item遍历出来的元素
separator分隔符
open遍历开始前拼接的SQL片段
close遍历结束后拼接的SQL片段
delete iddeleteByIdsdelete from user where id inforeach collectionids itemid separetor, open( close)#{id}/foreach
/delete sqlinclude
sql负责抽取一个片段而include引用一个片段进行复用
sql idcommonSelectselect id,name
/sqlinclude 的 refid属性负责指定你要引用哪个片段值该值为select的id值 查询一个表的全部字段时不建议使用select*而是要罗列所有字段select*性能较低
include refidcommonSelect/