Mybatis编写SQL

打印 上一主题 下一主题

主题 1713|帖子 1713|积分 5139

两种写法是可以同时存在的
  一、用注解编写

1.1 增

普通增长


  • 拼接字符串:假如注解内里的字符串太长了,可以用 +即【拼接字符串】的方式。直接按回车即可。
  • 返回值:增编削时,返回值可以为Integer,也可以为void。但我们一般还是会设置为Integer的,因为【有时间我们的程序是否实行成功,是没有什么提示的,此时,我们就可以用“受影响的行数”来判断程序有无实行成功】

    • 当为Integer时,返回的是“受影响的行数”
    • 为void就什么都不返回

  • 参数:也可以一个一个传。因为要传的参数比较多,此处是用对象来传参
  1. @Mapper
  2. public interface UserInfoMapper {
  3.     @Insert("insert into userinfo (username, password, age, gender, phone)" +
  4.             "values(#{username}, #{password}, #{age}, #{gender}, #{phone})")
  5.     Integer insert(UserInfo userInfo);
  6. }
复制代码
获取自增ID


  • 使用场景:有很多服务都是需要拿到id后,才能进行下一步操纵。如订单团队,需要获取你的订单ID,后续才能进行付出对账操纵。
  • 代码:使用@Options注解

    • useGeneratedKeys:是否主动天生key,默以为false,这里要设置为 true
    • keyProperty:要把天生的key(主键)的值赋值给谁。下面示例中是赋值给了userinfo对象的id属性。

  1. @Options(useGeneratedKeys = true, keyProperty = "id")
  2. @Insert("insert into userinfo (username, password, age, gender, phone)" +
  3.         "values(#{username}, #{password}, #{age}, #{gender}, #{phone})")
  4. Integer insert(UserInfo userInfo);
复制代码
1.2 删和改


  • 删除
  1. @Delete("delete from userinfo where id = #{id}")
  2. Integer delete(Integer id);
复制代码

  • 修改
  1. @Mapper
  2. public interface UserInfoMapper {
  3.     @Update("update userinfo set age = #{age} where id = #{id}")
  4.     Integer update(UserInfo userInfo);
  5. }
复制代码
  1. @Slf4j
  2. @SpringBootTest
  3. class UserInfoMapperTest {
  4.     @Autowired
  5.     private UserInfoMapper userInfoMapper;
  6.     @Test
  7.     void update() {
  8.         UserInfo userInfo = new UserInfo();
  9.         userInfo.setAge(22);
  10.         userInfo.setId(11);
  11.         Integer res = userInfoMapper.update(userInfo);
  12.         //使用返回值判断【程序是否正确运行】
  13.         if (res > 0){
  14.             log.info("数据更新成功");
  15.         }
  16.     }
  17. }
复制代码
1.3 查

单表查询


  • 不带有参数
  1. @Mapper
  2. public interface UserInfoMapper {
  3.     @Select("select * from userInfo")
  4.     List<UserInfo> selectAll();
  5. }
复制代码

  • 带参数

    • 假如只有一个参数,名称是可以不匹配的,但通常情况下,为了方便去阅读,我们还是会让他们保持同等
    • 假如有多个参数,是需要我们匹配的

参数匹配
  1. @Mapper
  2. public interface UserInfoMapper {
  3.     @Select("select * from userInfo where id = #{id}")
  4.     UserInfo selectUser(Integer id);
  5. }
复制代码
参数不匹配
  1. @Mapper
  2. public interface UserInfoMapper {
  3.     @Select("select * from userinfo where id = #{id}")
  4.     UserInfo selectUser(Integer id123);
  5. }
复制代码
多表查询


  • 避免使用多表查询:我们要只管避免使用多表查询,尤其是性能要求很高的项目

    • 原因

      • :假如查询两个表分别要10s,把他们放在一起查询肯定会大于10s,因为多表查询尚有【整理】的操纵
      • 程序员不可控:Java方面可以使用多线程的方式优化多表查询,但假如直接使用多表查询的SQL语句,相称于直接把优化的操纵交给了Mysql,程序员层面无法再优化了
      • 会影响其他项目:通过情况下,数据库是集群使用的,即很多项目都会用到一个数据库。此时,当出现慢查询时,会影响整个集群,即会影响到全部使用该集群的项目。
      • 扩容服从低:当要进行扩容操纵时,Java服务器扩容非常方便,但是数据库集群扩容就需要专门的人员来处理,非常贫苦

    • 多表查询的优势:操纵简朴。假如使用多线程优化,我们还需要进行逻辑上的处理,以是一些对性能要求不是很高的项目,还是可以使用多表查询的

  • 怎样使用多表查询:直接用多表查询的SQL + Java对象有对应的属性

    • 原理:Mybatis不在乎是多表SQL还是单表SQL

      • Mybatis的工作是把这个方法的SQL语句发送给Mysql,在Mysql给我们返回一个结果(可以通过打印的Mybatis日志检察)后,Mybatis进行结果映射,并按照方法定义返回对应的值
      • 以是,Mybatis根本不关注SQL是单表还是多表,它所关注的只是怎样进行结果映射,我们只要确保对象里有对应的属性就行。



二、用xml编写

2.1 使用xml的流程


  • 配置数据库资源:和注解时配置的一样
  1. spring:
  2.   datasource:
  3.     url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
  4.     username: root
  5.     password: 123456
  6.     driver-class-name: com.mysql.cj.jdbc.Driver
