package cn.itcast.test;
import cn.itcast.dao.UserMapper;
import cn.itcast.domain.User;
import cn.itcast.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Date;
import java.util.List;
public class MybatisDaoProxyTest {
private SqlSession sqlSession = null;
@Before
public void before(){
sqlSession = MybatisUtils.openSession();
}
@After
public void after(){
MybatisUtils.close(sqlSession);
}
@Test
public void testFindAll() throws Exception{
//获取代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List list = mapper.findAll();
for (User user : list) {
System.out.println(user);
}
}
@Test
public void testFindAllResultMap() throws Exception{
//获取代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List list = mapper.findAllResultMap();
for (User user : list) {
System.out.println(user);
}
}
}
1.2 多条件查询(二种)
需求
根据id和username查询user表
(1)UserMapper接口
(2)UserMapper.xml映射文件
(3)单元测试
1.3 模糊查询(四种)
需求
根据username模糊查询user表
(1)UserMapper接口
(2)UserMapper.xml映射文件
SELECT * FROM `user` WHERe username LIKE #{username}
SELECT * FROM `user` WHERe username LIKE "%" #{username} "%"
SELECT * FROM `user` WHERe username LIKE '%${value}%'
SELECT * FROM `user` WHERe username LIKE concat(concat('%',#{username}),'%')
(3)单元测试
1.4 ${}和#{}区别【面试】
第二章 Mybatis多表查询
2.1 一对一(多对一)
(1)实体类和表映射关系分析
(2)准备订单实体类
package cn.itcast.domain;
import java.util.Date;
public class Order {
private Integer id;
private Date ordertime;
private Double money;
//订单关联用户
private User user;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Date getOrdertime() {
return ordertime;
}
public void setOrdertime(Date ordertime) {
this.ordertime = ordertime;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Order{" +
"id=" + id +
", ordertime=" + ordertime +
", money=" + money +
", user=" + user +
'}';
}
}
(2)OrderMapper接口
package cn.itcast.dao;
import cn.itcast.domain.Order;
public interface OrderMapper {
public abstract Order findByIdWithUser(int id);
}
(3)OrderMapper.xml映射文件
SELECT * FROM orders o INNER JOIN `user` u ON o.`uid`=u.id WHERe o.id=#{id}
(4)测试
2.2 一对多
(1)修改user实体类,关联订单列表
package cn.itcast.domain;
import java.util.Date;
import java.util.List;
public class User {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
private List orderList;
public List getOrderList() {
return orderList;
}
public void setOrderList(List orderList) {
this.orderList = orderList;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + ''' +
", birthday=" + birthday +
", sex='" + sex + ''' +
", address='" + address + ''' +
", orderList=" + orderList +
'}';
}
}
(2)编写UserMapper接口
(3)编写UserMapper.xml映射文件
SELECT *,o.id AS oid FROM `user` u INNER JOIN orders o ON o.`uid`=u.id WHERe u.id=#{id}
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
SELECT LAST_INSERT_ID()
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
(2)UserMapper接口
(3)测试
package cn.itcast.test;
import cn.itcast.dao.UserMapper;
import cn.itcast.domain.User;
import cn.itcast.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Date;
import java.util.List;
public class MybatisDaoProxyTest {
private SqlSession sqlSession = null;
@Before
public void before(){
sqlSession = MybatisUtils.openSession();
}
@After
public void after(){
MybatisUtils.close(sqlSession);
}
@Test
public void testSave() throws Exception{
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//新增用户,返回主键方式一
User user = new User();
user.setUsername("赵云");
user.setSex("男");
user.setBirthday(new Date());
user.setAddress("河北保定");
mapper.save2(user);
System.out.println("返回新增用户的主键id是:"+user.getId());
}
}
3.2 动态SQL
什么是动态SQL
if条件判断 使用if进行判断时,只有变量类型是字符串类型才可以加上and item!=’’
需求
把id和username封装到user对象中,将user对象中不为空的属性作为查询条件
(1)UserMapper接口
(2)UserMapper.xml文件
(3)测试类
set用于update语句
需求
动态更新user表数据,如果该属性有值就更新,没有值不做处理
(1)UserMapper接口
(2)UserMapper.xml文件
(3)测试类
foreach用于循环遍历【重点】
(1)UserMapper接口
(2)UserMapper.xml文件
select * from user where id in
#{id}
select * from user where id in
#{id}
select * from user where id in
#{id}
(3)测试类
@Test
public void testFindByList() throws Exception{
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List ids = new ArrayList<>();
ids.add(41);
ids.add(42);
ids.add(43);
List userList = mapper.findByList(ids);
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void testFindByArray() throws Exception{
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int[] ids = {45,48,53};
List userList = mapper.findByArray(ids);
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void testFindByQueryVo() throws Exception{
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
QueryVo queryVo = new QueryVo();
List ids = new ArrayList<>();
ids.add(57);
ids.add(58);
ids.add(59);
queryVo.setIds(ids);
List userList = mapper.findByQueryVo(queryVo);
for (User user : userList) {
System.out.println(user);
}
}
使用foreach进行批量插入模板
trim的使用
3.3 SQL片段
应用场景
映射文件中可将重复的sql提取出来,使用时用include 引用即可,最终达到sql重用的目的
where id in
#{id}
where id in
#{id}
select username,address from user
package itcast.dao;
import itcast.domain.User;
import org.apache.ibatis.annotations.*;
import org.omg.PortableInterceptor.INACTIVE;
import java.util.List;
public interface UserMapper {
//@Select("select * from user")
@Select("SELECT id AS uid,username AS uname,birthday AS bir,sex AS gender,address AS addr FROM `user`")
@Results({ //相当于
@Result(column ="uid" ,property ="id",id=true ), //相当于 id=true表明当前列是主键列
@Result(column = "uname",property = "username"),
@Result(column = "bir",property = "birthday"),
@Result(column = "gender",property = "sex"),
@Result(column = "addr",property = "address")
})
List findAll();
@Select("select * from user where id =#{id}")
User findById(Integer id);
@Insert("insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})")
void save(User user);
@Update("update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}")
void update(User user);
@Delete("delete from user where id=#{id}")
void delete(Integer id);
}