工程的目录结构:
有两个表,一个文章表article ,一个用户表user。
create table article (id int(11) not null auto_increment,
userid int(11) not null,
title varchar(100) not null,
content text not null,
primary key (id))ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into article(id,userid,title,content) values(1,1,'test_title','text_content');
insert into article(id,userid,title,content) values(2,1,'test_title_2','text_content_2');
insert into article(id,userid,title,content) values(3,1,'test_title_3','text_content_3');
insert into article(id,userid,title,content) values(4,1,'test_title_4','text_content_4');
create table user (id int(11) not null auto_increment,
userName varchar(50) default null,
userAge int(11) default null,
userAddress varchar(200) default null,
primary key(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into user(id,userName,userAge,userAddress) values(1,'summer','100','上海');
现在要查询,根据用户的ID来查询他所拥有的文章。那么需要编写SQL语句如下:
select a.id, a.userName ,a.userAddress ,b.id aid, b.title,b.content
from user a,article b
where a.id=b.userid and a.id=#{id}
现在就来贴下相关的JAVA代码和映射文件吧,该说的都在注释里了。
User.java
package com.mybatis.model;
public class User {
private int id;
private String userName;
private String userAge;
private String userAddress;
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 getUserAge() {
return userAge;
}
public void setUserAge(String userAge) {
this.userAge = userAge;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
}
Article.java
package com.mybatis.model;
public class Article {
private int id;
private User user; //文章的用户定义一个User对象,而不是int 类型
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;
}
}
接口类
IUserDao.java
package com.mybatis.dao;
import java.util.List;
import com.mybatis.model.Article;
public interface IUserDao {
public List<Article> getUserArticles(int id);
}
总配置文件configution.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 type="com.mybatis.model.User" alias="User"/>
<typeAlias type="com.mybatis.model.Article" alias="Article"/>
</typeAliases>
<!-- 数据源配置,这里用MySQL数据库 -->
<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/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- book.xml装载进来,等同于把Dao的实现类装载进来 -->
<mapper resource="com/mybatis/model/User.xml"/>
</mappers>
</configuration>
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.mybatis.dao.IUserDao">
<!-- User联合Article进行查询 (多对一的方式)-->
<resultMap type="Article" id="resultUserArticleList">
<id property="id" column="aid"/>
<result property="title" column="title"/>
<result property="content" column="content"/>
<!--关联一个用户 ,如果是关联多个的话,就需要用collection了-->
<association property="user" javaType="User"> <!-- 这个 property="user" 对应的是Article中的User user属性-->
<id property="id" column="id"/>
<result property="userName" column="userName"/>
<result property="userAddress" column="userAddress"/>
</association>
</resultMap>
<select id="getUserArticles" parameterType="int" resultMap="resultUserArticleList">
select a.id, a.userName ,a.userAddress ,b.id aid, b.title,b.content
from user a,article b
where a.id=b.userid and a.id=#{id}
</select>
</mapper>
总后,编写个测试类.
package com.mybatis.test;
import java.io.IOException;
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.mybatis.dao.IUserDao;
import com.mybatis.model.Article;
public class Test {
/***
* 获得MyBatis SqlSessionFactory
* SqlSessionFactory 负责创建SqlSession ,一旦创建成功,就可以用SqlSession实例来执行映射语句
* ,commit,rollback,close等方法
* @return
*/
private static SqlSessionFactory getSessionFactory(){
SqlSessionFactory sessionFactory=null;
String resource="configuration.xml";
try {
sessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
} catch (IOException e) {
e.printStackTrace();
}
return sessionFactory;
}
/**
* main 方法
* @param args
*/
public static void main(String[] args) {
SqlSession session=getSessionFactory().openSession();
try {
IUserDao userDao=session.getMapper(IUserDao.class);
//传入用户的id=1
List<Article> listArticle=userDao.getUserArticles(1);
for(Article article:listArticle){
System.out.println(article.getTitle()+":"+article.getContent()+
":作者是:"+article.getUser().getUserName()+":地址:"+
article.getUser().getUserAddress());
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
session.close();
}
}
}
运行后结果如下:
test_title:text_content:作者是:summer:地址:上海
test_title_2:text_content_2:作者是:summer:地址:上海
test_title_3:text_content_3:作者是:summer:地址:上海
test_title_4:text_content_4:作者是:summer:地址:上海