`

ibatis多对一表关联映射的解决过程

阅读更多
1、问题:当查询新闻的时候我们一般情况下需要新闻的类型以及作者的信息。根据表设计的规范我们要把文章,文章类型,作者信息分别设计成一张表,其中文章中分别存在指向文章类型和作者信息的外键。我们的问题就是怎么使用ibatis把表空间数据映射为java的实体类属性。

2、表DDL,
   用户表
   CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(25) default NULL,
’password` varchar(32) default NULL,
`gender` int(11) default '1',
`birth` date default NULL,
  `user_type` int(11) default NULL,
PRIMARY KEY  (`id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 
  文章类型表
  CREATE TABLE `article_class` (
  `acid` int(11) NOT NULL auto_increment,
  `name` varchar(25) default NULL,
  `class_desc` varchar(255) default NULL,
  PRIMARY KEY  (`acid`)
  ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

  文章表
  CREATE TABLE `article` (
  `aid` int(11) NOT NULL auto_increment,
  `title` varchar(36) default NULL,
  `content` text,
  `classid` int(11) default NULL,
  `userid` int(11) default NULL,
  PRIMARY KEY  (`aid`),
  KEY `classid` (`classid`),
  KEY `userid` (`userid`),
  CONSTRAINT `article_ibfk_1` FOREIGN KEY (`classid`) REFERENCES `article_class` (`acid`),
  CONSTRAINT `article_ibfk_2` FOREIGN KEY (`userid`) REFERENCES `users` (`id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

3、实体类
   import java.sql.Date;

	public class User {
		private Integer id;
		private String username;
		private String password;
		private int gender;
		private Date birth;
		private int userType = 1;
		public Integer 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 int getGender() {
			return gender;
		}
		public void setGender(int gender) {
			this.gender = gender;
		}
		public Date getBirth() {
			return birth;
		}
		public void setBirth(Date birth) {
			this.birth = birth;
		}
		public int getUserType() {
			return userType;
		}
		public void setUserType(int user_type) {
			this.userType = user_type;
		}
		
	}
	
	文章类型类
	public class ArticleClass {
		private Integer id;
		private String name;
		private String desc;
		
		public ArticleClass() {
			
		}
		public ArticleClass(int id) {
			this.id = id;
		}
		public Integer getId() {
			return id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public String getDesc() {
			return desc;
		}
		public void setDesc(String desc) {
			this.desc = desc;
		}
	}

	文章类

	public class Article {
		private Integer id;
	//	private int classid;
	//	private int userid;
		private String title;
		private String content;
		private ArticleClass articleClass;
		private User user;
		
		public Article() {
			
		}
		
	/*	public int getClassid() {
			return classid;
		}

		public void setClassid(int classid) {
			this.classid = classid;
		}

		public int getUserid() {
			return userid;
		}

		public void setUserid(int userid) {
			this.userid = userid;
		}*/

		public Article(String title, String content) {
			this.title = title;
			this.content = content;
		}
		
		public Integer getId() {
			return id;
		}

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

		public String getTitle() {
			return title;
		}

		public void setTitle(String title) {
			this.title = title;
		}

		public String getContent() {
			return content;
		}

		public void setContent(String content) {
			this.content = content;
		}

		public ArticleClass getArticleClass() {
			return articleClass;
		}

		public void setArticleClass(ArticleClass articleClass) {
			this.articleClass = articleClass;
		}

		public User getUser() {
			return user;
		}

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

	}


4、解决方案
   问题主要发生在查找文章的时候,如果把文章类型信息和用户信息也查出来并存储在article对象的user和articleClass中
   article映射文件如下
   <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE sqlMap
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
    "http://java.plugbase.org/dtd/sql-map-2.dtd">
   
   <sqlMap namespace="article">
<typeAlias alias="Article" type="ebiz.sql.article.Article"/>
<typeAlias alias="ArticleClass" type="ebiz.sql.article.ArticleClass"/>
<typeAlias alias="User" type="ebiz.sql.user.User"/>

<resultMap class="Article" id="articleResult">
<result property="id" column="aid"/>
<result property="title" column="title"/>
<result property="content" column="content"/>
<result property="articleClass" select="getArticleClassById" column="classid"/>
<result property="user" select="getUserById" column="userid"/>
</resultMap>

<!-- select sql -->
<select id="getArticleAllCascade" resultMap="articleResult">
select aid,title,content,classid, userid from article
</select>

<select id="getArticleByIdCascade" parameterClass="java.lang.Integer" resultMap="articleResult">
select aid,title,content,classid,userid from article
where article.aid = #id#
</select>

<!-- insert sql -->
<insert id="insertArticle" parameterClass="Article">
insert into article (title, content, classid, userid)
values(#title#, #content#, #articleClass.id#, #user.id#)
</insert>

<!-- update sql -->
<update id="updateArticle" parameterClass="Article">
update article
set title=#title#, content=#content#, classid=#articleClass.id#, userid=#user.id#
where aid=#id#
</update>

<!-- delete sql -->
<delete id="deleteArticleById" parameterClass="java.lang.Integer">
delete from article where aid = #id#
</delete>
  </sqlMap>

  user映射文件

  <?xml version="1.0" encoding="UTF-8" ?>

  <!DOCTYPE sqlMap
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
    "http://java.plugbase.org/dtd/sql-map-2.dtd">
  <sqlMap namespace="users">
<typeAlias alias="User" type="ebiz.sql.user.User"/>

<resultMap class="User" id="userResult">
<result property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="birth" column="birth"/>
<result property="gender" column="gender"/>
<result property="userType" column="user_type"/>
</resultMap>

<!-- select sql -->
<select id="getUsersAll" resultMap="userResult">
select id, username, password,birth,gender,user_type
from users
order by id desc
</select>

<select id="getUserById" parameterClass="java.lang.Integer" resultMap="userResult">
select id, username, password,birth,gender,user_type
from users
where id=#id#
</select>

<select id="getUserByNameAndPassword" parameterClass="User"  resultClass="java.lang.Integer">
select count(*)
from users
where username=#username# and password=#password#
</select>

<select id="getUserByName" parameterClass="java.lang.String" resultMap="userResult">
select id, username, password,birth,gender,user_type
from users
where username=#username#
</select>

<!-- insert sql -->
<insert id="insertUser" parameterClass="User">
insert into users (username, password,birth,gender,user_type)
values(
#username#, #password#, #birth#, #gender#, #userType#
)
</insert>

<!-- update sql -->
<update id="updateUser" parameterClass="User">
update users
set username=#username#, password=#password#, birth=#birth#, gender=#gender#, user_type=#userType#
where id=#id#
</update>

<!-- delete sql -->
<delete id="deleteUserById" parameterClass="java.lang.Integer">
delete from users where id = #id#
</delete>
    </sqlMap>


  articleClass映射文件

  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE sqlMap
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
    "http://java.plugbase.org/dtd/sql-map-2.dtd">
   
   <sqlMap namespace="article_class">
<typeAlias alias="ArticleClass" type="ebiz.sql.article.ArticleClass"/>


<resultMap class="ArticleClass" id="articleClassResult">
<result property="id" column="acid"/>
<result property="name" column="name"/>
<result property="desc" column="class_desc"/>
</resultMap>

<!-- select sql -->

<select id="getArticleClassById" parameterClass="java.lang.Integer" resultMap="articleClassResult">
select acid, name, class_desc from article_class where acid = #classid#
</select>
   </sqlMap>

5、解释:当使用"getArticleByIdCascade"查询查询文章的时候,查出来之后分别把classid和userid作为参数调用"getUserById"和"getArticleClassById"
分享到:
评论
2 楼 walle1027 2009-03-05  
会出现N+1查询的问题的。
1 楼 phenom 2009-01-08  
只有单向关联。

相关推荐

    ibatis配置多表关联(一对一、一对多、多对多

    ibatis配置多表关联(一对一、一对多、多对多

    ibatis 一对多 多对多完整映射

    本文将深入探讨如何在iBATIS中实现一对多和多对多的关系映射,并提供相关的源码分析和工具使用技巧。 **一对多关系映射** 在数据库设计中,一对多关系是指一个父记录可以与多个子记录关联,例如,一个用户可以有多...

    ibatis 一对多关系映射

    首先,我们需要在映射文件中定义主表(一对一端)和从表(多对一端)的映射。假设我们有一个`User`类对应`users`表,一个`Order`类对应`orders`表,其中`orders`表有一个`user_id`字段作为外键关联到`users`表。 在...

    Ibatis一对一映射提示

    一对一映射是iBATIS中处理关联关系的一种方式,它允许你在查询一个实体对象时,同时获取与其关联的另一个实体对象。这种映射通常涉及到主表和从表,主表中的一条记录对应从表中的唯一一条记录。 **配置一对一映射:...

    Mybatis/ibatiS多表映射 一对一 一对多 extjs前台取值 详细讲解

    总结来说,这个话题覆盖了Mybatis/iBatis中的多表映射,通过XML配置文件处理一对一和一对多关系,以及如何在ExtJS前端通过Model和Grid获取并展示这些数据。了解这些知识对于开发涉及多表交互的应用至关重要,能够...

    ibatis实战之一对多关联(源代码)

    在IT领域,特别是Java开发中,iBatis是一个非常受欢迎的...以上是关于iBatis一对多关联映射的实战介绍,希望对您在开发过程中有所帮助。更多关于iBatis的高级用法和最佳实践,可以通过文章链接中的资源进行深入学习。

    ibatis 一对多

    一对多映射是数据库关系模型中的常见概念,指的是一个父表(如部门表)可以对应多个子表(如员工表),每个部门可以有多个员工。在`iBatis` 中,我们可以利用映射文件来配置这种关系,以便在查询时自动处理关联数据...

    ibatis多对多关系(详细)

    iBatis多对多关系详解 iBatis是一种流行的持久层框架,用于简化Java应用程序...我们使用了三个数据库表来存储学生和教师之间的多对多关系,并使用iBatis来映射数据库表和Java对象。最后,我们实现了DAO来访问数据库。

    ibatis 的关系映射

    3. 映射一对一、一对多、多对多关系的具体示例。 4. iBATIS的源码解析,特别是与关系映射相关的部分。 5. 使用MyBatis Generator等工具提高开发效率。 6. 关于优化iBATIS映射性能的最佳实践和技巧。 总之,"ibatis ...

    ibatis多表查询

    在Ibatis中,多表查询是一项重要的功能,它允许我们处理复杂的数据库操作,例如一对多、多对一或一对一的关系。在这个例子中,我们将探讨如何使用Ibatis进行一对多的多表查询,以`book`和`user`两个表为例。 首先,...

    ibatis多表查询过程

    在数据库设计中,多表查询通常涉及到表之间的关联,例如一对一、一对多、多对多关系。在iBatis中,我们可以使用`&lt;select&gt;`标签来定义多表查询的SQL语句。 ### 3. 使用`&lt;include&gt;`标签 为了保持SQL语句的整洁和可...

    Mybatis多对多关联映射源码

    在Mybatis中,多对多关联映射是处理复杂数据关系的一种重要机制。它允许我们将一个实体类与多个同类或不同类的实体类之间建立起关联关系。Mybatis通过配置XML映射文件或注解来实现这种关系的映射。下面我们将深入...

    使用ibatis操作两个有关系的表

    在处理两个有关系的表时,Ibatis提供了多种策略,如一对一、一对多、多对一、多对多等映射关系。 1. **一对一映射**:当两个表之间存在一对一关系时,例如用户表和用户详细信息表,一个用户对应一条详细信息。在...

    Ibatis多表查询

    在多表查询中,Ibatis 提供了多种方式来处理复杂的关联查询,包括一对一、一对多、多对一和多对多等关系。在这个例子中,我们将探讨如何在 Ibatis 中实现一对多的关系查询。 首先,我们创建了两个表:`book` 和 `...

    ibatis one to many mapping

    3. `ibatis配置多表关联(一对一、一对多、多对多).htm` - 这个文件涵盖了多种关联映射,包括一对一、一对多和多对多,可能是全面的关联配置教程。 4. `ibatis多对多映射.htm` - 又一份多对多映射的详细说明。 5. `...

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    我们可以在父表(如用户表)的映射文件中定义一个collection元素,指定关联的子表(如订单表)以及关联条件。在Java代码中,通过MyBatis的SqlSession对象加载或保存相关的对象,Ibatis会自动处理一对多的关联填充和...

    ibatis 多对多

    在Ibatis中处理多对多关系时,我们需要使用关联映射来定义这种关系。 1. **配置关联映射** 在Ibatis中,多对多关系通常通过`&lt;collection&gt;`标签来实现,它定义在一个实体类的映射文件中。这个标签通常包含`select`...

    ibatis的的增删改查和一对一、一对多查询

    本篇文章将详细探讨iBatis在增删改查(CRUD)操作以及一对一和一对多关系映射中的应用。 首先,让我们了解一下iBatis的CRUD操作: 1. **创建(Create)**:在iBatis中,创建数据通常通过`&lt;insert&gt;`标签实现。你需要...

Global site tag (gtag.js) - Google Analytics