文章目录
一 parameterType(输入类型)
1.传递简单类型
2.传递pojo对象,Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。
3.包装的pojo:对象里面还有对象
3.1代码实现
public class QueryVo {
//包装user 包装的pojp
// 对象里面还有对象
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
<!-- 传递包装类的pojo -->
<select id="getUserByQueryVo" parameterType="queryvo" resultType="User">
SELECT * FROM `user`
WHERE username LIKE '%${user.username}%'
</select>
/**
* 传递包装的pojo
* 返回值为User,输入的参数queryvo
*/
List<User> getUserByQueryVo(QueryVo vo);
@Test
public void testGetUserByQueryVo() {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
QueryVo vo = new QueryVo();
User user2 = new User();
user2.setUsername("张");
vo.setUser(user2);
List<User> list = mapper.getUserByQueryVo(vo);
for (User user : list) {
}
sqlSession.close();
}
二、 数据库元素名称与配置文件的标签名称不一致
使用resultMap标签
下面的别名配置单表查询时只需配置别名不一样的元素即可
多表查询时需要全部配置
<!-- resultMap入门
type:映射成的pojo类型
id:resultMap唯一标识
-->
<resultMap type="order" id="orderMap">
<!-- id标签用于绑定主键 -->
<!-- <id property="id" column="id"/> -->
<!-- 使用result绑定普通字段 -->
<result property="userId" column="user_id"/>
<result property="number" column="number"/>
<result property="createtime" column="createtime"/>
<result property="note" column="note"/>
</resultMap>
<!-- 使用resultMap -->
<select id="getOrderListResultMap" resultMap="orderMap">
SELECT * FROM `order`
</select>
三、动态sql语句
1.if标签
<!-- 演示动态sql-if标签的使用情景 -->
<select id="getUserByWhere" parameterType="user" resultType="com.mybatis.pojo.User">
<!-- SELECT * FROM USER WHERE username LIKE '%${username}%' and id = #{id} -->
SELECT * FROM USER where 1 = 1
<!-- if标签的使用 -->
<if test="id != null">
and id = #{id}
</if>
<if test="username != null and username != ''">
and username LIKE '%${username}%'
</if>
</select>
2.where标签
<select id="getUserByWhere2" parameterType="user"
resultType="com.itheima.mybatis.pojo.User">
<!-- include:引入sql片段,refid引入片段id -->
SELECT
*
FROM USER
<!-- where会自动加上where同处理多余的and -->
<where>
<!-- if标签的使用 -->
<if test="id != null">
and id = #{id}
</if>
<if test="username != null and username != ''">
and username LIKE '%${username}%'
</if>
</where>
</select>
fore 标签
需要一个集合,在包装类中定义一个list集合 ,并且创建set,get方法
foreach循环标签
~~删除线格式~~ collection:要遍历的集合,来源入参
open:循环开始前的sql
item:设置循环变量
separator:分隔符
close:循环结束拼接的sql
#{uid}:占位符的方式来输出uId
<select id="getUserByIds" parameterType="queryvo"
resultType="com.mybatis.pojo.User">
SELECT
*FROM USER
<!-- where会自动加上where同处理多余的and -->
<where>
<!-- id IN(1,10,25,30,34) -->
<!-- foreach循环标签
collection:要遍历的集合,来源入参
open:循环开始前的sql
item:设置循环变量
separator:分隔符
close:循环结束拼接的sql
#{uid}:占位符的方式来输出uId
-->
<foreach item="uid" collection="ids" open="id IN(" separator=","
close=")">
#{uid}
</foreach>
</where>
</select>
public void testGetUserByIds() {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
QueryVo vo = new QueryVo();
vo.setIds(Arrays.asList(22,26,28,31));
List<User> list = userMapper.getUserByIds(vo);
for (User user : list) {
System.out.println(user);
}
sqlSession.close();
}
四、关联查询
1.一对一查询
1.创建查询语句映射表
类似于pojo的传参方式
2.resultmap
1.在order表中添加,目的是连表查询的时候进行输出用户表信息
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
2.配置resultmap
记住id
<!--type:映射的pojo -->
<resultMap type="order" id="order_user_map">
<!-- 主键映射 -->
<id property="id" column="id"/>
<!--普通字段使用result进行映射 -->
<result property="userId" column="user_id"/>
<result property="number" column="number"/>
<result property="createtime" column="createtime"/>
<result property="note" column="note"/>
<!--
association用于配置一对一对应关系
property里面的是order传入User属性
Javatype:user的数据类型,支持别名-->
<association property="user" javaType="pojo.User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
<result property="birthday" column="birthday"/>
<result property="sex" column="sex"/>
</association>
</resultMap>
3.配置数据库查询语句
<!-- 一对一关联查询,resultMap -->
<select id="getOrderUserMap" resultMap="order_user_map">
SELECT
o.id,
o.user_id,
o.number,
o.note,
o.createtime,
u.username,
u.address,
u.birthday,
u.sex
from
`order` o
LEFT JOIN `user` u
On u.id = o.user_id
</select>
4.进行Junit测试
2.一对多查询
collection用于配置一对多关联查询
property:User里面的order属性
ofType:Order的数据类型,即使order.java文件 ,支持别名
1.因为是一对多的原因,所以在user表中返回的是order集合
*/
private List<Order> orders;
public List<Order> getOrder() {
return orders;
}
public void setOrder(List<Order> order) {
this.orders = order;
}
2.配置resultmap
<resultMap type="user" id="user_order_map">
<!-- 配置主键映射 -->
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="birthday" column="birthday"/>
<result property="sex" column="sex"/>
<result property="address" column="address"/>
<!-- 设置User里面的order属性 :order 为集合属性 -->
<collection property="orders" ofType="pojo.Order">
<id property="id" column="oid"/>
<result property="userId" column="id"/>
<result property="number" column="number" />
<result property="createtime" column="createtime"/>
<result property="note" column="note"/>
</collection>
</resultMap>
3.配置数据库查询语句
<select id="getUserOrderMap" resultMap="user_order_map">
SELECT
u.id,
u.username,
u.birthday,
u.sex,
u.address,
o.id oid,
o.number,
o.createtime,
o.note
FROM `user` u
LEFT JOIN `order` o ON o.user_id = u.id
</select>
4.测试
在进行遍历时要进行双重遍历
首先遍历user表
再在user表中进行fore循环
for(Order order : user.getOrder){
·· 此时还需判断 order.id是否为空值
}
五、mybatis整合spring
1.整合步骤
- 创建一个java工程。
- 导入jar包。(课前资料中mybatis与spring整合所有包)
- mybatis的配置文件sqlmapConfig.xml
- 编写Spring的配置文件
(1)数据库连接及连接池
(2)sqlsessionFactory对象,配置到spring容器中
(3) 编写Spring的配置文件 - 复制jdbc.properties配置文件到新工程
- 复制log4j.properties配置文件到新工程
1.
<!-- 数据库连接及连接池 -->
<!-- 数据库连接池 -->
<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对象,配置到spring容器中 -->
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean.class">
<!-- 加载mybatis核心配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml"/>
<!-- 指向上面的数据连接 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置比名包扫描 -->
<property name=""></property>
</bean>
2.传统dao
1. 复制user.xml到新工程,并修改,只留下要测试的三个方法
2. 在SqlMapConfig.xml加载user.xml
3. 复制UserDao接口到新工程,并修改,只留下要测试的三个方法
4. 编写UserDaoImpl实现类,关键是继承SqlSessionDaoSupport
5.
3.mapper代理模式开发dao
- 复制UserMapper.xml到新工程,并修改,只留下要测试的三个方法
- 复制UserMapper接口到新工程,并修改,只留下要测试的三个方法
- 配置Mapper
- 单个接口配置MapperFactoryBean
<!-- 动态代理Dao开发,第一种方式 -MapperFactoryBean -->
<bean id="baseMapper" class="org.mybatis.spring.mapper.MapperFactoryBean" abstract="true" lazy-init="true">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<!-- 用户动态代理扫描 -->
<bean parent="baseMapper">
<property name="mapperInterface" value="com.itheima.mybatis.mapper.UserMapper" />
</bean>
- 配置包扫描器
<!-- 动态代理Dao开发,第一种方式,包扫描器(推荐使用) -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- basePackage:配置映射包装扫描,多个包时用","或";"分隔 -->
<property name="basePackage" value="com.itheima.mybatis.mapper" />
</bean>
- 测试
public class UserMapperTest {
private ApplicationContext applicationContext;
@Before
public void init(){
applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void testGetUserById() {
UserMapper userMapper = applicationContext.getBean(UserMapper.class);
User user = userMapper.getUserById(10);
System.out.println(user);
}