注:这里主要是针对多表查找,所以下面的讲解和代码主要针对多表查询
一、<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&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());
}
}
}
}