2.在mybatis_config.xml配置插件
com.github.pagehelper
pagehelper
5.3.0
3. 分页实例:
3.1普通分页
//分页插件使用
@Test
public void listStudentByPage(){
StudentDAO studentDAO=mybatisUtils.getMapper(StudentDAO.class);
//引入分页插件,创建拦截器,设置请求页码及页面数据条数
PageHelper.startPage(1,3);
//查询所有符合条件的数据时检查是否有拦截器,根据拦截器产生响应数据条数
List students=studentDAO.listStudent();
students.forEach(System.out::println);
System.out.println("-----------------");
//将得到的数据和页码,数据数,开始行结束行,上一页下一页等信息封装
PageInfo pageInfo=new PageInfo<>(students);
List list=pageInfo.getList();
list.forEach(System.out::println);
}
七.关联映射
1.实体关系
在关系型数据库中,多表之间存在着三种关联关系,分别为一对一、一对多和多对多,如图1所示。
图1 关系型数据库中多表之间的三种关联关系
这三种关联关系的具体说明如下:
● 一对一:在任意一方引入对方主键作为外键;
● 一对多:在“多”的一方,添加“一”的一方的主键作为外键;
● 多对多:产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键。
通过数据库中的表可以描述数据之间的关系,同样,在Java中,通过对象也可以进行关系描述,如图2所示。
图2 Java对象描述数据表之间的关系
在图2中,三种关联关系的描述如下:
● 一对一的关系:就是在本类中定义对方类型的对象,如A类中定义B类类型的属性b,B类中定义A类类型的属性a;
● 一对多的关系:就是一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a;
● 多对多的关系:在A类中定义B类类型的集合,在B类中定义A类类型的集合。
1.1 一对一关联主键关联:在两个表的数据的主键id相同
表1 表2
id ..... id ......
1 张三 1 18565425643
2 李四 2 16549632145
唯一外键关联
表1 表2
id ...... id ...... 表1id
1 1 2
2 2 1
在
在元素中,通常可以配置以下属性:
● property:指定映射到的实体类对象属性,与表字段一一对应;
● column:指定表中对应的字段;
● javaType:指定映射到实体对象属性的类型;
● select:指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询;
● fetchType:指定在关联查询时是否启用延迟加载。fetchType属性有lazy和eager两个属性值,默认值为lazy(即默认关联映射延迟加载)。
添加:
| user类 | detail类 |
|---|---|
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
private int userId;
private String userName;
private String userPassword;
//将类detail作为user属性用于关联
private Detail detail;
}
| @Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Detail {
private int detailId;
private String userGender;
private String userPhone;
private int uid;
} |
@org.junit.Test
public void insertUser() {
//用户注册,提交基本信息和详细信息到servlet中,servlet接收注册信息并保存在User和Detail对象中
Detail detail = new Detail(0, "女", "12345678902", 0);
User user = new User(0, "小花", "456789",detail);
//插入两个表有先后顺序,避免其中一个出错,手动提交事务
SqlSession sqlSession=mybatisUtils.getSqlSession(false);
UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
DetailDAO detailDAO = sqlSession.getMapper(DetailDAO.class);
try {
int i = userDAO.insertUser(user);
//将生成的用户主键id设置为detail的uid属性,形成一对一关联
detail.setUid(user.getUserId());
int j = detailDAO.insertDetail(detail);
System.out.println(i+" "+j);
//手动提交
sqlSession.commit();
} catch (Exception e) {
//出错回滚
sqlSession.rollback();
e.printStackTrace();
}
按名字查询:
1.连接查询
2.子查询(嵌套查询)
| usermapper | detailmapper |
测试
3.嵌套结果查询
测试:



