数据库表
user表
role表
user_role表
员工jack有两个角色:java架构师和java开发工程师
员工pitter有两个角色:前端开发工程师和开发经理
需求:查询员工-角色中间表,同时关联显示员工表和角色表的信息
数据库查询语句:
SELECT u.*,r.`rid`,r.`rname` FROM role r LEFT JOIN user_role ur ON r.`rid`=ur.`RID` LEFT JOIN USER u ON u.`uid`= ur.`UID`
代码部分
1、User.java
package com.qingruan.bean; public class User { private Integer uid; private String username; private String birthday; private String sex; private String address; //实现user到role的一对多查询 //private List<Role> roles; @Override public String toString() { return "User{" + "uid=" + uid + ", username='" + username + '\'' + ", birthday='" + birthday + '\'' + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
2、Role.java
package com.qingruan.bean; import java.util.List; public class Role { private Integer roleId; private String roleName; //多对多关系映射,一个角色赋予多个用户 private List<User> Users; @Override public String toString() { return "Role{" + "roleId=" + roleId + ", roleName='" + roleName + '\'' + ", Users=" + Users + '}'; } public List<User> getUsers() { return Users; } public void setUsers(List<User> users) { Users = users; } public Integer getRoleId() { return roleId; } public void setRoleId(Integer roleId) { this.roleId = roleId; } public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } }
3、IRoleDao.java
package com.qingruan.dao; import com.qingruan.bean.Role; import java.util.List; public interface IRoleDao { //查询所有角色 public List<Role> findAll(); }
4、RoleDao.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">
<!--namespace 命名空间 包的全限定名 包名+类名 -->
<mapper namespace="com.qingruan.dao.IRoleDao">
<!--定义多对多-->
<resultMap id="roleMap" type="role">
<id column="rid" property="roleId"></id>
<result column="rname" property="roleName"></result>
<collection property="Users" ofType="user">
<id column="uid" property="uid"></id>
<result column="username" property="username"></result>
<result column="birthday" property="birthday"></result>
<result column="sex" property="sex"></result>
<result column="address" property="address"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="roleMap">
SELECT u.*,r.`rid`,r.`rname` FROM role r
LEFT JOIN user_role ur ON r.`rid`=ur.`RID`
LEFT JOIN USER u ON u.`uid`= ur.`UID`
</select>
</mapper>
5、mybatis-config.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> <!-- 指定日志引用的是log4j--> <settings> <setting name="logImpl" value="LOG4J"/> </settings> <!--给实体类配置别名--> <typeAliases> <!-- type实体类 alias别名 定义一个别名 <typeAlias type="com.qingruan.bean.Dept" alias="Dept"></typeAlias> --> <!--批量定义别名,扫描整个包下的所有的类,别名为类名,首字母大小写都可以--> <package name="com.qingruan.bean"/> </typeAliases> <!--可以设置多个运行环境,满足不同需要,例如 开发、测试、生产环境上有不同一配置 --> <environments default="mysql"> <environment id="mysql"> <!--事务管理类型主要有jdbc和managed,前者依赖于数据源获得的连接,后者依赖于容器 --> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <!-- 如果数据库设置为UTF-8,则URL参数连接需要添加?useUnicode=true&characterEncoding=UTF-8,如下 --> <property name="url" value="jdbc:mysql://localhost:3306/mydata1?useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> </environment> </environments> <!-- 告知mybaties映射配置的位置--> <mappers> <mapper resource="com/qingruan/dao/RoleDao.xml"></mapper> </mappers> </configuration>
6、MybatisTest.java
package com.qingruan.test; import com.qingruan.bean.Role; import com.qingruan.dao.IRoleDao; 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.junit.After; import org.junit.Before; import org.junit.Test; import java.io.InputStream; import java.util.List; public class MybatisTest { private InputStream is; private SqlSessionFactoryBuilder builder; private SqlSessionFactory sessionFactory; private SqlSession session; private IRoleDao dao; @Before //在测试方法执行之前执行 public void init() throws Exception{ is=Resources.getResourceAsStream("mybatis-config.xml"); //创建sqlSessionFacotory的构建着对象 builder=new SqlSessionFactoryBuilder(); //通过构建着对象创建工厂对象 sessionFactory = builder.build(is); //获得session对象 session = sessionFactory.openSession(); //使用session创建dao接口的代理对象 dao = session.getMapper(IRoleDao.class); } @After //在测试方法执行完成之后执行 public void destroy() throws Exception{ //提交事务 增删改后一定要控制事物的提交 session.commit(); //方式资源 session.close(); is.close(); } @Test public void testFindAll(){ List<Role> roles = dao.findAll(); for (Role role : roles) { System.out.println(role); //System.out.println(role.getUsers()); } } }