目录:
- 输入映射和输出映射
- 输入参数映射
- 返回值映射
- 动态sql
- If标签
- Where标签
- Sql片段
- Foreach标签
- 关联查询
- 一对一关联
- 一对多关联
- Mybatis整合spring
- 如何整合spring
- 使用原始的方式开发dao
- 使用Mapper接口动态代理
Mybatis逆向工程(了解)
2.1parameterType(输入类型)
- 传递简单类型
参考第一天内容。使用#{}占位符,或者${}进行sql拼接。
- 传递pojo对象
参考第一天的内容。Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。
- 传递pojo包装对象
开发中通过可以使用pojo传递查询条件。
查询条件可能是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如查询用户信息的时候,将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。
包装对象:Pojo类中的一个属性是另外一个pojo。
需求:根据用户名模糊查询用户信息,查询条件放到QueryVo的user属性中。
1)编写QueryVo
2)Mapper.xml文件
3)Mapper接口
4)测试方法
2.2 resultType(输出类型)
- 输出简单类型
需求:查询用户表数据条数
1)Mapper.xml文件
2)Mapper接口
3).测试方法
- 输出pojo对象
- 输出pojo列表
2.3 resultMap
resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
需求:查询订单表order的所有数据
2.3.1声明pojo对象
2.3.2 Mapper.xml文件
创建OrderMapper.xml配置文件,如下:
2.3.3 Mapper接口
2.3.4测试方法
3.动态sql
通过mybatis提供的各种标签方法实现动态拼接sql。
需求:根据性别和名字查询用户
3.1. If标签
3.2. Where标签
3.1.1. Mapper.xml文件
UserMapper.xml配置sql,如下:
3.1.2. Mapper接口
编写Mapper接口,如下图:
3.1.3. 测试方法
3.3. Sql片段
Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。
把上面例子中的id, username, birthday, sex, address提取出来,作为sql片段,如下:
如果要使用别的Mapper.xml配置的sql片段,可以在refid前面加上对应的Mapper.xml的namespace
3.4. foreach标签
向sql传递数组或List,mybatis使用foreach解析,如下:
根据多个id查询用户信息
3.4.1. 改造QueryVo
3.4.2. Mapper.xml文件
3.4.3 Mapper接口
3.4.4测试方法
4. 关联查询
4.1. 商品订单数据模型
4.2. 一对一查询
需求:查询所有订单信息,关联查询下单用户信息。
注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。
4.2.1使用resultMap
使用resultMap,定义专门的resultMap用于映射一对一查询结果。
4.2.1.1. 改造pojo类
在Order类中加入User属性,user属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息。
改造Order如下图:
4.2.1.2. Mapper.xml
这里resultMap指定orderUserResultMap,如下:
4.2.1.3. Mapper接口
编写UserMapper如下图:
4.2.1.4测试方法
4.3. 一对多查询
案例:查询所有用户信息及用户关联的订单信息。
用户信息和订单信息为一对多关系。
4.3.1. 修改pojo类
4.3.2. Mapper.xml
4.3.3. Mapper接口
4.3.4. 测试方法
5. Mybatis整合spring
5.1. 整合思路
- SqlSessionFactory对象应该放到spring容器中作为单例存在。
- 传统dao的开发方式中,应该从spring容器中获得sqlsession对象。
- Mapper代理形式中,应该从spring容器中直接获得mapper的代理对象。
- 数据库的连接以及数据库连接池事务管理都交给spring容器来完成。
5.2. 整合需要的jar包
- spring的jar包
- Mybatis的jar包
- Spring+mybatis的整合包。
- Mysql的数据库驱动jar包。
- 数据库连接池的jar包。
5.3. 整合的步骤
5.3.1. 创建工程
5.3.2. 导入jar包
5.3.3. 加入配置文件
5.3.3. 加入配置文件
- mybatisSpring的配置文件
- 的配置文件sqlmapConfig.xml
- 数据库连接及连接池
- 事务管理(暂时可以不配置)
- sqlsessionFactory对象,配置到spring容器中
- mapeer代理对象或者是dao实现类配置到spring容器中。
5.3.3.1. SqlMapConfig.xml
5.3.3.2. applicationContext.xml
SqlSessionFactoryBean属于mybatis-spring这个jar包
对于spring来说,mybatis是另外一个架构,需要整合jar包。
在项目中加入mybatis-spring-1.2.2.jar的源码,如下图
applicationContext.xml,配置内容如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="10" />
<property name="maxIdle" value="5" />
</bean>
<!-- 配置SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置mybatis核心配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<!-- 配置数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 原始Dao -->
<bean id="userDao" class="com.itheima.mybatis.dao.impl.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<!-- Mapper动态代理开发 -->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
<property name="mapperInterface" value="com.itheima.mybatis.mapper.UserMapper"/>
</bean>
<!--Mapper动态代理开发 扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 导入基本包 -->
<property name="basePackage" value="com.itheima.mybatis.mapper"/>
</bean>
</beans>
5.3.3.3. db.properties
5.3.3.4. log4j.properties
5.3.3.5. 效果:
加入的配置文件最终效果如下:
5.4. 原始Dao的开发
两种dao的实现方式:
- 原始dao的开发方式
- 使用Mapper代理形式开发方式
- 直接配置Mapper代理
- 使用扫描包配置Mapper代理
需求:
- 实现根据用户id查询
- 实现根据用户名模糊查询
- 添加用户
5.4.1. 创建pojo
5.4.2. 传统dao的开发方式
原始的DAO开发接口+实现类来完成。
需要dao实现类需要继承SqlsessionDaoSupport类
5.4.2.1. 实现Mapper.xml
5.4.2.2. 加载Mapper.xml
在SqlMapConfig如下图进行配置:
5.4.2.3. 实现UserDao接口
5.4.2.4. 实现UserDaoImpl实现类
编写DAO实现类,实现类必须集成SqlSessionDaoSupport
SqlSessionDaoSupport提供getSqlSession()方法来获取SqlSession
5.4.2.5. 配置dao
把dao实现类配置到spring容器中,如下图
5.4.3. Mapper代理形式开发dao
5.4.3.1. 实现Mapper.xml
编写UserMapper.xml配置文件,如下:
5.4.3.2. 实现UserMapper接口
5.4.3.3. 方式一:配置mapper代理
在applicationContext.xml添加配置
MapperFactoryBean也是属于mybatis-spring整合包
测试方法:
5.4.3.5. 方式二:扫描包形式配置mapper
每个mapper代理对象的id就是类名,首字母小写
6. Mybatis逆向工程。。。。。。。。。。。。。。。。。。。。