mybatis 多表查询二

1.实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class User {
private Integer id;
private String name;
private Integer gender;
private Integer age;
private Address address;
......
}
public class Address {
private Integer id;
private String province;
private String city;
private String district;
}

2.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.xiang.mapper.UserMapper">
<!-- 嵌套结果 -->
<resultMap type="com.xiang.domain.User" id="UserResultMap">
<id property="id" column="userId" jdbcType="INTEGER" javaType="java.lang.Integer"/>
<result property="name" column="name" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result property="gender" column="gender" jdbcType="INTEGER" javaType="java.lang.Integer"/>
<result property="age" column="age" jdbcType="INTEGER" javaType="java.lang.Integer"/>
<association property="address" javaType="com.xiang.domain.Address">
<id property="id" column="id" jdbcType="INTEGER" javaType="java.lang.Integer"/>
<result property="province" column="province" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result property="city" column="city" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result property="district" column="district" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result property="detail" column="detail" jdbcType="VARCHAR" javaType="java.lang.String"/>
</association>
</resultMap>

<select id="findById" parameterType="int" resultMap="UserResultMap">
SELECT u.id userId,u.name,u.gender,u.age,a.id,a.province,a.city,a.district,a.detail
FROM user u LEFT JOIN address a on u.addressId = a.id where u.id = #{id}
</select>

<select id="findAll" parameterType="int" resultMap="UserResultMap">
SELECT u.id userId,u.name,u.gender,u.age,a.id,a.province,a.city,a.district,a.detail
FROM user u LEFT JOIN address a on u.addressId = a.id
</select>
</mapper>

3.mapper

1
2
3
4
public interface UserMapper {
public User findById(Integer id);
public List<User> findAll();
}

4.dao

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class UserDao {
public User findById(Integer id){
User user = new User();
SqlSession sqlSession = null;
sqlSession = GetSqlSessionFactory.getInstance().getSqlSessionFactory().openSession();
if (sqlSession != null) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
user = userMapper.findById(id);
sqlSession.close();
}
return user;
};
public List<User> findAll(){
List<User> users = new ArrayList<User>();
SqlSession sqlSession = null;
sqlSession = GetSqlSessionFactory.getInstance().getSqlSessionFactory().openSession();
if (sqlSession != null) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
users = userMapper.findAll();
sqlSession.close();
}
return users;
};
}

5.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class UserService {
public User findById(String id){
UserDao userDao = new UserDao();
User user = new User();
if (id != null && !"".equals(id.trim())) {
user = userDao.findById(Integer.valueOf(id));
}
return user;
};
public List<User> findAll(){
UserDao userDao = new UserDao();
List<User> users = new ArrayList<User>();
users = userDao.findAll();
return users;
};
}

xml还有一种嵌套查询的写法,不过官方不建议,会产生N+1问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<resultMap type="com.xiang.domain.User" id="UserResultMap">
<id property="id" column="id" jdbcType="INTEGER" javaType="java.lang.Integer"/>
<result property="name" column="name" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result property="gender" column="gender" jdbcType="INTEGER" javaType="java.lang.Integer"/>
<result property="age" column="age" jdbcType="INTEGER" javaType="java.lang.Integer"/>
<association property="address" javaType="com.xiang.domain.Address" column="addressId" select="findAddress"></association>
</resultMap>

<select id="findAddress" parameterType="int" resultType="com.xiang.domain.Address">
SELECT id,province,city,district,detail FROM address WHERE id=#{id}
</select>

<select id="findById" parameterType="int" resultMap="UserResultMap">
SELECT id,name,gender,age,addressId FROM user where id=#{id}
</select>

<select id="findAll" parameterType="int" resultMap="UserResultMap">
SELECT id,name,gender,age,addressId FROM user
</select>