mybatis配置多对一或一对一关系

本例以部门用户关系为例说明多对一的关系配置;

第一步,编写部门的bean

package com.hsk.mybatis.bean;

import java.util.List;

public class DeptBean {

	private String deptCode;
	private String deptName;
	private String cmpyCode;
	private List<UserBean> userList;
	public List<UserBean> getUserList() {
		return userList;
	}
	public void setUserList(List<UserBean> userList) {
		this.userList = userList;
	}
	public String getDeptCode() {
		return deptCode;
	}
	public void setDeptCode(String deptCode) {
		this.deptCode = deptCode;
	}
	public String getDeptName() {
		return deptName;
	}
	public void setDeptName(String deptName) {
		this.deptName = deptName;
	}
	public String getCmpyCode() {
		return cmpyCode;
	}
	public void setCmpyCode(String cmpyCode) {
		this.cmpyCode = cmpyCode;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return deptName+"["+deptCode+"]"+cmpyCode;
	}
}

第二步编写用户bean

package com.hsk.mybatis.bean;

/**
 * 用户bean
 * @author huangshikai
 *
 */
public class UserBean {

	private String userCode;
	private String userName;
	private String deptCode;
	private String cmpyCode;
	private DeptBean deptBean;
	public DeptBean getDeptBean() {
		return deptBean;
	}
	public void setDeptBean(DeptBean deptBean) {
		this.deptBean = deptBean;
	}
	public String getCmpyCode() {
		return cmpyCode;
	}
	public void setCmpyCode(String cmpyCode) {
		this.cmpyCode = cmpyCode;
	}
	public String getUserCode() {
		return userCode;
	}
	public void setUserCode(String userCode) {
		this.userCode = userCode;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getDeptCode() {
		return deptCode;
	}
	public void setDeptCode(String deptCode) {
		this.deptCode = deptCode;
	}
	@Override
	public String toString() {
		return "UserBean [userCode=" + userCode + ", userName=" + userName + ", deptCode=" + deptCode + "]"+deptBean.toString();
	}
}

 

 第三步编写用户持久层接口及UserDao

package com.hsk.mybatis.dao;

import java.util.List;

import com.hsk.mybatis.bean.UserBean;

/**
 * 用户dao接口,操作用户信息
 * @author huangshikai
 *
 */
public interface UserDao {

	/**
	 * 按用户编码查询用户信息
	 * @param userCode
	 * @return
	 * @throws Exception
	 */
	public UserBean findUserById(String userCode) throws Exception;
	
	public void insertUser(UserBean userBean) throws Exception;
	
	public void deleteUser(String userCode) throws Exception;
	
	public UserBean getUserAndDeptByCode(String userCode);
	
	public List<UserBean> getUsersByDeptCode(String deptCode);
}

第四步编写userMappper.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命名空间对sql分类化管理,隔离不同表的sql语句 -->
<mapper namespace="com.hsk.mybatis.dao.UserDao">

	<!-- 配置结果集字段和javabean字段对应关系 -->
	<!-- 配置多对一的人员map方式一 -->
	<resultMap id="userMap" type="com.hsk.mybatis.bean.UserBean">
        <id property="userCode" column="USER_CODE" />
        <result property="userName" column="USER_NAME"/>
        <result property="deptCode" column="DEPT_CODE"/>
        <result property="cmpyCode" column="CMPY_CODE"/>
        <association property="deptBean"  column="DEPT_CODE" 
        javaType="com.hsk.mybatis.bean.DeptBean" 
        resultMap="deptMap"></association>
    </resultMap>
    
    <resultMap type="com.hsk.mybatis.bean.DeptBean" id="deptMap">
    	<id property="deptCode" column="DEPT_CODE"></id>
    	<result property="deptName" column="DEPT_NAME"/>
    	<result property="cmpyCode" column="CMPY_CODE"/>
    </resultMap>
    
    
    <!-- 配置多对一的人员map方式二 -->
    <resultMap type="com.hsk.mybatis.bean.UserBean" id="userAndDeptMap">
    	<id property="userCode" column="USER_CODE"></id>
    	<result property="userName" column="USER_NAME"/>
    	<result property="deptCode" column="DEPT_CODE"/>
    	<result property="cmpyCode" column="CMPY_CODE"/>
    	<association property="deptBean" column="DEPT_CODE" javaType="com.hsk.mybatis.bean.DeptBean">
    		<id property="deptCode" column="DEPT_CODE"/>
    		<result property="deptName" column="DEPT_NAME"/>
    		<result property="cmpyCode" column="CMPY_CODE"/>
    	</association>
    </resultMap>
    
