MyBatis最佳实践:参数详解

ops/2025/1/23 13:19:53/

第一章:MyBatis 参数详解

  1. parameterType:
    1. 简单数据类型:
      1. int  double  String  Long
    2. 简单的写法:
      1. Java.lang.Integer ==> int、Int、integer、Integer 都可以,框架提供简写的方式
    3. POJO(JavaBean 实体类):对象类型,默认是不能简写,可以配置 User 对象。
    4. POJO 包装对象类型:
      1. 包含更多的实体类:
        java">public class QueryVo implements Serializable {//自己属性private String name;//user 属性private User user;//role 属性private Role role;public String getName() {return name;}public void setName(String name) {this.name = name;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public Role getRole() {return role;}public void setRole(Role role) {this.role = role;}}//------------------------
        //测试包装类查询:
        public List<User> findByVo(QueryVo vo);//------------------------
        <!-- 包装类测试 -->
        <select id="findByVo" resultType="com.qcby.model.User" parameterType="com.qcby.model.QueryVo">select * from user where username = #{user.username}
        </select>
  2. resultType:
    1. 返回简单数据类型:
      1. int  double  long  String
    2. 返回 POJO 数据类型:
      1. 返回 User 对象类型
  3.  关联映射:
    1. 返回类型为 resultMap 映射结果集返回
    2. 创建映射结果集,设置返回类型:
      1. <result/> 实体类和数据库关联字段进行映射
      2. 复杂属性单独处理:
        1. association:处理对象
          1. javaType:标明对象类型
        2. collection:处理集合
          1. ofType:标明对象​​​​​​​
  4. resultMap 结果类型:
    1. resultType 可以指定 pojo 将查询结果映射为 pojo,但需要 pojo 的属性名和 SQL 查询的列名一致方可映射成功
    2. 如果 SQL 查询字段名和 pojo 的属性名不一致,可以通过 resuletMap 将字段名和属性名做一个对应关系,resultMap 实质上还需要将查询结构映射到 pojo 对象中
    3. resultMap 可以实现将查询结构映射为复杂类型的 Pojo,比如现在查询结果映射对象中包括 Pojo 和 list 实现一对一和一对多查询。
      <!-- 配置 resultMap,用来进行数据封装id="唯一的名称,用来被引用的唯一标识"type="进行封装数据的类型"
      -->
      <resultMap id="userMap" type="com.qcby.model.User"><!-- property="JavaBean 中的属性"--><!-- colum="表中的字段"--><result property="id" column="id"/><result property="username" column="_username"/><result property="birthday" column="_birthday"/><result property="sex" column="_sex"/><result property="address" column="_address"/>
      </resultMap><!-- 演示 resultMap 配置 -->
      <select id="findUsers" resultMap="userMap">select id _id,username _username,birthday _birthday,sex _sex,address _address from user
      </select> 
  5. #{} 和 $ value} 符号:
    1. ${value}:数据拼接,在本地 SQL 语句进行拼接(会有SQL 注入问题)
    2. #{}:占位符 ==> 被编译成占位符  ?
    3. 两者的选择:
      1. 能用 #{} 就用 #{},尽量少用 ${}
      2. 当数据作为参数,或者 order by 排序时用 ${}
      3. 传参时参数使用  @Param 注解,
      4. 正确的将参数传入 SQL 语句中,一般通过 #{} 的方式,${} 会有 SQL 注入的问题

