实体类1: package com.etc.entity; import java.util.List; public class RoleInfo { private int rid; private String rname; private List<UserInfo> userInfos; public int getRid() { return rid; } public void setRid(int rid) { this.rid = rid; } public String getRname() { return rname; } public void setRname(String rname) { this.rname = rname; } public List<UserInfo> getUserInfos() { return userInfos; } @Override public String toString() { return "RoleInfo [rid=" + rid + ", rname=" + rname + "]"; } public void setUserInfos(List<UserInfo> userInfos) { this.userInfos = userInfos; } } 实体类2: package com.etc.entity; import java.util.List; public class UserInfo { private int uid; private String uname; private String upassword; private List<RoleInfo> roleInfos; @Override public String toString() { return "UserInfo [uid=" + uid + ", uname=" + uname + ", upassword=" + upassword + "]"; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getUpassword() { return upassword; } public void setUpassword(String upassword) { this.upassword = upassword; } public List<RoleInfo> getRoleInfos() { return roleInfos; } public void setRoleInfos(List<RoleInfo> roleInfos) { this.roleInfos = roleInfos; } } =============================================================== dao类1: package com.etc.dao; import java.util.List; import com.etc.entity.RoleInfo; import com.etc.entity.UserInfo; public interface RoleInfoDao { RoleInfo findById(int id); List<RoleInfo> findByUser(UserInfo user); //根据用户名查找所有的角色 void deleteByUser(UserInfo user);//删除指定用户名的所有的角色 } dao类2: package com.etc.dao; import java.util.List; import com.etc.entity.RoleInfo; import com.etc.entity.UserInfo; public interface UserInfoDao { UserInfo findById(int id); } =================================================================================================== 用到的工具类: package com.etc.utils; import java.io.InputStream; import java.sql.Connection; 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.lf5.util.Resource; //实现获取、释放mybatis数据库连接的工具类 public class MyBatisSessionFactory { //定义常量 private static String CONFIG_FILE_LOCATION="mybatis-config.xml"; //考虑到该工具类允许被多线程执行。因为封装1个线程池,让每个线程从线程池中获取1个连接。让1个线程对应 //1条数据库连接,这样更安全 //ThreadLocal的作用:让"线程"绑定"资源",这样就不会出现多个线程同享资源的情况。更安全。牺牲内存,换取”安全“ private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); private static InputStream is; //用于读取配置文件的流对象 private static SqlSessionFactory fac;//用于管理多个连接的工厂。一个工厂对应1个数据库。 //在该类的静态段中加载配置文件,这样可以确保只执行1次。 static { try { is = Resources.getResourceAsStream(CONFIG_FILE_LOCATION);//读取配置文件 fac = new SqlSessionFactoryBuilder().build(is);//通过配置文件创建1个连接工厂 } catch (Exception e) { e.printStackTrace(); } } //获取1条连接 public static SqlSession getSession() { SqlSession s = threadLocal.get(); //找线程池要1条连接 if(s==null) //第1次时,拿不到,则由工厂获取1条连接并放入线程池 { s = fac.openSession();//由工厂获取1条连接并放入线程池 threadLocal.set(s);//放入线程池 } return s; } //关闭连接 public static void closeSession() { SqlSession s = threadLocal.get();//找线程池要本线程对应的连接 threadLocal.set(null);//将该连接从线程池中清除 if(s!=null) s.close();//物理关闭连接 } } =============================================================================================== 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> <!-- 布局(配置) --> <typeAliases><!-- 类型别名 --> <typeAlias type="com.etc.entity.RoleInfo" alias="RoleInfo"/> <typeAlias type="com.etc.entity.UserInfo" alias="UserInfo"/> </typeAliases> <environments default="development"> <!-- 默认开发者模式 --> <environment id="development"> <transactionManager type="JDBC"/> <!-- 事务管理器 --> <dataSource type="POOLED"> <!-- 数据源--> <property name="url" value="jdbc:mysql://127.0.0.1/java?characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="root"/> <property name="driver" value="com.mysql.jdbc.Driver"/> </dataSource> </environment> </environments> <mappers><!-- 映射器 --> <mapper resource="com/etc/mapper/Role-mapper.xml"/> <mapper resource="com/etc/mapper/User-mapper.xml"/> </mappers> </configuration> ======================================================================================================= Role-mapper.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.etc.dao.RoleInfoDao"> <resultMap type="RoleInfo" id="Role"> <id column="rid" property="rid" /> <result column="rname" property="rname" /> </resultMap> <resultMap type="RoleInfo" id="RoleInfoMap" extends="Role"> <collection property="userInfos" resultMap="com.etc.dao.UserInfoDao.User"/> </resultMap> <!--根据角色编号,查找角色,必须查到关联的所有用户 --> <select id="findById" parameterType="java.lang.Integer" resultMap="RoleInfoMap"> select r.*,u.uid,u.uname,u.upassword from roleinfo r join r_user_role rur on r.rid = rur.rid join userinfo u on rur.uid = u.uid where r.rid=#{id} </select> <!-- 根据给定的用户名称,查找所有的角色信息 --> <select id="findByUser" parameterType="UserInfo" resultMap="RoleInfoMap"> select r.*,u.uid,u.uname,u.upassword from roleinfo r join r_user_role rur on r.rid = rur.rid join userinfo u on rur.uid = u.uid <if test="uname!=null"> where u.uname=#{uname} </if> </select> <delete id="deleteByUser" parameterType="UserInfo"> delete from r_user_role where uid in ( select uid from userinfo where uname=#{uname} ) </delete> </mapper> =============================================================================================================== User-mapper.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.etc.dao.UserInfoDao"> <resultMap type="UserInfo" id="User"> <id column="uid" property="uid"/> <result column="uname" property="uname"/> <result column="upassword" property="upassword"/> </resultMap> <resultMap type="UserInfo" id="UserInfoMap" extends="User"> <collection property="roleInfos" resultMap="Role"/> </resultMap> <!--根据角色编号,查找角色,必须查到关联的所有用户 --> <select id="findById" parameterType="java.lang.Integer" resultMap="UserInfoMap"> select u.*,r.rid,r.rname from userinfo u join r_user_role rur on u.uid = rur.uid join roleinfo r on rur.rid = r.rid where u.uid=#{id} </select> </mapper> =======================================================================================================================