Mybatis关系关联映射的多对一或者一对多的实现

Mybatis关系关联映射的多对一或者一对多的实现

实验前先创建两张实验所用的表

  • T_role
role_id role_name role_level
1 董事长 1
2 总监 2
3 经理 2
4 人事专员 5
5 前台 5
6 销售员 4
  • T_user
user_id user_name user_salary user_age user_sex user_role
1 张三 100000 58 1
2 李四 18000 58 2
3 王五 6000 58 4
4 小张 3500 58 5
5 小马 3500 58 5
6 小刘 7000 58 6

实验要求:

  • 分页查询员工表,每个显示2条数据(多对一)
  • 模糊查询所有带关键字的员工(多对一)
  • 根据id查询对应的role,要求该角色中包含对应的所有员工的信息(一对多)

实现:

1. 创建好对应的表
Mybatis关系关联映射的多对一或者一对多的实现_第1张图片
Mybatis关系关联映射的多对一或者一对多的实现_第2张图片
2. 创建对应的实体类
在这里插入图片描述
在这里插入图片描述
RoleListUser实体类是为了实现一对多查询的必要实体类,拥有Trole的所有属性外多了一个Tuser的集合。

package cn.edu.fjut.entity;

public class Trole {

	private Integer role_id;
	private String role_name;
	private Integer role_level;
package cn.edu.fjut.entity;

public class Tuser {

	private Integer user_id;
	private String user_name;
	private Integer user_salary;
	private Integer user_age;
	private String user_sex;
	private Trole user_role;
package cn.edu.fjut.entity;

import java.util.ArrayList;

public class RoleListUser {

	private Integer role_id;
	private String role_name;
	private Integer role_level;
	private ArrayList data;

3. 创建对应的dao类

package cn.edu.fjut.dao;

import java.util.ArrayList;

import cn.edu.fjut.entity.Tuser;
import cn.edu.fjut.entity.User;

public interface TuserDao {

	
	abstract public ArrayList getUserPageOne(int page,int pagesize);
	
	abstract public ArrayList getUserPageTwo(int page,int pagesize);
	
	abstract public ArrayList getTuserByKey(String like);
	
	abstract public ArrayList getTuserByUserid(Integer user_id);
}
package cn.edu.fjut.dao;

import java.util.ArrayList;

import cn.edu.fjut.entity.RoleListUser;
import cn.edu.fjut.entity.Trole;

public interface TroleDao {

	abstract public Trole getRoleByRoleid(Integer role_id);
	
	abstract public ArrayList getRoleAll();
}

4. 配置映射文件
这个是TuserDaoMapper.xml













 
 






 
 























这个是TroleDaoMapper.xml







 



	

5. 创建对应的dbutil类

public SqlSession creatSession(){
		String path = "SqlMapConfig.xml";
		InputStream inputStream = Test.class.getClassLoader().getResourceAsStream(path);
		SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession sqlSession = sqlSessionFactory.openSession();
		return sqlSession;
	}
	
	public void closeAll(SqlSession sqlSession){
		sqlSession.commit();
		sqlSession.close();
	}
	public ArrayList getUserPageOne(int page,int pagesize){
		SqlSession sqlSession = creatSession();
		TuserDao tuserDao = (TuserDao) sqlSession.getMapper(TuserDao.class);
		return tuserDao.getUserPageOne((page-1)*pagesize, pagesize);
	}
	
	public ArrayList getUserPageTwo(int page,int pagesize){
		SqlSession sqlSession = creatSession();
		TuserDao tuserDao = (TuserDao) sqlSession.getMapper(TuserDao.class);
		return tuserDao.getUserPageTwo((page-1)*pagesize, pagesize);
	}
	
	public Trole getRoleByRoleid(Integer role_id){
		SqlSession sqlSession = creatSession();
		TroleDao troleDao = (TroleDao) sqlSession.getMapper(TroleDao.class);
		return troleDao.getRoleByRoleid(role_id);
	}
	
	public ArrayList getTuserByKey(String like){
		SqlSession sqlSession = creatSession();
		TuserDao tuserDao = (TuserDao) sqlSession.getMapper(TuserDao.class);
		return tuserDao.getTuserByKey("%"+like+"%");
	}
	
	public ArrayList getTuserByUserid(Integer user_id){
		SqlSession sqlSession = creatSession();
		TuserDao tuserDao = (TuserDao) sqlSession.getMapper(TuserDao.class);
		return tuserDao.getTuserByUserid(user_id);
	}
	
	public ArrayList getRoleAll(){
		SqlSession sqlSession = creatSession();
		TroleDao troleDao = (TroleDao) sqlSession.getMapper(TroleDao.class);
		return troleDao.getRoleAll();
	}

6. 实现dao类创建daoimpl类

package cn.edu.fjut.daoimpl;

import java.util.ArrayList;

import cn.edu.fjut.DBUtil.DBUtil;
import cn.edu.fjut.dao.TuserDao;
import cn.edu.fjut.entity.Tuser;

public class TuserDaoImple implements TuserDao{

	private DBUtil dBUtil = new DBUtil();
	
