查询
resultType使用
当数据库返回的结果集中的字段和实体类中的属性名一一对应时, resultType可以自动将结果封装到实体中
resultMap使用
当数据库返回的结果集中的字段和实体类中的属性名存在不对应情况时,可以使用 resultMap 自定义映射关系
面试题: resultType和resultMap使用区别
单条件查询
多条件查询
模糊查询
面试题:#和$的区别
- #表示占位符, 相当于JDBC中的?, 底层工作的是PreparedStetement对象, SQL只编译一次, 而且没有SQL注入问题
- $ 表示字符串拼接, 底层工作的是Statement对象, 每次SQL都会重新编译, 而且存在SQL注入问题
返回主键
向数据库保存一个用户后, 然后在控制台记录下此用户的主键值(id)
动态SQL
在Mybatis中,动态SQL是通过下面几个标签来实现的:
- if,choose 用于条件判断
- where,set 用于格式控制
- foreach 用于循环遍历
if
- if标签用于单分支条件判断, 相当于java中的if关键字
- where标签作用:
- 当where代码块中的条件都不成立的时候, where代码块不生效
- 当where代码块中的条件至少有一个成立的时候
在代码块之前加入一个where关键字
当代码块以and | or开头的时候,它会帮你去掉第一个and | or
choose
- choose 用于包含多个条件
- when 用于编写某个条件
- otherwise所有的when都判断失败时,进入此分支
set
- set标签的作用:
- 在代码块之前加入一个set关键字
- 删除掉代码块中的最后一个,
- set代码块中至少要有一个条件是成立
foreach
-
foreach 循环遍历
collection=“collection” 指定要遍历的集合或者数组
item=“item” 指定临时变量
separator=“,” 指定分隔符
open=“(” 指定开始字符
close=“)” 指定结束字符 -
collection会根据传入参数的类型不同而采用不同的值
集合—collection
数组—array
实体—实体的属性
sql片段
sql片段的作用是将代码中重复的sql,提取出来达到复用的目的
- 定义SQL片段:
<sql id="selectUser"></sql>
- 引用SQL片段:
<include refid="selectUser"></include>
配置文件
- sqlMapConfig.xml 此文件中的标签有严格的顺序要求, 可以省略一部分, 但是不能乱序
- 主要选项
properties: 引入外部的properties文件
typeAlias: 给映射文件中实体类起别名
environments: 用于配置数据库连接信息和事务管理器
mappers: 用于引入映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引入一个properties的配置文件-->
<properties resource="jdbc.properties" />
<!--别名: 应用在映射文件中-->
<typeAliases>
<!--type 指定原始类型 alias 指定别名-->
<!--<typeAlias type="com.itheima.domain.User" alias="user" />-->
<!--指定一个包名: 只要是在这个包之下的类,都会自动产生一个别名, 规则就是类名首字母消息-->
<package name="com.itheima.domain"/>
</typeAliases>
<!--
环境: environments 可以配置多个数据库配置
default 用于指定使用哪个环境
-->
<environments default="development">
<!--配置开发环境-->
<environment id="development">
<!--事务管理器-->
<transactionManager type="JDBC"/>
<!--数据源-->
<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>
<!--配置测试环境-->
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="测试驱动"/>
<property name="url" value="测试数据库连接"/>
<property name="username" value="测试用户名"/>
<property name="password" value="测试密码"/>
</dataSource>
</environment>
</environments>
<!--导入sql映射文件-->
<mappers>
<!--方式1: 直接导入映射文件(了解)-->
<!--<mapper resource="mappers/UserMapper.xml"/>-->
<!--方式2: 写接口路径-->
<!--<mapper class="com.itheima.mapper.UserMapper" />-->
<!--方式3: 直接写mapper接口所在的包(保证最后Mapper接口和Mapper.xml会编译到同一个目录下,并且名字一致)-->
<package name="com.itheima.mapper"/>
</mappers>
</configuration>
注解
使用注解书写SQL其实是对使用XML书写SQL的一种替代方式,其功能基本一致。
两种方式各有优缺点, 没有谁好谁坏之分, 具体看公司选择
在一个项目中是允许xml和注解混用的,但是对于同一个方法来讲,只能使用一种形式
非动态sql,使用注解简单写 但是对于动态sql,xml就相对简单了