在实际的项目应用中,通常需要两个表进行联合查询。
最近两天在学习mybatis,就记录一下mybatis的多对一联合查询。
接着上一篇博文,这里需要添加一个表:
article表结构:
前几篇博文没有上传user的表结构:
代码:
实体类:User.java:
package com.mfc.entity;
/*
* 实体类
* */
public class User {
private int id;
private String userName;
private int userAge;
private String userAddress;
//实体类以及set、get方法省略...
}
实体类:Article.java:
package com.mfc.entity;
public class Article {
private int id;
//数据库表中这里是userid,为了配置关联数据,这里使用User的实体替代userid
private User user;
private String title;
private String content;
//构造方法以及set、get方法省略...
}
注意:这里只需要一个User.xml:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mfc.dao.UserDao">
<!--User联合文章进行查询配置方法一(多对一)-->
<resultMap id="resultUserArticleList" type="Article">
<id property="id" column="id"></id>
<result property="title" column="title"></result>
<result property="content" column="content"></result>
<association property="user" javaType="User">
<id property="id" column="id"></id>
<result property="userName" column="userName"></result>
<result property="userAddress" column="userAddress"></result>
</association>
</resultMap>
<!--查询-->
<select id="getUserArticles" parameterType="int" resultMap="resultUserArticleList">
select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article
where user.id=article.userid and user.id=#{id}
</select>
</mapper>
UserDao.java:
import java.util.List;
import com.mfc.entity.Article;
public interface UserDao {
public List<Article> getUserArticles(int id);
}
Configuration.xml:
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- Configuration.xml是 mybatis 用来建立 sessionFactory 用的,
里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如
<typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/>
这个别名非常重要,你在 具体的类的映射中,
比如User.xml 中 resultType 就是对应这里的。要保持一致,当然这里的 resultType 还有另外单独的定义方式-->
<typeAliases>
<typeAlias alias="User" type="com.mfc.entity.User"/>
<typeAlias alias="Article" type="com.mfc.entity.Article"/>
</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://127.0.0.1:3306/mybatis" />
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--要映射的类的xml配置文件-->
<mappers>
<mapper resource="com/mfc/entity/User.xml"/>
</mappers>
</configuration>
测试类Test.java:
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.mfc.dao.UserDao;
import com.mfc.entity.Article;
public class Test {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static {
try {
reader = Resources.getResourceAsReader("Configuration.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SqlSession session = sqlSessionFactory.openSession();
try {
UserDao userOperation = session.getMapper(UserDao.class);
List<Article> articles = userOperation.getUserArticles(2);
for (Article article : articles) {
System.out.println("作者:" + article.getUser().getUserName() + " 标题:" + article.getTitle() + " 内容:"
+ article.getContent());
}
} finally {
session.close();
}
}
}
经测试可以使用!
2017年12月26日10:50:28补充:
注意:在配置Configuration.xml文件时,里面的配置内容中,配置是有顺序的,否则报错,报错内容为:
The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,
objectFactory?,objectWrapperFactory?,reflectorFactor y?,plugins?,environments?,databaseIdProvider?,mappers?)".
意思就是要按照报错提示的顺序配置
2017年12月26日13:33:42补充:
关联查询时两个表的id名称不能一样(比如说字段名不能都叫id),否则就算有多条数据也只能查出一条。