maven项目使用MyBatis实现关联表查询
一、需求
根据班级cid 查询班级信息(带老师的信息)
项目结构图:
二、创建表和数据
CREATE TABLE teacher(
t_id INT PRIMARY KEY AUTO_INCREMENT,
t_name VARCHAR(20)
);
CREATE TABLE class(
c_id INT PRIMARY KEY AUTO_INCREMENT,
c_name VARCHAR(20),
teacher_id INT
);
ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id)
REFERENCES teacher(t_id);
M
三、maven加载依赖(pom.xml)
本次测试加载了 mybatis、mysql、lombok和log4j依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
四、定义实体类
Classs类与Teacher类之间的联系:多对一
联表查询,查询班级信息包含了教师信息,
所以在多的实体类添加一的实体对象。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Classs {
private int cid;
private String cname;
private Teacher teacher;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
private int tid;
private String tname;
}
五、配置连接数据库的文件(db.properties)
我的数据库版本是5.6+的,8.0+的可能需要更改url连接
##配置JDBCUtil需要的信息,关于连接数据库的所有信息,key value 形式
#配置需要加载的驱动
driverClassName=com.mysql.jdbc.Driver
#配置需要加载的协议和数据库
url=jdbc:mysql://localhost:3306/数据库名字?/useUnicode=true&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
#配置用户信息
username=root
#配置密码
password=自己数据库密码
六、配置MyBatis配置文件(conf.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>
<!--引用连接数据库配置文件-->
<properties resource="db.properties"/>
<!--为实体类起别名-->
<typeAliases>
<!--为制定包下的类起别名,就是类的名称-->
<package name="com.hongda.space.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driverClassName}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
</configuration>
七、编写dao层代码
dao层定义一个ClassDao接口
public interface ClasssDao {
/**
* 根据cid查询班级信息
* @param cid
* @return
*/
Classs findClassByCid(int cid);
}
查询两次的代码:
public interface ClasssDao {
/**
* 根据cid查询班级信息
* @param cid
* @return
*/
Classs findClassById(int cid);
Teacher findTeacherById(int tid);
}
八、定义sql映射文件(ClassMapper.xml)
查询有两种方式:
第一种 查询一次,直接查找出来
第二种查询两次,第一次先查出一个表的信息,第二次根据第一次查询出来的某一列值作为第二次查询的参数
8.1 查询一次
<mapper namespace="com.hongda.space.dao.ClasssDao">
<!--type 表示实体类的类型
resultType:表示JAVA类型
resultMap:表示映射文件中resultMap标签的ID
-->
<resultMap id="ClassMap" type="com.hongda.space.entity.Classs">
<!--
id:表示主键
column:数据库字段
property:实体类的属性
-->
<id column="c_id" property="cid"/>
<result column="c_name" property="cname"/>
<!--
association 多对一的映射
javaType 表示属性名对应的java实体类类型
-->
<association property="teacher" javaType="com.hongda.space.entity.Teacher">
<id column="t_id" property="tid"/>
<result column="t_name" property="tname"/>
</association>
</resultMap>
<select id="findClassByCid" resultMap="ClassMap">
select * from class c,teacher t where c.teacher_id = t.t_id and c.c_id=#{cid}
</select>
</mapper>
8.2查询两次
<?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.hongda.space.dao.ClasssDao">
<!--两次查询得到结果-->
<!--type 表示实体类的类型-->
<resultMap id="ClassMap2" type="com.hongda.space.entity.Classs">
<!--
id:表示主键
column:数据库字段
property:实体类的属性
-->
<id column="c_id" property="cid"/>
<result column="c_name" property="cname"/>
<!--column:把第一次查询的某一列作为第二次查询的值
在这里是把第一次查询的teacher_id作为第二次查询的参数
select
-->
<!--
association 多对一的映射
javaType 表示属性名对应的java实体类类型
-->
<association property="teacher" javaType="com.hongda.space.entity.Teacher"
column="teacher_id" select="findTeacherById">
<id column="teacher_id" property="tid"/>
<result column="t_name" property="tname"/>
</association>
</resultMap>
<select id="findClassById" resultMap="ClassMap2">
select * from class where c_id=#{cid}
</select>
<select id="findTeacherById" resultType="com.hongda.space.entity.Teacher">
select t_id tid,t_name tname from teacher where t_id=#{tid}
</select>
</mapper>
九、编写测试代码
定义一个测试类ClassTest进行测试
public class ClassTest {
public static void main(String[] args) throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
ClasssDao mapper = session.getMapper(ClasssDao.class);
Classs classs1 = mapper.findClassByCid(1);
System.out.println(classs1);
Classs classs2 = mapper.findClassById(1);
System.out.println(classs2);
}
}