目录
1.输入输出映射
(1)parameterType(输入类型)
1)传递简单类型
传递简单的类型也就是基本数据类型,在Mybatis框架(1)中有演示
2)传递pojo对象
也就是在输入类型中输入了pojo类,在Mybatis框架(1)中有演示
3)传递pojo包装对象
pojo的包装对象的意思就是在一个对象中包含了一个pojo的类作为属性的存在
新建包装pojo对象QueryVo,里面的user就是一个pojo类
/**
* 包装pojo
* @author Steven
*/
public class QueryVo {
//用户对象
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
映射文件与sql
<!-- 1、resultType:如果要返回数据集合,只需设定为每一个元素的数据类型
2、 包装的pojo取值通过 "."来获取 -->
<select id="getUserByQueryVo" parameterType="queryvo" resultType="com.itheima.mybatis.pojo.User">
<!-- SELECT * FROM USER WHERE username LIKE #{name} -->
SELECT * FROM USER WHERE username LIKE '%${user.username}%'
</select>
编写接口
测试
(2)resultType(输出类型)
1)输出简单类型
这里的select count(1)和select count(*)的区别在于第一种在使用的时候不需要打印表结构所以速度会比较快
<!-- 查询用户总记录数,演示返回简单类型 -->
<select id="getUserCount" resultType="int">
SELECT COUNT(1) FROM USER
</select>
其它步骤跟前面类似,添加接口方法与测试方法,完成测试。
2)输出pojo对象
与上面类似
3)输出pojo列表
与上面类似
(3)输出resultMap
演示基于完成订单列表的查询,由表中列名user_id字段与pojo属性不一致时引出的resultMap。
其它步骤跟前面类似,添加接口方法与测试方法,完成测试。
2.动态sql
(1)if
演示基于完成用户列表查询功能,由多查询条件拼装引出if标签。
其它步骤跟前面类似,添加接口方法与测试方法,完成测试。
(2)where
注意:这里使用了where标签之后就不能继续加上where,不然会报错
其它步骤跟前面类似,添加接口方法与测试方法,完成测试。
(3)foreach
实体类
这里有一个比较方便的对于集合的写法Arrays.asList(1,25,29,30,35),这里的话可以一次性将元素放入集合中
3.sql片段
这里是对于sql片段的抽取
这里是将抽取的sql片段引入
其它步骤跟前面类似,添加接口方法与测试方法,完成测试。
4.关联查询
(1)普通查询
1)方法一,使用resultType
新建OrderUser的pojo,继承自Order
package com.itheima.mybatis.pojo;
import java.util.Date;
/**
* 订单关联用户的pojo
* @author Steven
*
*/
public class OrderUser extends Order {
private String username;// 用户姓名
private String address;// 地址
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "OrderUser [username=" + username + ", address=" + address + ", getId()=" + getId() + ", getUserId()="
+ getUserId() + ", getNumber()=" + getNumber() + ", getCreatetime()=" + getCreatetime() + ", getNote()="
+ getNote() + "]";
}
}
修改order的映射文件,新增查询方法getOrderUser。
其它步骤跟前面类似,添加接口方法与测试方法,完成测试。
2)方法二,使用resultMap
一对一关联
改造order的pojo
注意我们这里的dep类的列分别是uuid,tele,和name,因为我们这里的两个表列的名字相同,如果用相同名字的话会
默认查询第一个表的属性,所以我们要在column中将名字改为别名,别名我们可以随意取,但是要和我们查询的别名相同
这种写法就是将一对一的利用查询直接进行赋值,select = "com......" ,这个表示使用什么进行查询,column表示的是这个方法所传入的参数,也就是findOrderAndUserByLazyloading中的其中一个数作为参数传入到finUserById这个方法中当参数,进行查询,也就是将findOrderAndUserByLazyloading查询到的结果中的user_id当做参数传递进去,最终将查询到的结果传给user这个属性
其它步骤跟前面类似,添加接口方法与测试方法,完成测试。
(2)一对多关联
改造user的pojo
修改user的映射文件
其它步骤跟前面类似,添加接口方法与测试方法,完成测试。
(3)自关联查询
5.Mybatis整合Spring
(1)整合思路
- SqlSessionFactory对象应该放到spring容器中作为单例存在。sqlsession是多例的存在
- 传统dao的开发方式中,应该从spring容器中获得sqlsession对象。
- Mapper代理形式中,应该从spring容器中直接获得mapper的代理对象。
- 数据库的连接以及数据库连接池事务管理都交给spring容器来完成。
(2)整合步骤
1.创建一个java工程。
2.导入jar包。(课前资料中mybatis与spring整合所有包)
3.mybatis的配置文件sqlmapConfig.xml
4.编写Spring的配置文件
1)数据库连接及连接池
2)sqlsessionFactory对象,配置到spring容器中
3)编写Spring的配置文件
5.复制jdbc.properties配置文件到新工程
6.复制log4j.properties配置文件到新工程
(3)Dao开发
1)复制user的pojo到新工程
2)传统Dao开发
1.复制user.xml到新工程,并修改,只留下要测试的三个方法
2.在SqlMapConfig.xml加载user.xml
3.复制UserDao接口到新工程,并修改,只留下要测试的三个方法
4.编写UserDaoImpl实现类,关键是继承SqlSessionDaoSupport
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
@Override
public User getUserById(Integer id) {
SqlSession sqlSession = super.getSqlSession();
//查询用户
User user = sqlSession.selectOne("user.getUserById", id);
//不能关闭SqlSession
//sqlSession.close();
return user;
}
@Override
public List<User> getUserByUserName(String name) {
SqlSession sqlSession = super.getSqlSession();
List<User> list = sqlSession.selectList("user.getUserByName", name);
//不能关闭SqlSession
return list;
}
@Override
public void insertUser(User user) {
SqlSession sqlSession = super.getSqlSession();
sqlSession.insert("user.insertUser", user);
//不用手动提交事务,交给spring
}
}
5.在applicationContext.xml中配置UserDaoImpl实现类
6.编写测试类,新建单元测试
package com.itheima.mybatis.test;
import static org.junit.Assert.fail;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.itheima.mybatis.dao.UserDao;
import com.itheima.mybatis.pojo.User;
public class UserDaoTest {
private ApplicationContext applicationContext;
@Before
public void init(){
applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
}
@Test
public void testGetUserById() {
UserDao userDao = applicationContext.getBean(UserDao.class);
User user = userDao.getUserById(30);
System.out.println(user);
}
@Test
public void testGetUserByUserName() {
fail("Not yet implemented");
}
@Test
public void testInsertUser() {
fail("Not yet implemented");
}
}
3)Mapper代理模式开发Dao
- 复制UserMapper.xml到新工程,并修改,只留下要测试的三个方法
- 复制UserMapper接口到新工程,并修改,只留下要测试的三个方法
- 配置Mapper
(1)单个接口配置MapperFactoryBean
(2)配置包扫描器
测试
package com.itheima.mybatis.test;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.itheima.mybatis.mapper.UserMapper;
import com.itheima.mybatis.pojo.User;
public class UserMapperTest {
private ApplicationContext applicationContext;
@Before
public void init() {
applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
}
@Test
public void testGetUserById() {
UserMapper userMapper = applicationContext.getBean(UserMapper.class);
User user = userMapper.getUserById(30);
System.out.println(user);
}
@Test
public void testGetUserByUserName() {
fail("Not yet implemented");
}
@Test
public void testInsertUser() {
fail("Not yet implemented");
}
}