Mybatis学习笔记(四)--------基于注解的多表查询

10 篇文章 0 订阅
6 篇文章 0 订阅

注:这里主要是针对多表查找,所以下面的讲解和代码主要针对多表查询 

一、<resultMap>对应的注解
注解及代替的标签介绍
1.@Results注解

代替的是标签<resultMap > 

该注解中可以使用单个@Result注解,也可以使用@Result集合

@Results({@Result(),@Result()})或@Results(@Result())

注意:使用注解是若报出org.apache.ibatis.binding.BindingException:Invalid bound statement (not found):接口全类名.方法名

可能是使用@Results注解时忘记使用@Select注解

2.@Resutl注解 

代替了 <id>标签和<result>标签

如果数据库中字段的名字和javabean实体类的名字不一致时,可以通过使用@Result解决 

       @Result 中 属性介绍:

column 数据库的列名

Property需要装配的属性名

one  需要使用的@One注解(@Result(one=@One)()))

many  需要使用的@Many注解(@Result(many=@many)()))
二、具体应用

1、@One注解(一对一)

 

代替了<assocation>标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。

@One注解属性介绍:

select  指定用来多表查询的sqlmapper

fetchType会覆盖全局的配置参数lazyLoadingEnabled。。

使用格式:

@Result(column=" ",property="",one=@One(select=""))

 

2、@Many注解(多对一)

           代替了<Collection>标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。

注意:聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList)但是注解中可以不定义;

使用格式:

@Result(property="",column="",many=@Many(select=""))

三、代码实现

3、1代码目录结构 

 

3.2代码实现

3.2.1实体类

public class Emp {
	private int	empId;
	private String name;
	private int n_id;
	private Msg msg;
	public Emp() {
		
	}
	
	public Msg getMsg() {
		return msg;
	}

	public void setMsg(Msg msg) {
		this.msg = msg;
	}

	public int getN_id() {
		return n_id;
	}

	public void setN_id(int n_id) {
		this.n_id = n_id;
	}


	public int getEmpId() {
		return empId;
	}
	public void setEmpId(int empId) {
		this.empId = empId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}
import java.util.List;

public class Msg {
	private int n_id;
	private String nation;
	private List<Emp> empList;
	public Msg() {
		
	}
	
	public List<Emp> getEmpList() {
		return empList;
	}

	public void setEmpList(List<Emp> empList) {
		this.empList = empList;
	}

	public int getN_id() {
		return n_id;
	}
	public void setN_id(int n_id) {
		this.n_id = n_id;
	}
	public String getNation() {
		return nation;
	}
	public void setNation(String nation) {
		this.nation = nation;
	}
	
}

3.2.2连接数据库

import java.io.IOException;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class ConnectionSql {
	private static SqlSessionFactory factory;
	static {
		String resource ="batis.xml";
		try {
			if(factory==null) {
				factory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(resource));
			}
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
	public static SqlSession getSession() {
		return factory.openSession();
	}
}

 

<?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>
<environments default="development">
	<environment id="development">
		<transactionManager type="JDBC"/>
		<dataSource type="POOLED">
			<property name="driver" value="com.mysql.jdbc.Driver"/>
			<property name="url" value="jdbc:mysql://localhost:3306/db_emp?useUnicode=true&amp;characterEncoding=utf8" />
			<property name="username" value="root"/>
			<property name="password" value=""/>
		</dataSource>
	</environment>
</environments>
<mappers>
    <!--配置映射文件-->
	<mapper class="com.emp.dao.EmpDao" />
	<mapper class="com.emp.dao.MsgDao"/>
</mappers>
</configuration>

 3.2.3接口类

 

import java.util.List;

import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import com.emp.entity.Emp;
import com.emp.entity.Msg;

public interface EmpDao {
	/*
	 * @Result用来设置列和属性
	 * one=@One通过调用其他注解来实现
	 * 关联查询使用内链接机制
	 */
	@Results({@Result(column="empId",property="empId") , @Result(column="name",property="name")})
	@Select("SELECT * FROM emp")
	public List<Emp>getEmp();
	/* 一对一
	 * 内部查询原理
	 * select  s.*,g.*from student s inner join grade g ons.gid=g.gid
	 * one to one
	 */
	@Results({@Result(property="msg",column="n_id",one=@One(select="com.emp.dao.EmpDao.getMsg"))})
	@Select("SELECT * FROM emp")
	public List<Emp> getEmps();
	@Select("SELECT * FROM msg where id=#{id}")
	public Msg getMsg(Integer id);
	
}
import java.util.List;

import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import com.emp.entity.Emp;
import com.emp.entity.Msg;

public interface MsgDao {
	/* 一对多
	 * 内部查询原理
	 * 内连接实现
	 */
	@Results({@Result(column="id",property="n_id"),
		@Result(column="nation",property="nation"),
		@Result(column="id",property="empList",many=@Many(select="com.emp.dao.MsgDao.getEmp"))
	})
	@Select("SELECT * FROM msg")
	public List<Msg> getMsg();
	@Select("SELECT * FROM emp where n_id =#{0}")
	public Emp getEmp();
}

 3.2.4测试类

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.emp.dao.EmpDao;
import com.emp.dao.MsgDao;
import com.emp.entity.Emp;
import com.emp.entity.Msg;
import com.emp.jdbc.ConnectionSql;

public class AnnotationTest {
	public static void main(String[] args) {
		SqlSession session = ConnectionSql.getSession();
		/*
		 * 简单查找
		EmpDao ed = session.getMapper(EmpDao.class);
		List<Emp>empList = ed.getEmp();
		System.out.println(empList.size());
		for (Emp emp : empList) {
			System.out.println(emp.getEmpId()+emp.getName()+emp.getN_id());
		}
		*/
		/*
		 // 一对一
		EmpDao ed = session.getMapper(EmpDao.class);
		List<Emp>empList = ed.getEmps();
		System.out.println(empList.size());
		
		for (Emp emp : empList) {
			
			System.out.println(emp.getEmpId()+emp.getName()+emp.getMsg().getNation());
			System.out.println(emp.getMsg().getN_id());
		}
		*/
		MsgDao es = session.getMapper(MsgDao.class);
		List<Msg> msgList = es.getMsg();
		System.out.println(msgList.size());
		for (Msg msg : msgList) {
			List <Emp> empList=msg.getEmpList();
			for (Emp emp : empList) {
				System.out.println(emp.getName()+msg.getNation());
			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小生不财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值