多对一:之前我们了解了一对多并且还做了练习,那这次我们来学习一下多对一,多对一其实和一对多差不多,一对多就是一个对应多个,都对一就是多个对应一个,那么我们还像一对多一样打个比喻:
假如星期一有一个人学习两门课程分别是java和MyBatis,在这里我想先查询到二号的课程并对应所学课程的学生,这思路很简单,相对昨天的来说就是想查询到多的一方在查询到一的一方,那么我们还是根据表之间有关联的id进行查询
注意:把 collection 改成 association把一对多改成多对一(一对多还没搞懂得请先回到一对多学习,学好了,再来学多对一)
-
到数据库中先创建两个表分一个为用户(id,name,age),一个为学习课程(id,userid,kechen)类型这个就不用我说了吧,对应一个一个来。
-
实体类需要实现实例化,主表的实体类里要定义一个泛型的集合用于来接受子表实体类的值,那么子表实体类也需要实现序列化,子表实体类要定义一个主表实体类类型的属性,用来调用到主表并使用
-
实体映射文件SQL语句查询到的结果需要用resultMap来接收,因为现在查询的已经不是一个表里,现在是两个,那么两个表联合使用,我们需要把两个表关联吧,一对多是使用collection调用而多对一就不一样了,我们需要使用association来实现多对一关联
-
主配置文件配置你有几个实体类就配置几个别名,在这里我给你们推存一个超简单的方法不管你有多少个实体类,在这里配置别名只用配置一次,不过注意,实体类必须在一个包下
<typeAliases>
<package name="放实体类的包名" />
</typeAliases>
- 测试类(有很多测试方法,看你怎么想)
下面我来实现我上面讲的,你们可以一边看代码一边理解
主表:
子表:
实体类名与表面保持一致且首字母大写(主表,[Users.java]):
package com.anzhuo.bean;
import java.io.Serializable;
import java.util.List;
public class Users implements Serializable{
//使用Serializable来实现实例化
public int id;
public String name;
public int age;
List<Zhiyuanshu> zhiyuanshu;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
实体类名与表面保持一致且首字母大写(子表[Zhiyuanshu.java]):
package com.anzhuo.bean;
import java.io.Serializable;
public class Zhiyuanshu implements Serializable{
public int id;
public int userid;
public String kechen;
public Users user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getKechen() {
return kechen;
}
public void setKechen(String kechen) {
this.kechen = kechen;
}
public Users getUser() {
return user;
}
public void setUser(Users user) {
this.user = user;
}
}
实体映射文件与有关系的实体类名保持一致首字母小写(zhiyuanshu.xml):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "mapper" "mybatis-3-mapper.dtd" >
<mapper namespace="com.anzhuo.bean">
<select id="getSelect_A" resultMap="resultmap_A">
select * from zhiyuanshu,users where zhiyuanshu.userid=users.id and userid=#{id}
</select>
<!-- 多对一 -->
<resultMap type="Zhiyuanshu" id="resultmap_A">
<result property="id" column="id"/>
<result property="userid" column="userid"/>
<result property="kechen" column="kechen"/>
<association property="user" javaType="Users">
<result property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</association>
</resultMap>
</mapper>
主配置文件(config.xml)注:只要是配置文件首字母小写(命名规范):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "config" "mybatis-3-config.dtd" >
<configuration>
<typeAliases>
<package name="com.anzhuo.bean" />
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdemo" />
<property name="username" value="root" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="zhiyuanshu.xml"/>
</mappers>
</configuration>
测试类(Test.java):
package com.anzhuo.test;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
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 com.anzhuo.bean.Users;
import com.anzhuo.bean.Zhiyuanshu;
public class Test {
public static void main(String[] args) throws IOException {
Reader is = Resources.getResourceAsReader("config.xml");
SqlSessionFactory factory =new SqlSessionFactoryBuilder().build(is);
SqlSession session =factory.openSession();
int zhiyuanshuguanlianId = 2;
List<Zhiyuanshu> zrs = session.selectList("com.anzhuo.bean.getSelect_A",zhiyuanshuguanlianId);
for(Zhiyuanshu p:zrs){
System.out.println("课程:"+p.getKechen());
Users us = p.getUser();
System.out.println("姓名:"+us.getName());
System.out.println("年龄:"+us.getAge());
}
session.close();
}
}
为了一些小伙伴更容易理解,我把我的项目结构也给你们看一下(项目结构):
最后你们要是学会了的话,我出一道小题目来检验一下你们吧!
由题意完成任务:
假如我有3台电脑分别为(电脑A,电脑B,电脑C),今天又3个人使用了B电脑2个人使用了C电脑,1个人使用了A电脑,一共6个人分别叫(小明,小方,小聪,小薇,小夏,小浩),小明,小方,小聪用了B电脑,小薇,小夏用了C电脑,小浩用了A电脑,那么我想要你们使用多对一来实现,先查询到小薇,小夏,在告诉我小薇,小夏用的是第几台电脑?