【10】mybatis一对多关联查询
在实际项目中,经常是关联表的查询,在Java实体对象中,一对多可以根据List和Set来实现,两者在mybitis中都是通过collection标签来配合来加以实现。
本节场景就是:首先根据用户 ID 读取一个用户信息,然后再读取这个用户所发布贴子(post)。
首先准备工作,在Mysql中创建两个表用户表tuser,帖子表tpost
tuser表的结构和数据
帖子表 tpost 的结构和数据
从上面表中数据可以看出,用户id为1的发表了2个帖子,这就是一对多关系的体现
1,创建工程并配置所需环境
在eclipse中创建动态web项目mybatisDemoA9,将MyBatis目录下lib目录下的jar包,核心包mybatis-3.5.6.jar以及 MySQL 数据库的驱动 jar 包(mysql-connector-java-5.1.38-bin.jar)复制到WebContent /WEB-INF/lib 目录中,选择这些包,右键添加到编译路径中。
2、创建表对应的 JavaBean 对象TUser,TPost
在src目录下添加com.yiibai.pojo包,在该包下创建TUser和TPost两个实体类对象
TUser代码如下:
package com.yiibai.pojo;
import java.util.Date;
import java.util.List;
public class TUser {
private Date created;
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
private int id;
private String username;
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<TPost> getPosts() {
return posts;
}
public void setPosts(List<TPost> posts) {
this.posts = posts;
}
private String mobile;
private List<TPost> posts;
public String toString() {
return "User [id=" + id + ", name=" + username + "]";
}
}
TPost代码如下:
package com.yiibai.pojo;
public class TPost {
private String created;
public String getCreated() {
return created;
}
public void setCreated(String created) {
this.created = created;
}
private int id;
private TUser user;
private String title;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public TUser getUser() {
return user;
}
public void setUser(TUser 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;
}
private String content;
}
3,添加配置文件tuser.xml
在com.yiibai.pojo包下添加TUser.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.yiibai.pojo">
<!-- resultMap 是 MyBatis 中最复杂的元素,主要用于解决实体类属性名与数据库表中字段名不一致的情况,可以将查询结果映射成实体对象 -->
<!-- User 级联文章查询 方法配置 (一个用户对多个文章),id用于标识resultmap -->
<resultMap type="User" id="resultUserMap">
<!--子元素 <result> 用于表示 POJO 和 SQL 列名的映射关系。 -->
<!-- column是查询结果的列名,可以来自不同的表 -->
<!--property 映射到列结果的字段或属性 -->
<result property="id" column="id" />
<result property="username" column="username" />
<result property="mobile" column="mobile" />
<result property="created" column="created" />
<!-- collection用于一对多、多对多关联,column 对应 SQL 列 -->
<collection property="posts" ofType="com.yiibai.pojo.TPost"
column="userid">
<!--<id> 用于表示哪个列是主键 -->
<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" />
<result property="created" column="created" javaType="string"
jdbcType="VARCHAR" />
</collection>
</resultMap>
<!-- resultMap属性必须对应前面的id标识 -->
<select id="getUser" resultMap="resultUserMap" parameterType="int">
SELECT u.*,p.*
FROM tuser u, tpost p
WHERE u.id=p.userid AND
id=#{user_id}
</select>
</mapper>
4,添加mybatis配置文件
在src目录下创建配置文件mybatis-config.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>
<!-- 定义别名 -->
<typeAliases>
<typeAlias alias="User" type="com.yiibai.pojo.TUser" />
<typeAlias alias="Post" type="com.yiibai.pojo.TPost" />
</typeAliases>
<!-- 配置mybatis运行环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- MySQL数据库驱动 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<!-- 连接数据库的URL -->
<property name="url"
value="jdbc:mysql://localhost:3306/cctv?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 映射器,将mapper文件加入到配置文件中 -->
<mappers>
<mapper resource="com/yiibai/pojo/TUser.xml" />
</mappers>
</configuration>
5,在src下创建com.yiibai.test包,在包下添加测试类test,内容如下:
package com.yiibai.test;
import java.io.Reader;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.yiibai.pojo.TPost;
import com.yiibai.pojo.TUser;
public class test {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static {
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SqlSession session = sqlSessionFactory.openSession();
try {
int userid = 1;//查询用户id为1的帖子
TUser user = session.selectOne("com.yiibai.pojo.getUser", 1);
System.out.println("用户名: "+user.getUsername()+",");
List<TPost> posts = user.getPosts();
for(TPost p : posts) {
System.out.println("标题:" + p.getTitle());
System.out.println("内容:" + p.getContent());
System.out.println("时间:" + p.getCreated());
}
} finally {
session.close();
}
}
}
项目代码结构如图:
6,运行代码程序,显示如下图:
用户id为1的帖子有2条,在数据库中也是这两条
通过这个例子,我们理解了一对多的关联实现过程方法。
本节代码 mybatisDemoA9,下节继续。