mybatis--一对多关联

今天来介绍mybatis的一对多关联

(1)首先创建数据库mybatisonetomany,并创建数据库表post和user,并向其中插入一定的数据:

create database mybatisonetomany;

use mybatisonetomany;
CREATE TABLE user (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  username varchar(64) NOT NULL DEFAULT ‘‘,
  mobile int(10) unsigned NOT NULL DEFAULT ‘0‘,
  created datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00‘,
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT INTO user VALUES (‘1‘, ‘yiibai‘, ‘100‘, ‘2015-09-23 20:11:23‘);

CREATE TABLE post (
  post_id int(10) unsigned NOT NULL AUTO_INCREMENT,
  userid int(10) unsigned NOT NULL,
  title varchar(254) NOT NULL DEFAULT ‘‘,
  content text,
  created datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00‘,
  PRIMARY KEY (post_id)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO post VALUES (‘1‘, ‘1‘, ‘MyBatis关联数据查询‘, ‘在实际项目中,经常使用关联表的查询,比如:多对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。我们首先创建一个 post 表,并初始化数据.‘, ‘2015-09-23 21:40:17‘);
INSERT INTO post VALUES (‘2‘, ‘1‘, ‘MyBatis开发环境搭建‘, ‘为了方便学习,这里直接建立java 工程,但一般都是开发 Web 项目。‘, ‘2015-09-23 21:42:14‘);
INSERT INTO post VALUES (‘3‘, ‘2‘, ‘这个是别人发的‘, ‘content,内容...‘, ‘0000-00-00 00:00:00‘);

插入数据后,表数据如下所示:

(2)其次,在mybatis.bean目录下创建两个java bean,Post.java和User.java

Post.java

package mybatis.bean;

import java.io.Serializable;

public class Post implements Serializable{
	private int id;
	private User user;
	private String title;
	private String content;

	public int getId() {
		return id;
	}

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

	public User getUser() {
		return user;
	}

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

	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;
	}
}

User.java

package mybatis.bean;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

public class User implements Serializable{
	private int id;
	private String username;
	private String mobile;
	private List<Post> posts;

	public int getId() {
		return id;
	}

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

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getMobile() {
		return mobile;
	}

	public void setMobile(String mobile) {
		this.mobile = mobile;
	}

	public List<Post> getPosts() {
		return posts;
	}
	public void setPosts(List<Post> posts) {
		this.posts = posts;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + username + "]";
	}

}

(3)第三步配置config.xml文件,放在config文件夹下:

<?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>
<typeAliases>
		<typeAlias alias="User" type="mybatis.bean.User" />
		<typeAlias alias="Post" type="mybatis.bean.Post" />
</typeAliases>
<environments default="development">
	    <environment id="development">
		<transactionManager type="JDBC" />
		<dataSource type="POOLED">
		<property name="driver" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/mybatisonetomany"/>
		<property name="username" value="root"/>
		<property name="password" value="123456"/>
		</dataSource>
		</environment>
</environments>

<mappers>
	    <!-- // power by http://www.yiibai.com -->
	    <mapper resource="mybatis/bean/User.xml" />
</mappers>
</configuration>

(4)配置User.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="com.zk.userMaper">
	<!-- User 级联文章查询 方法配置 (一个用户对多个文章)  -->

	<resultMap type="User" id="resultUserMap">
		<result property="id" column="user_id" />
		<result property="username" column="username" />
		<result property="mobile" column="mobile" />
		<collection property="posts" ofType="mybatis.bean.Post" column="userid">
			<id property="id" column="post_id" javaType="int" jdbcType="INTEGER"/>
            <result property="title" column="title" javaType="string" jdbcType="VARCHAR"/>
            <result property="content" column="content" javaType="string" jdbcType="VARCHAR"/>
		</collection>
	</resultMap>

	<select id="getUser" resultMap="resultUserMap" parameterType="int">
		SELECT u.*,p.*
		FROM user u, post p
		WHERE u.id=p.userid AND id=#{user_id}
  </select>

</mapper>

(5)最后构建Main.java

package MainApp;

import java.io.Reader;
import java.text.MessageFormat;
import java.util.List;

import mybatis.bean.Post;
import mybatis.bean.User;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Main {
	private static SqlSessionFactory sqlSessionFactory;
	private static Reader reader;

	static {
		try {
			reader = Resources.getResourceAsReader("config/config.xml");
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static SqlSessionFactory getSession() {
		return sqlSessionFactory;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SqlSession session = sqlSessionFactory.openSession();
		try {
			int userid = 1;
			User user = session.selectOne("com.zk.userMaper.getUser", 1);
		     System.out.println("username: "+user.getUsername()+",");
                     List<Post> posts = user.getPosts();
                     for(Post p : posts) {
                         System.out.println("Title:" + p.getTitle());
                         System.out.println("Content:" + p.getContent());
                      }
		 } finally {
			session.close();
		 }
	}
}

 运行结果如下:

程序结构如下:

原文地址:https://www.cnblogs.com/longlyseul/p/11229261.html

时间: 2024-10-08 14:16:31

mybatis--一对多关联的相关文章

mybatis一对多关联查询+pagehelper-&gt;分页错误(toSolve)

mybatis一对多关联查询+pagehelper->分页错误. 现象: 网上其他人遇到的类似问题:https://segmentfault.com/q/1010000009692585 解决: todo 疑惑: 之前有人提过类似的issue(https://github.com/pagehelper/Mybatis-PageHelper/issues/149)为什么被关闭了 原文地址:https://www.cnblogs.com/goingforward/p/8492448.html

mybatis一对多关联查询——(九)

1.需求: 查询所有订单信息及订单下的订单明细信息. 订单信息与订单明细为一对多关系. 2.      sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.o

MyBatis一对多关联表查询 映射文件

<!--一对多--> <!--根据广告组编号获取广告项列表一--> <select id="getAdInfoByAdSysNo" resultType="ec.model.advertising.AdInfo" parameterType="int"> SELECT * FROM T_AD_ADINFO WHERE adSysNo = #{sysNo,jdbcType=INTEGER} </select

MyBatis 一对多关联查询

sqlxml文件 <?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="ClassStudent"&g

Mybatis一对多双向关联

在弄Mybatis的一对多关联的时候,不知道有没有遇到这样的问题,本来数据库中对应有多条数据,然而关联出来却只有一条数据,比如数据库中有个班级表和学生表,数据库中一个班级中对应了多个学生,但使用Mybatis做一对多关联的时候,查询出来的却只有一条.如果出现这样的问题,那么就是两张数据表中的主键重名了,导致在关联查询时分不清到底是那一张表了,因此有关联的数据表时,主键id不要重名,一对多关联实现如下: 数据表: CREATE TABLE tab_class ( c_id INT PRIMARY

Mybatis学习笔记-一对多关联

需求:根据classId查询对应的班级信息,包括学生,老师 Student实体类 public class Student {          private int id;          private String name;          //... } Classes 实体类 public class Classes {          private int id;          private String name;          private Teacher

mybatis collection 一对多关联查询,单边分页的问题总结!

若想直接通过sql实现多级关联查询表结构得有2 个必不可少的字段:id ,parentId,levelId id:主键id, parentId:父id levelId:表示第几级(表本身关联查询的时候需要用到,不然会有重复数据) 利用mybatis collection 实现一对多关联查询 Dto:(一级) public class ProvinceInfoDTO implements Serializable { private String id; private String name;

MyBatis关联查询,一对多关联查询

实体关系图,一个国家对应多个城市 一对多关联查询可用三种方式实现: 单步查询,利用collection标签为级联属性赋值: 分步查询: 利用association标签进行分步查询: 利用collection标签进行分步查询 单步查询 利用collection标签实现一对多单步关联查询: 指定进行关联查询的Java Bean字段,即collection标签的 property 属性: 指定集合中的Java Bean类型,即collection标签的 ofType属性: 实体类 public cla

MyBitis(iBitis)系列随笔之五:多表(一对多关联查询)

MyBitis(iBitis)系列随笔之一:MyBitis入门实例 MyBitis(iBitis)系列随笔之二:类型别名(typeAliases)与表-对象映射(ORM) MyBitis(iBitis)系列随笔之三:简单实现CRUD MyBitis(iBitis)系列随笔之四:多表(多对一查询操作) MyBitis(iBitis)系列随笔之五:多表(一对多关联查询) MyBitis(iBitis)系列随笔之六:mybitis与spring集成 这篇博文介绍的是多表中的一对多表关联查询还是按照上一

mybatis多对一关联

mybatis多对一关联查询实现 1.定义实体 定义实体的时候需要注意,若是双向关联,就是说双方的属性中都含有对方对象作为域属性出现, 那么在写toString()方法时需要注意,只让某一方输出即可,不要让双方的toString()都输出对方, 这样会形成递归调用,程序会出错,报堆栈溢出. Country实体类 Minsiter 实体类 2.数据库设计 a) country数据库 b) minsiter数据库 3.DAO层设计 4.service层设计 5.impl实现类 6.Controlle