	 @Override
	public ArrayList getUserPageOne(int page, int pagesize) {
		// TODO Auto-generated method stub
		return dBUtil.getUserPageOne(page, pagesize);
	}
	 
	 @Override
	public ArrayList getUserPageTwo(int page, int pagesize) {
		// TODO Auto-generated method stub
		return dBUtil.getUserPageTwo(page, pagesize);
	}
	 
	 @Override
	public ArrayList getTuserByKey(String like) {
		// TODO Auto-generated method stub
		return dBUtil.getTuserByKey(like);
	}
	 
	 @Override
	public ArrayList getTuserByUserid(Integer user_id) {
		// TODO Auto-generated method stub
		return dBUtil.getTuserByUserid(user_id);
	}
}

package cn.edu.fjut.daoimpl;

import java.util.ArrayList;

import cn.edu.fjut.DBUtil.DBUtil;
import cn.edu.fjut.dao.TroleDao;
import cn.edu.fjut.entity.RoleListUser;
import cn.edu.fjut.entity.Trole;

public class TroleDaoImple implements TroleDao{

	private DBUtil dBUtil = new DBUtil();
	@Override
	public Trole getRoleByRoleid(Integer role_id) {
		// TODO Auto-generated method stub
		return dBUtil.getRoleByRoleid(role_id);
	}
	
@Override
	public ArrayList getRoleAll() {
		// TODO Auto-generated method stub
		return dBUtil.getRoleAll();
	}	
}

7. 编写测试类

package cn.edu.fjut.test;

import cn.edu.fjut.dao.TroleDao;
import cn.edu.fjut.daoimpl.TroleDaoImple;
import cn.edu.fjut.daoimpl.TuserDaoImple;
import cn.edu.fjut.entity.Tuser;

public class Ttest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		TuserDaoImple tuserDaoImple = new TuserDaoImple();
		TroleDaoImple troleDaoImple = new TroleDaoImple();
		System.out.println("*************getUserPageOne**************");
		tuserDaoImple.getUserPageOne(1, 2).forEach(System.out::println);
		System.out.println("*************getUserPageTwo**************");
		tuserDaoImple.getUserPageTwo(1, 2).forEach(System.out::println);
		System.out.println("*************getTuserByKey**************");
		tuserDaoImple.getTuserByKey("小").forEach(System.out::println);
		System.out.println("*************getRoleAll**************");
		troleDaoImple.getRoleAll().forEach(System.out::println);
	}

}

实验总结

实验结果
Mybatis关系关联映射的多对一或者一对多的实现_第3张图片
实现说明
在sql中不乏出现相关联的两张表,一张表的某个属性是另一张表的主键,在编写实体类时主键应该写成对应的实体类类型,这就导致了最终查询的结果在那个属性上的值为null,因为sql里并没有那样的数据类型。解决这个问题尤为的重要。

1. 多对一查询
在多对一查询中我们有两个思路,一个是通过连接表将缺失的属性封装成主表的实体类,另一种就是通过二次查询将查询结果封装成主表的实体类。

  • 连接表方法
 











这是自定义的类型,主键用id申明,其他的都是result,property对应实体类里的属性名,column对应结果集属性,association就是主表实体类的申明,里面与外面申明一样,注意在副表中使用association申明,在主表中用collection申明,下文会有展示。注意这个方法在自定义申明中一定要写完所有实体类属性,不能省略。

  • 二次查询方法
    这个方法是先查副表,通过副表的和主表的连接键查询主表。





这个是自定义类型申明,可以看见除了主键和连接键外其他的不用再申明,所以显得比较短,注意看连接键中的JavaType和select两个属性,JavaType就是主表实体类申明,select调用了申明的dao的调用方法,二次查询也是从这个地方开始的,现在我们来看一下这个调用的dao的方法。

package cn.edu.fjut.dao;

import java.util.ArrayList;

import cn.edu.fjut.entity.RoleListUser;
import cn.edu.fjut.entity.Trole;

public interface TroleDao {

	abstract public Trole getRoleByRoleid(Integer role_id);//申明里使用的方法
	
	abstract public ArrayList getRoleAll();
}

二次查询,通过副表的连接键查询了主表,将查询结果返回给一次查询。
2. 一对多查询
一对多查询就只能通过二次查询来实现,连接表不能满足我们将集合放入一个字段中,因为这违背数据库第一范式的要求。
二次查询我们需要一个可以储存多表数据的属性,所以我们要创建一个新的实体类,这个实体类拥有主表的所有属性的同时多了一个副表实体类的集合。

package cn.edu.fjut.entity;

import java.util.ArrayList;

public class RoleListUser {

	private Integer role_id;
	private String role_name;
	private Integer role_level;
	private ArrayList data; //那个集合

下面是自定义实现







可以看见和多对一的二次查询没有什么太大的不同,唯二区别就是用的是我们新定义的实体类和申明字段换成了collection,注意区别在主副表中的字段区别。

abstract public ArrayList getUserPageTwo(int page,int pagesize);

这个是调用的dao的方法。

你可能感兴趣的:(笔记,java,mybatis,mysql,框架,笔记,框架,java,mysql,mybatis)