复制代码

  • 配置路径

  • 对xml进行声明

    • namespace:表示要实现哪个接口,要求写接口的全限定类名(假如按住ctrl能来到想要的接口,就阐明没有写错路径)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.example.demo.mapper.UserInfoXMLMapper">
  4. </mapper>
复制代码

  • 编写xml

    • 换行规则:xml的SQL地区,换行直接敲回车即可,整块会被当成一个字符串
    • 返回范例的指定:只有查询时,需要去阐明返回的范例,其他的增编削则不需要指定

      • 指定返回范例的规则

        • 使用全限定类名
        • 不需要指定返回的是List,Mybatis能识别出我们返回的是List 还是 其他的数据范例



  1. @Mapper
  2. public interface UserInfoXMLMapper {
  3.     List<UserInfo> selectAll();
  4. }
复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.example.demo.mapper.UserInfoXMLMapper">
  4.     <select id="selectAll" resultType="com.example.demo.model.UserInfo">
  5.        select * from userinfo        <!-->直接在这里写SQL语句即可<-->
  6.     </select>
  7. </mapper>
复制代码
2.2 增

普通增长


  • 未重命名
  1. @Mapper
  2. public interface UserInfoXMLMapper {
  3.     Integer insert(UserInfo userInfo);
  4. }
复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.example.demo.mapper.UserInfoXMLMapper">
  4.     <insert id="insert">
  5.         insert into userinfo (username, password, age, gender, phone)
  6.         values(#{username}, #{password}, #{age},
  7.         #{gender}, #{phone})
  8.     </insert>
  9. </mapper>
复制代码

  • 重命名:重命名方法和【注解方式】同等
  1. @Mapper
  2. public interface UserInfoXMLMapper {
  3.    
  4.     Integer insert(@Param("user") UserInfo userInfo);
  5. }
复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.example.demo.mapper.UserInfoXMLMapper">
  4.     <insert id="insert">
  5.         insert into userinfo (username, password, age, gender, phone)
  6.         values(#{user.username}, #{user.password}, #{user.age},
  7.         #{user.gender}, #{user.phone})
  8.     </insert>
  9. </mapper>
复制代码
获取自增ID

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.example.demo.mapper.UserInfoXMLMapper">
  4.     <insert id="insert" useGeneratedKeys="true" keyProperty="id">
  5.         insert into userinfo (username, password, age, gender, phone)
  6.         values(#{username}, #{password}, #{age},
  7.         #{gender}, #{phone})
  8.     </insert>
  9. </mapper>
复制代码
2.3 删 和 改


  • 删除
  1. <delete id="delete">
  2.     delete from userinfo where id = #{id}
  3. </delete>
复制代码

  • 修改
  1. <update id="update">
  2.     update userinfo set age = #{age} where id = #{id}
  3. </update>
复制代码
2.4 查


  • 关于resultType的指定

    • 范围:只有查询操纵需要指定
    • 使用方法:使用全限定类名。不需要指定返回的是List,Mybatis能识别出我们返回的是List 还是 其他的数据范例

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.example.demo.mapper.UserInfoXMLMapper">
  4.     <select id="selectAll" resultType="com.example.demo.model.UserInfo">
  5.        select * from userinfo        <!-->直接在这里写SQL语句即可<-->
  6.     </select>
  7. </mapper>
复制代码
三、#{} 和 ${}

3.1 #{} 、${}


  • 使用方面:优先使用#,不能直接使用#,就搭配内置函数或写多个接口等,末了考虑用$
  • #{}、${}区别

    • 共同点:都是用来获取变量的值
    • 不同点

      • #{}是预编译SQL,${}是即时编译SQL
      • 特殊情况下不能直接使用#


  • 无法使用直接#的场景:当参数为String,主动加的引号多此一举时。如排序、模糊查询、表名字段名等作为了参数。下面的办理方法着实也是#{}办理SQL注入的方法。

    • 升序降序:假如升序降序是参数,纵然我们加了引号也无法运行

    • 模糊查询


3.1 预编译 SQL 、即时编译SQL


  • 什么是预编译SQL 和 即时编译SQL

    • 预编译SQL:编译后缓存,后续从缓存拿,直接实行

      • 编译一次后会将编译后的SQL语句缓存起来,后续再实行这条语句时,不会再次编译(只是输入的参数不同),省去了前面的过程,直接实行,以此来进步服从
      • 相称于是一个框架,给你提前预留好一个位置,不管你是什么,都会把你作为id的参数塞进去

    • 即时编译SQL:直接去拼接,不管你这个参数内里是什么样,直接去拼上,也就会有【SQL注入】的问题了。




  • 预编译SQL VS 即时编译SQL区别

    • 性能对比:预编译SQL占优

      • 预编译SQL:因为有缓存,可以直接去拿,性能高
      • 即时编译SQL:当出现【select * from bookinfo where id = ‘1’】的情况时,虽然 Mysql 会主动转化范例,代码依旧可以正常运行。但是当范例不一样时,有大概会出现一些性能问题

    • SQL注入问题:预编译SQL不存在SQL注入的问题,$则有

      • 什么是SQL注入问题:当参数中有SQL语句,大概会把这个语句当做SQL实行。
      • 示例:如【select * from bookinfo bookName = ‘’ or 1 = ‘1’]】,实际需求是要找bookName为【'or 1 = '1】的数据,但由于前后引号闭合了,or直接作为SQL语句实行,最终出现了bug



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表