实体类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>
=======================================================================================================================

  

mybatis---demo1--(n-n)----bai的更多相关文章

  1. mybatis——延迟加载

    ------------------------------------------------SqlMapConfig.xml------------------------------------ ...

  2. mybatis——使用mapper代理开发方式

    ---------------------------------------------------------------generatorConfig.xml------------------ ...

  3. eclipse + maven 搭建springMVC+Spring+mybatis 系统

    首先需要下载maven 安装maven插件.自行百度. 1: 创建maven系统 http://huxiaoheihei.iteye.com/blog/1766986 2:添加pom依赖: pom.x ...

  4. Spring+MyBatis实践—MyBatis数据库访问

    关于spring整合mybatis的工程配置,已经在Spring+MyBatis实践—工程配置中全部详细列出.在此,记录一下几种通过MyBatis访问数据库的方式. 通过sqlSessionTempl ...

  5. mybatis学习(一)一个在idea下的实例

    今天总结的是mybatis,首先说mybatis是什么? MyBatis 是一个简化和实现了 Java 数据持久化层(persistence layer)的开源框架,它抽象了大量的 JDBC 冗余代 ...

  6. maven Spring+Spring MVC+Mybatis+mysql轻量级Java web开发环境搭建

    之前一直在做的一个GIS系统项目,采用了jsp+servlet框架,数据传输框架采用了apache的thrift框架,短时多传的风格还不错,但是较其他的java web项目显得有点太臃肿了,现在给大家 ...

  7. Mybatis(三)

    1 Mybaits--动态SQL 动态SQL是Mybatis强大特性之一.极大的简化我们拼装SQL的操作. 动态SQL元素和使用JSTL或其他类似基于XML的文本处理器相似. Mybatis采用功能强 ...

  8. Mybatis(二)

    1 Mybatis映射文件--增删改查 POJO类 package cn.demo1; import org.apache.ibatis.type.Alias; /** * 描述:POJO */ @A ...

  9. mybatis自定义代码生成器(Generator)——自动生成model&dao代码

    花了两天的时间研究了下mybatis的generator大体了解了其生成原理以及实现过程.感觉generator做的非常不错,给开发者也留足了空间.看完之后在generator的基础上实现了自定义的生 ...

  10. 2019-04-28 Mybatis generator逆向工程生成的Example代码分析

    今天主要对Mybatis generator生成的DAO层等进行分析,讲解Example类的使用和扩展 1.先在数据库建表 CREATE TABLE `department` ( `fid` ) NO ...

随机推荐

  1. jprofile查看hprof文件[转]

    用jprofile打开hprof文件,查看内存泄露情况,有几个常用的功能说明一下: 工具下载:到官网下载jprofile7.0.1 64位的.再申请一个注册号,注册号的申请好像是一个邮件只能用一次. ...

  2. springcloud-声明式调用服务Feign

    springcloud项目例子:链接:https://pan.baidu.com/s/1O1PKrdvrq5c8sQUb7dQ5Pg 密码:ynir 作用: 基于Netflix Feign整合了Rib ...

  3. Android Studio2.3中简单配置,释放C盘空间

    重新安装了一下android studio,由于占用了太多的C盘空间.记录一下,在网上收集到的studio中两个主要占用C盘空间的文件,我们将它移除C盘. 原博地址: http://blog.csdn ...

  4. 转 Nova: 虚机的块设备总结 [Nova Instance Block Device]

    和物理机一样,虚拟机包括几个重要的部分:CPU.内存.磁盘设备.网络设备等.本文将简要总结虚机磁盘设备有关知识. 1. Nova boot CLI 中有关虚机块设备的几个参数 nova boot CL ...

  5. C#验证类

    #region 是不是中国电话,格式010-85849685 /**////<summary> /// 是不是中国电话,格式010-85849685 ///</summary> ...

  6. ps常用键

    @updata 2016-7-31 切图 界面设置 视图 --显示 ---智能参考线       72 标尺  ctrl + r 窗口  ----信息 字符  历史记录 颜色 选RGB   信息图选项 ...

  7. css3——transition属性和opacity属性

    [transition-duration] 是一个css3属性,规定完成过度效果需要花费的时间(一秒或毫秒计).语法:transition-duration: time;time :    规定完成过 ...

  8. Java中常见的比较器的实现方法

    在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用& ...

  9. uva 10168 哥德巴赫猜想

    https://vjudge.net/problem/UVA-10168 给出一个整数n,问是否能将它化为四个素数相加的形式,如果可以的话就输出这四个数.显然n<8时是不可能的.对于大于等于8得 ...

  10. SEM

    SEM是Search Engine Marketing的缩写,中文意思是搜索引擎营销.SEM是一种新的网络营销形式.SEM所做的就是全面而有效的利用搜索引擎来进行网络营销和推广.SEM追求最高的性价比 ...