1.首先数据库中存在两张表,用户表User、角色表Role。
2.分析表User和表Role的映射关系。
User对Role:一对一。
Role对User:一对多。
一对一、多对一:使用association标签。
一对多、多对多:使用collection标签。
3.一对一映射实例。
3.1:使用SQL语句查询User表与Role表中相同的roleId与输入的值匹配,然后将Role表中的字段roleName的记录输出。
3.2:使用Maven创建生成多表文章使用Maven搭建mybatis工程。
3.3:主表User的xml文件。
<resultMap id="BaseResultMap" type="com.openlab.pojo.User" >
<!--id就是第一个查询标签中的resultMap的引用,type是实体类的全类名-->
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Tue Jul 28 20:18:38 CST 2020.
-->
<id column="id" property="id" jdbcType="VARCHAR" />
<result column="username" property="username" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" />
<result column="roleId" property="roleid" jdbcType="INTEGER" />
<result column="iconURL" property="iconurl" jdbcType="VARCHAR" />
<association property="role" javaType="com.openlab.pojo.Role">
<id column="roleId" property="roleid" jdbcType="INTEGER" />
<result column="roleName" property="rolename" jdbcType="VARCHAR" />
</association>
<!--property对应实体类中的属性名-->
<!--column为select标签传参-->
<!--javaType说明property中的值是什么类型-->
</resultMap>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
<!--id为接口中实现的方法名,resultMap为返回值类型,由于返回值包含一个User对象,所以不能用resultType-->
<!--resultType为返回值类型-->
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Tue Jul 28 20:18:38 CST 2020.
-->
select
u.id,u.username,u.password,u.iconURL,u.roleId,r.roleId,r.roleName
from user u,role r
where u.roleId = r.roleId
and id = #{id,jdbcType=VARCHAR}
</select>
3.4:实体类User。
private Role role;
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
//加入关联的Role角色表
3.5:方法类。
由于一对一查询,SQL语句放回的为单个对象,不需要使用List对象。
3.6:一对一测试类。
package com.openlab.test;
import java.io.IOException;
import java.io.InputStream;
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 org.apache.log4j.Logger;
import com.openlab.mapper.UserMapper;
import com.openlab.pojo.User;
public class OneToOneTest {
public static void main(String[] args) {
try {
/**
* 读取资源文件,用到getResourceAsStream读取。调用classLoderWarapper中的方法,通过对
* classLoder[]数组遍历,判断读取的流是否为null,不为null返回InputStream对象
*/
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//加载配置文件上边导入的mybatis-config.xml
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectByPrimaryKey("00001");
System.out.println(user.getRole().getRolename());
//获取User表中id为00001对象中的属性roleId与Role表中roleId相等的Role表中属性RoleName值
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3.7:结果呈现。
4.一对多映射实例。
4.1:查询下是管理员的用户有哪些?
4.2:使用Maven创建生成多表文章使用Maven搭建mybatis工程。
4.3:主表Role的xml文件。
<resultMap id="BaseResultMap" type="com.openlab.pojo.Role" >
<!--id就是查询标签中的resultMap的引用,type是实体类的全类名-->
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Tue Jul 28 20:18:38 CST 2020.
-->
<id column="roleId" property="roleid" jdbcType="INTEGER" />
<result column="roleName" property="rolename" jdbcType="VARCHAR" />
<collection property="user" javaType="ArrayList" ofType="com.openlab.pojo.User">
<id column="id" property="id" jdbcType="VARCHAR" />
<result column="username" property="username" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" />
<result column="roleId" property="roleid" jdbcType="INTEGER" />
<result column="iconURL" property="iconurl" jdbcType="VARCHAR" />
</collection>
<!--ofType 映射到集合中的实体类的全类名,就是list集合中是User-->
<!--javaType 属性的类型,可以写成List,或者不写这个属性-->
<!--collection 表示这个类型是一个集合-->
</resultMap>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Tue Jul 28 20:18:38 CST 2020.
-->
select
u.id,u.username,u.password,u.iconURL,u.roleId,r.roleId,r.roleName
from role r,user u
where r.roleId = #{id,jdbcType=INTEGER}
and r.roleId = u.roleId
</select>
4.4:实体类Role。
private List<User> user;
public List<User> getUser(){
return user;
}
public void setUser(List<User> user){
this.user=user;
}
//加入关联的表User
4.5:方法类。
SQL语句返回的为多个对象,需要使用到List。
List<Role> selectByPrimaryKey(Integer roleid);
4.6:一对多测试类。
package com.openlab.test;
import java.io.IOException;
import java.io.InputStream;
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.openlab.mapper.RoleMapper;
import com.openlab.pojo.Role;
import com.openlab.pojo.User;
public class OneToManyTest {
public static void main(String[] args) {
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
RoleMapper mapper = session.getMapper(RoleMapper.class);
//获取对象集
List<Role> list = mapper.selectByPrimaryKey(1);
//遍历输出结果roleId为1的User对象中的属性Username值
for(Role i : list){
for(User j : i.getUser()){
System.out.println(j.getUsername());
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4.7:结果呈现。