Day1
MyBatis获取参数值的各种情况:
MyBatis获取参数值的两种方式:${} #{} * ${} 本质:字符串拼接 * #{} 本质:占位符赋值 * MyBatis获取参数值的各种情况: * 1.mapper接口方法的参数为单个的字面量类型: * 可以通过${}和#{}以任意的字符串获取参数值,但是需要注意${}的单引号问题 * 2.mapper接口方法的参数为多个时: 此时MyBatis会将这些参数放在一个map集合中,以两种方式进行存储 a>.以arg0,arg1....为键,以参数为值 b>.以param1,param2....为键,以参数为值 因此只需要通过#{}和${}以键的方式访问值即可,但是需要注意${}的单引号问题 3.若mapper接口方法的参数有多个时,可以手动将这些参数放在一个map集合中存储: 只需要通过#{}和${}以键的方式访问值即可,但是需要注意${}的单引号问题
4.mapper接口方法的参数的实体类类型的参数:
只需要通过#{}和${}以属性的方式访问属性值即可,但是需要注意${}的单引号问题
5.使用@Param注解命名参数
a>.以@Param注解的值为键,以参数为值
b>.以param1,param2...为键,以参数为值
只需要通过#{}和${}以属性的方式访问属性值即可,但是需要注意${}的单引号问题
以上总结:
以上五种方式可以整合为两种方式:
一:@Param注解方式
二:参数为实体类类型
MyBatis、配置核心配置文件
<?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 resource="jdbc.properties"/>
<!-- 设置MyBatis的全局配置-->
<settings>
<!-- 将_自动映射为驼峰 emp_name ==> empName-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 开启延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
<!-- 设置类型别名 不设置alias时,默认类型别名为类名-->
<typeAliases>
<package name="org.example.mybatis.pojo"/>
</typeAliases>
<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>
</environments>
<!-- 引入映射文件-->
<mappers>
<!-- <mapper resource="org/mybatis/example/BlogMapper.xml"/>-->
<!-- 以包为单位引入映射文件-->
<!-- 要求:-->
<!-- 1.mapper接口所在的包要和映射文件所在的包一致-->
<!-- 2.mapper接口要和映射文件从名字一致-->
<package name="org.example.mybatis.mapper"/>
</mappers>
</configuration>
MyBatis的各种查询功能:
1.若查询出的数据只有一条
a>.可以通过实体类对象
b>.可以通过list集合接收
c>.可以通过Map集合接收,结果:{password=111, sex=男, id=3, age=23, email=123@qq.com, username=admin}
2.若查询出的数据有多条
a>.可以通过list集合接收
b>.可以通过map类型的List集合接收
c>.可以再mapper接口的方法上添加@MapKey注解,此时就可以将每条数据转换的map集合作为值,以某个字段的值作为键,放在同一个map集合中
注意:但一定不能通过实体类对象接收,此时会抛出异常TooManyResultsException
MyBatis中设置了默认的类型别名
java.lang.Integer-->int,integer
int-->_int,integer
Map-->map
String-->String
特殊SQL的执行
1.模糊查询
2.批量删除
注意:不能使用#{},因为#{}会自动加单引号'',在SQL语句中是不正确的
3.动态设置表名 注意:不能使用#{},因为#{}会自动加单引号'',在SQL语句中是不正确的
添加功能获取自增的主键
userGeneratedKey
- 在mapper.xml中设置两个属性
- useGeneratedKeys:设置使用自增的主键
* keyProperty:将自增的主键的值赋值给映射文件中参数的某个属性中。
因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中
resultMap:设置自定义映射关系 (多用于处理多对一,一对多的映射关系) id:唯一标识,不能重复 type:设置映射关系中的实体类类型 子标签: id:设置主键的映射关系 result:设置普通字段的映射关系 属性: property:设置映射关系中的属性名,必须是type属性所设置的实体类类型中的属性名 column:设置映射关系中的字段名,必须是sql语句查询出的字段名
处理多对一映射方式一:级联属性赋值
处理多对一映射方式二:association
处理多对一映射方式三:分步查询
处理一对多映射方式一:
处理一对多映射方式二:分步查询
延迟加载
MyBatis的缓存:(默认一级缓存)
MyBatis整合第三方缓存EHCache
<!-- MyBatis EHCache整合包-->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.2.1</version>
</dependency>
<!-- slf4j日志门面的一个具体实现-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- 指定日志输出的位置 -->
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 日志输出的格式 -->
<!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行 -->
<pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
</encoder>
</appender>
<!-- 设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR -->
<!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 -->
<root level="DEBUG">
<!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender -->
<appender-ref ref="STDOUT" />
</root>
<!-- 根据特殊需求指定局部日志级别 -->
<logger name="com.atguigu.crowd.mapper" level="DEBUG"/>
</configuration>