第二章:SqlMapConfig.xml 配置文件

  1. 定义 properties 标签的方式管理数据库的信息
    1. 把数据库的信息定义 property 标签中的方式
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration><!-- 配置具体的环境 --><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"></transactionManager><!-- 配置是否需要使用连接池, POOLED 使用,UNPOOLED 不适用--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///mybatis_demo"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 加载映射的配置文件 --><mappers><mapper resource="Mapper/UserMapper.xml"/></mappers></configuration>
    2. 在项目中定义 jdbc.properties 属性文件,存储数据库相关的信息,统一管理:
      1. jdbc.properties 属性文件
        jdbc.driver=com.mysql.jdbc.Driver
        jdbc.url=jdbc:mysql:///mybatis_demo
        jdbc.username=root
        jdbc.password=root
      2. SqlMapConfig.xml 的配置文件
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
        <configuration><!-- 读取外部的配置文件resource:文件的相对路径写法--><properties resource="jdbc.properties"></properties><!-- 配置具体的环境 --><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"/><!-- 配置是否需要使用连接池, POOLED 使用,UNPOOLED 不适用--><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!-- 加载映射的配置文件 --><mappers><mapper resource="Mapper/UserMapper.xml"/></mappers></configuration>
  2. 类型别名定义:
    1. MyBatis 自己有类型别名的注册类,编写 int 或者 integer 通过注册可以找到 java.lang.Integer
    2. 也可以自己进行别名的注册:
      <!-- 定义别名 --><typeAliases><!-- 把com.qcby.model.User 使用 user 别名来显示,别名 user User USER 都可以,默认是忽略大小写的 -->
      <!--        <typeAlias type="com.qcby.model.User" alias="user"/>--><!-- 针对com.qcby.model 包下的所有的类,都可以使用当前的类名作为别名 --><package name="com.qcby.model"/></typeAliases>
    3. UserMapper.xml 的配置文件使用别名:
      <!-- ersultType="com.com.qcby.model.User"  全路径形式 -->
      <!-- ersultType="user" 别名形式 -->
      <select id="findById" resultType="user">select * from user where id=#{id};
      </select>
  3. MyBatis 连接池的分类:
    1. MyBatis 内置了连接池技术,dataSource 标签的 type 属性有 3 个取值
      1. POOLED:使用连接池
      2. UNPOOLED:不适用连接池
      3. JNDI:使用  JNDI 实现连接池

http://www.ppmy.cn/ops/152476.html

相关文章

win暂停更新设置

暂停更新 Windows Registry Editor Version5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings] "FlightSettingsMaxPauseDays"dword:00001b58 "PauseFeatureUpdatesStartTime""2023-07-07T10:00:52Z" "PauseFeatureU…

【玩转全栈】----Django模板的继承

先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01; 目录 模板继承的好处 模板继承的语法规则 更新代码 上文中的部门管理页面&#xff1a; 【玩转全栈】----Django制作部门管理页面-CSDN博客 大家会发现&#xff0c;由于定义了多个html文件&#xff0c;多个ht…

EF Core 乐观、悲观并发控制

目录 并发控制的概念 悲观并发控制 实现 问题 乐观并发控制 实现 RowVersion 实体类及配置 概念 总结 并发控制的概念 并发控制&#xff1a;避免多个用户同时操作资源造成的并发冲突问题。举例&#xff1a;统计点击量。最好的解决方案&#xff1a;非数据库解决方案。…

IJCAI-2024 | 具身导航的花样Prompts!VLN-MP:利用多模态Prompts增强视觉语言导航能力

作者&#xff1a; Haodong Hong1,2 , Sen Wang1∗ , Zi Huang1 , Qi Wu3 and Jiajun Liu2,1 单位&#xff1a;昆士兰大学&#xff0c;澳大利亚科学与工业研究组织&#xff0c;阿德莱德大学 论文标题&#xff1a;Why Only Text: Empowering Vision-and-Language Navigation wi…

maven常见知识点

1、maven是什么&#xff1f; maven是Java的包管理工具&#xff0c;因为java包太多了&#xff0c;使用工具统一管理。 2、引入同一个包时使用哪个&#xff1f; 会遵循 路径最短优先 和 声明顺序优先 两大原则。解决这个问题的过程也被称为 Maven 依赖调解。 3、什么是 POM&…

Netty搭建websocket服务器,postman可以连接,浏览器无法连接

简介&#xff1a;Netty搭建websocket服务器&#xff0c;postman可以连接&#xff0c;浏览器无法连接&#xff0c;很奇怪&#xff0c;不知道为什么。最后更换端口解决问题&#xff0c;原来端口时6666&#xff0c;把6666改成其他端口就可以了。 过程&#xff1a; 前端代码 后端…

MySQL——主从同步

提醒&#xff1a;进行配置时&#xff0c;需要确保一主两从的操作系统、MySQL版本一致&#xff0c;否则将出现问题 环境介绍 服务器IP主服务器172.25.254.10从服务器-1172.25.254.11从服务器-2172.25.254.12 配置 # 快速配置&#xff0c;选择多重执行&#xff0c;确保版本一…

docker load报错(unexpected EOF)

今天解决了一个困扰我2天的问题&#xff0c;那就是docker load 失败&#xff0c;背景是这样的&#xff0c;同事离职交接给我一个基础docker镜像文件&#xff0c;大约600M&#xff0c;然后我把这个文件拖到Centos7虚拟机中&#xff0c;然而docker load的时候报错了&#xff0c;错…