role_id | role_name | role_level |
---|---|---|
1 | 董事长 | 1 |
2 | 总监 | 2 |
3 | 经理 | 2 |
4 | 人事专员 | 5 |
5 | 前台 | 5 |
6 | 销售员 | 4 |
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 |
1. 创建好对应的表
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);
}
}
实验结果
实现说明
在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的方法。