    <select id="getUserAndDeptByCode" parameterType="String" resultMap="userAndDeptMap">
    	SELECT user_code,a.dept_code,a.user_name,a.cmpy_code,
    	b.dept_code,b.dept_name,b.cmpy_code from sy_org_user a
    	left join sy_org_dept b
    	on a.dept_code=b.dept_code
    	where a.user_code=#{userCode}
    </select>
    
    <select id="getUsersByDeptCode" parameterType="String" resultMap="userAndDeptMap">
    SELECT user_code,a.dept_code,a.user_name,a.cmpy_code,
    	b.dept_code,b.dept_name,b.cmpy_code from sy_org_user a
    	left join sy_org_dept b
    	on a.dept_code=b.dept_code
    	where a.dept_code=#{deptCode}
    </select>
    
	<!--
	 统一命名空间下id唯一 
	parameterType输入参数类型可以是java简单的数据类型也可以是java对象,这里指定string
	#{}表示占位符
	#{userCode}其中userCode为输入参数,参数名称为userCode
	resultMap指定sql输出结果所映射的java对象,注意resultMap要配置java对象属性与数据库字段对应关系
	resultType指定sql输出结果单条记录所映射的java对象,注意resultType配置的java类的属性需要与数据库字段名称一致
	-->
   <select id="findUserById" parameterType="String" resultMap="userMap">
       SELECT USER_CODE,USER_NAME,DEPT_CODE FROM SY_ORG_USER WHERE USER_CODE=#{userCode}
   </select>
   
   <!-- 
   	根据用户名称查找对应的用户集合
   	${}表示拼接sql串,将传参不加修饰的拼接在sql中,value表示简单类型的传参值
   	${}会引起sql注入,如传入 ' OR 1=1 OR '
   	#{}占位符,{}中可以写value或者其他值。根据传参类型修饰传参后拼接在sql中,如传入整型结果就是a=1,字符串就是a='1'
   	${value}:接收输入的传参内容,如果是简单的传参类型则${}中只能用value
   	#{},${}通过OGNL读取对象的属性值,通过  属性.属性.属性.....方式获取对象属性值
   	一般不推荐使用${}方式获取属性值
    -->
   <select id="findUserByName" parameterType="String" resultMap="userMap">
   		SELECT USER_CODE,USER_NAME,DEPT_CODE FROM SY_ORG_USER WHERE USER_NAME LIKE '%${value}%'
   </select>
   
   <!-- 
   parameterType为pojo(java对象)类型参数
   #{}占位符中指定pojo属性,接收到pojo对象属性值后mybatis通过OGNL获取对象属性值
    -->
   <insert id="insertUser" parameterType="com.hsk.mybatis.bean.UserBean">
   	    insert into sy_org_user (user_code,user_name,dept_code,cmpy_code) values (#{userCode},#{userName},#{deptCode},#{cmpyCode})
   </insert>
   
   <delete id="deleteUser" parameterType="String">
   	   delete sy_org_user where user_code=#{userCode}
   </delete>
</mapper>

 第五步mybatis核心配置文件引入userMapper.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>
    <!--环境配置,连接的数据库,这里使用的是MySQL-->
    <environments default="mysql">
        <environment id="mysql">
            <!--指定事务管理的类型,这里简单使用Java的JDBC的提交和回滚设置-->
            <transactionManager type="JDBC"></transactionManager>
            <!--dataSource 指连接源配置,POOLED是JDBC连接对象的数据源连接池的实现-->
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.driver.OracleDriver"></property>
                <property name="url" value="jdbc:oracle:thin:@localhost:1521/orcl"></property>
                <property name="username" value="SCPT"></property>
                <property name="password" value="SCPT"></property>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <!--这是告诉Mybatis去哪找持久化类的映射文件,对于在src下的文件直接写文件名,
            如果在某包下,则要写明路径,如:com/mybatistest/config/User.xml-->
        <mapper resource="config/sql/user.xml"></mapper>
        <mapper resource="config/mapper/userMapper.xml"></mapper>
        <mapper resource="config/mapper/deptMapper.xml"></mapper>
    </mappers>
</configuration>

第六步单元测试

	@Test
	public void userDaoTest(){
		try {
			Reader reader = Resources.getResourceAsReader("config/mybatis.xml");
			SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
			SqlSession sqlSession = factory.openSession();
			UserDao userDao = sqlSession.getMapper(UserDao.class);
			UserBean userBean = userDao.getUserAndDeptByCode("25");
			System.out.println(userBean.toString());
			System.out.println("-----获取部门所有人员------");
			List<UserBean> userList = userDao.getUsersByDeptCode("12796");
			for (UserBean userBean2 : userList) {
				System.out.println(userBean2.toString());
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

第七步查看结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值