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

2023-12-18 03:08

本文主要是介绍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"

这篇关于ibatis多对一表关联映射的解决过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/506822

相关文章

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到