1)导入jar包
2)准备配置文件
3)domain+表
4)实体的映射文件需要导入核心配置文件
5)抽取util,方便管理sqlSession
6)写dao层crud,dao层impl类实现方法,通过session调用命名空间中的sql方法来实现
7)在实体映射中sql语句,注意和接口中的方法对应
8)测试
public interface EmployeeMapper {
//根据查询条件查询满足条件的员工
List query(EmployeeQuery employeeQuery);
}
public class EmployeeQuery {
//模糊查询的like条件语句中的参数
private String keywords;
//最小年龄
private Integer minAge;
//最大年龄条件
private Integer maxAge;
。。getset...
}
and ( name LIKE concat('%',#{keywords},'%') OR password LIKE concat('%',#{keywords},'%'))
and age>#{minAge}
分析:
select * from t_employee
where (name like '%条件1%' or password like '%条件2%') and age > minAge and age < maxAge
SqlSession sqlSession = MybatisUtil.INSTANCE.openSqlSession();
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
List list = mapper.query(query);
System.out.println(list);
4.1 为什么需要结果映射
1)数据库表字段名和java对象属性名不一致
2)不管什么关系的关联对象的查询都需要使用resultMap
4.2 关联映射分类
一对一,多对一,一对多,多对多
一对一和多对一都是处理一方(association ),一对多和多对多都是处理多方(collection)集合
4.3 处理方式
1)嵌套结果(join)-只需要发送1条sql
2)嵌套查询-1+N条sql,先查询自己,再通过自己里面外键查询关联方
能用嵌套结果就用它,因为效率高
4.4 如果需要嵌套加上分页,只能使用嵌套查询,因为嵌套结果会将数据合并
public class Dept {
private Long id;
private String name;
省略getset
}
//关系:多对一
//多个员工对应一个部门
public class Employee {
private Long id;
private String name;
private String password;
private Integer age;
//多对一关系 省略getset
private Dept dept;
}
为了方便测试,不写接口mapper,直接用session调用命名空间
public class MapperTest {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtil.INSTANCE.openSqlSession();
//SELECT e.*,d.id did,d.`name` dname FROM t_employee e LEFT JOIN t_dept d ON e.dept_id = d.id
//只发送了一条sql,手动封装
List list = sqlSession.selectList("com.lr.mybatis.mapper._03_many2one_result.mapper.EmployeeMapper.query");
System.out.println(list);
sqlSession.close();
}
}
在核心mybatis配置中注意更改映射文件配置
public class Dept {
private Long id;
private String name;
//一对多
//一个部门对应多个员工
private List employees = new ArrayList<>();
省略getset
}
public class MapperTest {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtil.INSTANCE.openSqlSession();
//SELECT e.*,d.id did,d.`name` dname FROM t_employee e LEFT JOIN t_dept d ON e.dept_id = d.id
//只发送了一条sql,手动封装
List list = sqlSession.selectList("com.lr.mybatis.mapper._05_one2many_result.domain.DeptMapper.query");
list.forEach(dept -> System.out.println(dept+"员工信息"+dept.getEmployees()));
sqlSession.close();
}
}
小结: