前言:创建项目啥的就不说了,直接开始讲怎么从model开始
我有两个实体类(model):User和City
一对多的关系是,一个User可以去过很多个City。
City的创建如下
说明,按照表的字段来创建类
package com.tqz.model;
public class City {
private int city_id;
private int user_id;
private String cityname;
public int getCity_id() {
return city_id;
}
public void setCity_id(int city_id) {
this.city_id = city_id;
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getCityname() {
return cityname;
}
public void setCityname(String cityname) {
this.cityname = cityname;
}
}
User的创建如下:
说明:在User类里面,要写一个private List<City> cities;//指向去过的城市
它是用来存User对应的多个City的
package com.tqz.model;
import java.util.List;
public class User {
private int id;
private String username;
private int tel;
private String address;
private List<City> cities;//指向去过的城市
public List<City> getCities() {
return cities;
}
public void setCities(List<City> cities) {
this.cities = cities;
}
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 int getTel() {
return tel;
}
public void setTel(int tel) {
this.tel = tel;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
关键的来了: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.tqz.imapper.IUser">
<resultMap type="User" id="UserBeenToResult">
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="username" jdbcType="VARCHAR" property="username"/>
<result column="tel" jdbcType="INTEGER" property="tel"/>
<result column="address" jdbcType="VARCHAR" property="address"/>
<collection property="cities" ofType="City">
<id column="city_id" jdbcType="INTEGER" property="city_id"/>
<id column="user_id" jdbcType="INTEGER" property="user_id"/>
<result column="cityname" jdbcType="VARCHAR" property="cityname"/>
</collection>
</resultMap>
<select id="getUserBeenToCity" resultMap="UserBeenToResult"
parameterType="String">
SELECT u.id,u.username,u.tel,u.address,
c.city_id,c.user_id,c.cityname
FROM user u
inner join city c
ON c.user_id=u.id
WHERE u.username=#{name}<!-- 写好sql语句很关键 -->
</select>
</mapper>
说明:用resultMap + collection来处理一堆多的关系
用法:在resultMap标签里面再添加collection标签
实现:resultMap的type是User,表示查询最终的结果是User对象(即一个)
collection的ofType是City,表示要整理出的集合是City对象(即多个)
collection的property的值是cities,这个是Uesr的属性
collection下面的内容就是封装对象的操作了
collection操作结束后的结果是一个集合,赋给User的cities
重点:select里面的sql语句
SELECT u.id, u.username, u.tel, u.address,
c.city_id, c.user_id, c.cityname
FROM user u
inner join city c
ON c.user_id=u.id
WHERE u.username=#{name}
因为是关联两个表,所以要在查询的字段前面加上字段的标识符【 u.id | c.city_id】
inner join city c表示关联city这个表c是给他起的别名就像u一样
ON c.user_id=u.id
WHERE u.username=#{name}是关联条件
条件:user_id是存在表city里面的
id是存在user里面的
表city里面可以存在多个相同的user_id
c.user_id=u.id就表示在表city里面找与user相同的id(这个id可以有多个,即:一对 多)
测试
public class Demo {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
private static SqlSession session;
static {
try {
reader = Resources.getResourceAsReader("com/tqz/config/Configuration.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSession() {
return sqlSessionFactory;
}
public static void testgetUserBeenToCity(String name) {
//获取连接
session = sqlSessionFactory.openSession();
//获取Mapper
IUser iUser = session.getMapper(IUser.class);
User user = new User();
user = iUser.getUserBeenToCity(name);
System.out.println("用户id为:" + user.getId());
System.out.println("用户名为:" + user.getUsername());
System.out.println("用户tel为:" + user.getTel());
System.out.println("用户address为:" + user.getAddress());
System.out.println("*********************************");
System.out.println("去过的城市:");
for (City city : user.getCities()) {
System.out.println(city.getCityname());
}
}
public static void main(String[] args) {
try {
//一对多:一个人可以去过很多城市
testgetUserBeenToCity("田钦政");
} finally {
session.close();
}
}
}
可以看出,查询一个用户去过的城市,结果出来很多个他去过的城市。
源代码放在我的GitHub上 下载