`

mybatis实现一对多连接查询

 
阅读更多
问题:两个对象User和Score,它们之间的关系为一对多。

底层数据库为postgresql,ORM框架为mybatis。

关键代码如下:


mybatis配置文件如下:

mybatis.xml文件内容为:
 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
	PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<settings>
		<setting name="cacheEnabled" value="true" />
		<setting name="lazyLoadingEnabled" value="true" />
		<setting name="multipleResultSetsEnabled" value="true" />
		<setting name="useColumnLabel" value="true" />
		<setting name="useGeneratedKeys" value="true" />
		<setting name="defaultExecutorType" value="SIMPLE" />
		<setting name="defaultStatementTimeout" value="25000" />
	</settings>
	<typeAliases>
		<typeAlias type="com.mybatis.domain.User" alias="User" />
		<typeAlias type="com.mybatis.domain.Score" alias="Score" />
	</typeAliases>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="org.postgresql.Driver" />
				<property name="url" value="jdbc:postgresql://localhost:5432/mybatis" />
				<property name="username" value="postgres" />
				<property name="password" value="admin" />
			</dataSource>
		</environment>
	</environments>

	<mappers>
		<mapper resource="com/mybatis/domain/User.xml" />
		<mapper resource="com/mybatis/domain/Score.xml" />
	</mappers>
</configuration>


User.java代码为:
package com.mybatis.domain;

public class User {

	private Integer id;//用户id

	private String username;//用户名

	private String password;//密码

	private String address;//地址

	public User(){
		
	}
	
	public User(String username,String password,String address){
		this.username = username;
		this.password = password;
		this.address =address;
	}
	
	public User(Integer id,String username,String password,String address){
		this.id = id;
		this.username = username;
		this.password = password;
		this.address =address;
	}

	public int 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 String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
	
	public String toString(){
		return "当前用户为:id = "+id+",username = "+username+",password = "+password+",address = "+address;
	}

}



Score.java代码如下:
 package com.mybatis.domain;

public class Score {
	
	private Integer id ;//主键id
	
	private User user;//所属用户
	
	private int math ;//数学成绩
	
	private int chinese ;//语文成绩
	
	private int english ;//英语成绩
	
	private int computer ;//计算机成绩
	
	public Score(){
		
	}
	
	public Score(User user, int math,int chinese,int english,int computer){
		this.user = user;
		this.math = math;
		this.chinese = chinese;
		this.english = english;
		this.computer = computer;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public int getMath() {
		return math;
	}

	public void setMath(int math) {
		this.math = math;
	}

	public int getChinese() {
		return chinese;
	}

	public void setChinese(int chinese) {
		this.chinese = chinese;
	}

	public int getEnglish() {
		return english;
	}

	public void setEnglish(int english) {
		this.english = english;
	}

	public int getComputer() {
		return computer;
	}

	public void setComputer(int computer) {
		this.computer = computer;
	}
	
	public String toString(){
		return "id = "+ this.id+",math = "+this.math+",chinese = "+this.chinese+",english = "+this.english+",computer = "+this.computer+
				", userid = "+this.user.getId()+",username = "+this.user.getUsername()+",password = "+this.user.getPassword()+
				",address = "+this.user.getAddress();
	}

}



user.xml中的关键代码为:
	
	<resultMap type="User" id="userResult">
	  <id property="id" column="userid"/>
	  <result property="username" column="username"/>
	  <result property="password" column="password"/>
	  <result property="address" column="address"/>
	</resultMap>

这里的对象的属性id对应的数据库表列名为userid,这是user对象为pg_score表中

的标示。

score.xml代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="ScoreDaoMapping">
	<resultMap type="Score" id="score">
		<constructor>
			<idArg column="id" javaType="int" />
			<arg column="userid" javaType="int" />
			<arg column="math" javaType="int" />
			<arg column="chinese" javaType="int" />
			<arg column="english" javaType="int" />
			<arg column="computer" javaType="int" />
		</constructor>
	</resultMap>
	
	<resultMap id="joinSelectScore" type="Score" >
	  <id property="id" column="id"/>
	  <result property="math" column="math"/>
	  <result property="chinese" column="chinese"/>
	  <result property="english" column="english"/>
	  <result property="computer" column="computer"/>
	  <association property="user" column="userid" javaType="User" resultMap="UserDaoMapping.userResult"/>
	</resultMap>
	
	<insert id="insertScore" parameterType="Score">
	   insert into pg_score(math,chinese,english,computer,userid) values(#{math},#{chinese},#{english},#{computer},#{user.id})
	</insert>
	
	<select id="findScoreByUser" resultMap="joinSelectScore" resultType="list" parameterType="map">
	     select 
	            s.id as id,
	            s.math as math,
	            s.chinese as chinese,
	            s.english as english,
	            s.computer as computer,
	            u.id as userid,
	            u.username as username,
	            u.password as password,
	            u.address as address
	     from pg_score s left outer join pg_userinfo u on s.userid = u.id where u.id=#{userid} 
	</select>
   
</mapper>


ScoreDao.java中的关键代码为:
private  String resource = "com/mybatis/configuration/mybatis.xml";
	public List<Score> selectScoreByUser(User user) throws IOException{
		Reader reader = Resources.getResourceAsReader(resource);
		SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = ssf.openSession();
		reader.close();
		Map<String,Integer> params = new HashMap<String,Integer>();
		params.put("userid", user.getId());
		List<Score> scoreList = session.selectList("ScoreDaoMapping.findScoreByUser", params);
		session.commit();
		session.close();
		return scoreList;
	}


ScoreService.java代码如下:
package com.mybatis.service;

import java.io.IOException;
import java.util.List;

import com.mybatis.dao.ScoreDao;
import com.mybatis.domain.Score;
import com.mybatis.domain.User;

public class ScoreService {

	private ScoreDao scoreDao = new ScoreDao();

	public ScoreDao getScoreDao() {
		return scoreDao;
	}

	public void setScoreDao(ScoreDao scoreDao) {
		this.scoreDao = scoreDao;
	}
	
	public List<Score> getScoreByUser(User user) throws IOException{
		return scoreDao.selectScoreByUser(user);
	}
	
	public void insertScore(Score score) throws IOException{
		scoreDao.insert(score);
	}
}



Test.java代码如下:

package com.mybatis.test;

import java.util.List;

import com.mybatis.domain.Score;
import com.mybatis.domain.User;
import com.mybatis.service.ScoreService;
import com.mybatis.service.UserService;

public class Test {

	private UserService userService = new UserService();
	
	private ScoreService scoreSerice = new ScoreService();
	
	public static void main(String[] args) throws Exception{
	    
		Test test = new Test();
		//test.insertScore();
		List<Score> scoreList = test.getScore();
		Score score = null;
        for(int i=0;i<scoreList.size();i++){
        	System.out.println("第"+(i+1)+"个score对象为:");
        	score = scoreList.get(i);
        	System.out.println(score);
        }
		
	}
	
	public void insertScore() throws Exception{
		List<User> userList = userService.getPageUsers(10, 0);
		User user = userList.get(2);
		
		Score score = new Score();
		score.setUser(user);
		score.setChinese(80);
		score.setComputer(90);
		score.setEnglish(91);
		score.setMath(98);
		scoreSerice.insertScore(score);
	}
	
	public List<Score> getScore() throws Exception{
		List<User> userList = userService.getPageUsers(10, 0);
		User user = userList.get(0);
		
		List<Score> scoreList = scoreSerice.getScoreByUser(user);
		return scoreList;
	}
	
/*	public User getUserById(int id) throws Exception{
		return userService.getUserById(id);
	}*/
}



数据库表记录为:




运行结果如下:
第1个score对象为:
id = 1,math = 98,chinese = 80,english = 91,computer = 90, userid = 1,username = yangjianzhou:0,password = password:0,address = password:0
第2个score对象为:
id = 2,math = 98,chinese = 80,english = 91,computer = 90, userid = 1,username = yangjianzhou:0,password = password:0,address = password:0
第3个score对象为:
id = 4,math = 98,chinese = 80,english = 91,computer = 90, userid = 1,username = yangjianzhou:0,password = password:0,address = password:0
  • 大小: 11.3 KB
分享到:
评论

相关推荐

    mybatis之多对多

    5. **一对一(OneToOne)和一对多(OneToMany)嵌套映射**:在多对多关系中,常常伴随着一对一或一对多的子关系。MyBatis提供`&lt;oneToMany&gt;`和`&lt;oneToOne&gt;`标签,允许我们在映射文件中声明这些关系。 6. **级联操作...

    mybatis(一对多xml)

    MyBatis 提供了一种通过 XML 映射文件来配置一对多关联的方法,让我们可以方便地处理这种复杂的关系。 在 MyBatis 的一对多关联映射中,通常涉及到两个表:一个是一对的“父”表,另一个是多的“子”表。在 XML ...

    Java的MyBatis框架中实现多表连接查询和查询结果分页

    在MyBatis中,可以通过`&lt;join&gt;`、`&lt;association&gt;`等标签来实现多表连接查询。以示例中的`Website`和`Visitor`两个实体类为例,如果它们之间存在一对一的关系,我们可以在`Website`的映射文件中定义一个`...

    mybatis实现多对一的实例

    在实体类和Mapper接口中,可以通过注解@One、@Many等来声明多对一或一对多的关系。 9. **测试验证**:描述中提到这个实例已经过测试,意味着所有的配置和SQL查询都是有效的,并且可以在实际项目中使用。测试通常...

    spring多数据源的处理_mybatis实现跨库查询

    Spring 2.x 的版本中采用 Proxy 模式,就是我们在方案中实现一个虚拟的数据源,并且用它来封装数据源选择逻辑,这样就可以有效地将数据源选择逻辑从 Client 中分离出来。 为了实现多数据源处理,我们需要定义一个...

    使用MyBatis实现表的多对多关联映射查询

    通过以上步骤,我们可以使用MyBatis实现多对多关联映射查询,理解这个过程对于掌握MyBatis框架以及数据库设计原则至关重要。在实际应用中,根据业务需求进行适当调整,确保数据的一致性和完整性。通过这个示例,初学...

    mybatis 一对多的查询,包含 连接查询 嵌套查询 及日志处理

    在处理一对多关系时,MyBatis 提供了多种方式,包括连接查询和嵌套查询,来帮助开发者高效地进行数据操作。同时,MyBatis 还提供了日志处理功能,便于调试和记录数据库操作,提升开发效率。 1. **一对多关联查询** ...

    mybatis自关联查询

    本篇文章将重点讲解 MyBatis 中的自关联查询,以“新闻栏目”为例,探讨如何实现一对多的关系。 在新闻系统中,栏目(Category)与新闻(News)通常存在一对多的关系:一个栏目可以包含多个新闻,而一个新闻则属于...

    mybatis一对多、多对多demo

    举个例子:每个人可以拥有多个银行卡(一对多)、每张银行卡只会对应一个用户(一对一)、每个人可能拥有多个不同的社会角色,每一个不同的社会角色也会对应不同的人(多对多),Mybatis作为大名鼎鼎的SSM的组成部分...

    mybatis多对多配置

    1. **关联映射(Association Mapping)**: 在MyBatis中,我们使用`&lt;association&gt;`标签来处理一对多或一对一的关系。但在这个场景下,我们关注的是多对多关系,通常会通过中间表来实现。 2. **联合映射(Collection ...

    MyBatis高级映射(多对多查询)

    在MyBatis中,处理多对多关系通常涉及到中间表或连接表,这个表用来存储两个主表的外键,形成关联。以下是一些关键概念和步骤: 1. **配置映射文件**:在MyBatis的映射文件中,你需要定义两个实体类(例如,Student...

    mybatis框架的实现之查询所有数据.zip

    在MyBatis中,我们通常会有一个或多个数据库表,这些表的数据需要通过MyBatis的映射机制来访问。在ceshi.sql中,可能定义了与MyBatis映射文件对应的表结构,比如用户表(user)、订单表(order)等。 接着,我们关注到...

    mybatis项目1对多,多对多练习含sql,非常详细

    对于1对多和多对多,可能会使用嵌套查询或者连接查询。例如,为了获取一个学生的所有课程,你可以写一个SELECT语句,其中包含了一个嵌套的SELECT查询来获取关联的课程数据。对于多对多,可能需要使用JOIN操作来同时...

    mybatis多表查询.zip

    一个典型的例子可能是用户订单系统,用户表和订单表存在一对多关系,查询时可能需要获取用户的所有订单信息。通过MyBatis的多表查询,我们可以轻松地完成这样的任务,同时保持代码的清晰和可维护性。 8. **最佳...

    Spring boot整合Mybatis实现级联一对多CRUD操作的完整步骤

    在本文中,我们将深入探讨如何使用Spring Boot整合Mybatis实现级联一对多的CRUD(创建、读取、更新、删除)操作。首先,我们需要理解什么是级联操作和一对多的关系。在关系型数据库中,级联操作涉及到一个表中的记录...

    基于mybatis-plus实现多租户级别的数据隔离

    在IT行业中,多租户架构是一种常见的设计模式,特别是在云服务和SaaS应用中,它允许服务提供商为多个...通过阅读和学习`multitenant-mybatisplus-demo`项目,你将对多租户架构和Mybatis-Plus的实战应用有更深入的理解。

    springboot创建集成的demo,pagehelper分页插件,mybatis集成mysql的一对多,多对多,Swagge

    本项目是基于Spring Boot创建的一个集成DEMO,主要涵盖了PageHelper分页插件、MyBatis与MySQL的一对多、多对多关系映射以及Swagger的API文档生成工具,旨在提供一个快速开发的基础模板。 首先,我们来讨论...

    Spring整合MyBatis关联查询示例

    本示例将探讨如何在Spring环境中实现MyBatis的关联查询,包括一对多、一对一和多对多关系的处理。理解这些关联关系对于构建复杂的业务逻辑至关重要。 首先,我们需要配置Spring与MyBatis的整合。这通常涉及以下几个...

    MyBatis多表连接

    本文将深入探讨MyBatis如何处理多表连接查询,结合具体的实例,包括学生表、课程表和关系表,来阐述这个主题。 首先,我们需要了解在SQL中,多表连接是用于从多个相关的表中获取数据的关键方法。MyBatis通过动态SQL...

    mybatis一对多查询功能

    这样,我们就成功地实现了MyBatis的一对多查询功能。 总之,MyBatis的一对多查询功能允许我们处理复杂的关联关系,通过`resultMap`的`collection`标签,将多条子表记录映射到父对象的一个集合属性中,从而方便地...

Global site tag (gtag.js) - Google Analytics