“spring与mybatis整合”考试题目测试与解析

**

今天学校下发了一份试卷,而其中最引起我注意的是这一道编程题!

**
这道题虽然也不难,但也遇到了一些小问题。
解决问题后,心情是舒畅滴!
所以,俺要记录一下!
以后回来翻翻又是一个满满的回忆!

在这里插入图片描述

题目如下:
采用sprms+. bat"框架完成dep表和emp表的关联查询操作,将所编写的所有代码要求如下:
1、利用M-Sql创建数据库: exam,根据附件中提供的sq语向分别创建部门表: dep和员工表: emp, 并将创建成功后的表截图粘贴在答案区。(5)
2、新建一个Dynamic Web projet,编写mybatis-config xml、applicatonContext xm和db propertes配置文件,完成“Sprng+Mybatis""的环境搭建,代码截图粘贴在答案区。(20分)
3、新建Dep实体类和Emp实体类,代码截图粘贴在答案区。(15分)
4、新建EmpMapper接口及相应的Mappe映射文件,使用嵌套结果的方式实现“研发部”所有员工详细信息的查询操作,将查询的结果封装到Dep的对象中,代码截图粘贴在答案区。(35分)
5、编写测试类,使用单元测试完成测试,并将运行结果(控制台输出的员工的详细信息)截图粘贴。

**既然要求都说清楚了,那我们接下来就一步一步清晰明了的分析解决问题!
此处请记笔记:一步一步,清晰,明了,分析,解决!

第一个问题是:

1、利用M-Sql创建数据库: exam,根据附件中提供的sq语向分别创建部门表: dept和员工表: emp。

1.1:创建exam数据库:
在这里插入图片描述
这里注意一下,一定要把字符集改成utf-8,后面可以减少乱码的问题。

1.2:创建表:部门表:dept,员工表: emp
此处我们直接在mysql里面用“新建查询”的方法来建立表,并向表中插入数据。
“新建查询”代码:

-- 部门表
DROP TABLE IF EXISTS dept;
create table dept(
	deptno int primary key auto_increment, -- 部门编号
	dname varchar(20) ,	  -- 部门名字
	loc varchar(13)   -- 地址
)ENGINE=MyISAM DEFAULT CHARSET=utf8;;

insert into dept values(10,'财务部','北京');
insert into dept values(20,'研发部','上海');
insert into dept values(30,'销售部','广州');
insert into dept values(40,'行政部','深圳');

-- 员工表
DROP TABLE IF EXISTS emp;
create table emp(
	empno int primary key auto_increment,-- 员工编号
	ename varchar(20), -- 员工姓名										-
	job varchar(20),	-- 岗位
	mgr int,	 -- 直接领导编号
	hiredate date, -- 雇佣日期,入职日期
	sal int, -- 薪水
	comm int,  -- 提成
	deptno int -- 部门编号
)ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into emp values(7369,'刘一','职员',7902,'1980-12-17',800,null,20);
insert into emp values(7499,'陈二','推销员',7698,'1981-02-20',1600,300,30);
insert into emp values(7521,'张三','推销员',7698,'1981-02-22',1250,500,30);
insert into emp values(7566,'李四','经理',7839,'1981-04-02',2975,null,20);
insert into emp values(7654,'王五','推销员',7698,'1981-09-28',1250,1400,30);
insert into emp values(7698,'赵六','经理',7839,'1981-05-01',2850,null,30);
insert into emp values(7782,'孙七','经理',7839,'1981-06-09',2450,null,10);
insert into emp values(7788,'周八','分析师',7566,'1987-06-13',3000,null,20);
insert into emp values(7839,'吴九','总裁',null,'1981-11-17',5000,null,10);
insert into emp values(7844,'郑十','推销员',7698,'1981-09-08',1500,0,30);
insert into emp values(7876,'郭十一','职员',7788,'1987-06-13',1100,null,20);
insert into emp values(7900,'钱多多','职员',7698,'1981-12-03',950,null,30);
insert into emp values(7902,'大锦鲤','分析师',7566,'1981-12-03',3000,null,20);
insert into emp values(7934,'木有钱','职员',7782,'1983-01-23',1300,null,10);


运行代码后得到两个表,结果如下:
在这里插入图片描述
这样一来,我们就完成了第一个要求啦!
第二个问题是:
2.新建一个Dynamic Web projet,编写mybatis-config xml、applicatonContext xml和db propertes配置文件,完成“Sprng+Mybatis""的环境搭建。
那接下来我们先新建数据库配置文件:
2.1:
db propertes:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/exam?characterEncoding=utf-8&serverTimezone=UTC
jdbc.username=root
jdbc.password=root
jdbc.maxTotal=30
jdbc.maxIdle=10
jdbc.initialSize=5

这里提醒一下,要按照自己的数据库账号密码,每个人的可能不一样。
然后是数据库连接驱动的问题,我用的是8.0版本的。
如果数据库连接报错可以参考一下我的上一篇文章数据库连接报错
希望对你有帮助。
2.2:
mybatis-config 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>
    <typeAliases>
        <package name="com.po"/>
    </typeAliases>
    
	<mappers>
		<mapper resource="com/dao/EmpMapper.xml" />
	</mappers>
</configuration>

其中重点的就是配置引入你的mapper路径。:“com/dao/EmpMapper.xml”
2.3.
applicatonContext xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.3.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
    <!--只提供部分代码,请自己完善-->
    <!--读取db.properties -->
    <context:property-placeholder location="classpath:db.properties"/>
    <!-- 配置数据源 -->
	<bean id="dataSource" 
            class="org.apache.commons.dbcp2.BasicDataSource">
        <!--数据库驱动 -->
        <property name="driverClassName" value="${jdbc.driver}" />
        <!--连接数据库的url -->
        <property name="url" value="${jdbc.url}" />
        <!--连接数据库的用户名 -->
        <property name="username" value="${jdbc.username}" />
        <!--连接数据库的密码 -->
        <property name="password" value="${jdbc.password}" />
        <!--最大连接数 -->
        <property name="maxTotal" value="${jdbc.maxTotal}" />
        <!--最大空闲连接  -->
        <property name="maxIdle" value="${jdbc.maxIdle}" />
        <!--初始化连接数  -->
        <property name="initialSize" value="${jdbc.initialSize}" />
	</bean>
    <!--配置MyBatis工厂 -->
   <bean id="sqlsessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	   <!--  注入数据源 -->
	    <property name="dataSource" ref="dataSource"/>
	    <!-- 指定核心配置文件 -->
	    <property name="configLocation" value="classpath:mybatis-config.xml"/>
	</bean>
	
   <!-- Mapper代理开发(基于MapperScannerConfigurer) -->
	<bean id="EmpMappermapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
	    <property name="mapperInterface" value="com.dao.EmpMapper"/>
	    <property name="sqlSessionFactory" ref="sqlsessionfactory"/>
	</bean>
	
</beans>

这里讲一下,
dataSoure里面的数据库value值要和db.propertes文件的属性名相对应。
配置Mybatis工厂是整合spring和mybatis的重点。
在mapper代理开发中对应的接口路径和Mybatis工厂的引用要填写正确。
逻辑就写在代码注释里了。
至此,我们就完成了第二个要求。

第三个问题是:
3.新建Dept实体类和Emp实体类

这简单,根据问题一里面表的列名。直接建立他们的实体类。
Dept类:

package com.po;

import java.util.List;

public class Dept {
	private Integer deptno;
	private String dname;
	private String loc;
	private List<Emp> emps; 
	
	public List<Emp> getEmp() {
		return emps;
	}
	public void setEmp(List<Emp> emp) {
		this.emps = emps;
	}
	public Integer getDeptno() {
		return deptno;
	}
	public void setDeptno(Integer deptno) {
		this.deptno = deptno;
	}
	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	public String getLoc() {
		return loc;
	}
	public void setLoc(String loc) {
		this.loc = loc;
	}
	@Override
	public String toString() {
		return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc + ", emp=" + emps + "]";
	}
	
}

考虑到第四问是将查询的结果封装到部门Depe的对象中,我们可以知道,这是一对多的关系。
所以加了List来保存多个员工Emp。
Emp类:

package com.po;

public class Emp {
	private int empno;
	private String ename;
	private String job;
	private int mgr;
	private String hiredate;
	private int sal;
	private String comm;
	private int deptno;
	public int getEmpno() {
		return empno;
	}
	public void setEmpno(int empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public int getMgr() {
		return mgr;
	}
	public void setMgr(int mgr) {
		this.mgr = mgr;
	}
	public String getHiredate() {
		return hiredate;
	}
	public void setHiredate(String hiredate) {
		this.hiredate = hiredate;
	}
	public int getSal() {
		return sal;
	}
	public void setSal(int sal) {
		this.sal = sal;
	}
	public String getComm() {
		return comm;
	}
	public void setComm(String comm) {
		this.comm = comm;
	}
	public int getDeptno() {
		return deptno;
	}
	public void setDeptno(int deptno) {
		this.deptno = deptno;
	}
	@Override
	public String toString() {
		return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", mgr=" + mgr + ", hiredate=" + hiredate
				+ ", sal=" + sal + ", comm=" + comm + ", deptno=" + deptno + "]";
	}
	
}

第四个问题是:
4、新建EmpMapper接口及相应的Mappe映射文件,使用嵌套结果的方式实现“研发部”所有员工详细信息的查询操作,将查询的结果封装到Dept的对象中。
4.1:新建EmpMapper接口
定义findallemp方法用来实现“研发部”所有员工详细信息的查询操作。
EmpMapper.java:

package com.dao;

import com.po.Dept;

public interface EmpMapper {
	public Dept findallemp(String dname);
}

4.2:实现相应的Mappe映射文件并实现接口
EmpMapper.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">

<mapper namespace="com.dao.EmpMapper">
    
<!--     使用嵌套结果的方式实现“研发部”所有员工详细信息的查询操作,将查询的结果封装到Dept的对象中 -->
       <!-- 嵌套结果 -->
    <select id="findallemp" parameterType="String" resultMap="allemp">
        select * from emp,dept 
		where dept.dname=#{dname}  
		and 
		emp.deptno = dept.deptno
         
    </select>
     <resultMap type="Dept" id="allemp">
      <!-- 用于标识那个列是主键 -->
        <id property="deptno" column="deptno"/>
        <result property="dname" column="dname"/>
        <result property="loc" column="loc"/>
        
       <collection property="emps" ofType="Emp" >
		    <id property="empno" column="empno"/>
		    <result property="ename" column="ename"/>
		    <result property="job" column="job"/>
		    <result property="mgr" column="mgr"/>
		    <result property="hiredate" column="hiredate"/>
		    <result property="sal" column="sal"/>
		    <result property="comm" column="comm"/>
		    <result property="deptno" column="deptno"/>
		</collection>
    </resultMap>
   
 
</mapper>

这里说一下mapper namespace="com.dao.EmpMapper"是引入并实现上一步的接口文件。
采用嵌套结果的方式进行查询,select是查询的方法。
collection是标识对应的列名。

第五个问题是:
5、编写测试类,使用单元测试完成测试。
test.java:

package com.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.dao.EmpMapper;

import com.po.Dept;

public class test {
	
	@Test
	public void findallemp() throws Exception{
		
		ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
//		EmpMapper EmpMapper = (com.dao.EmpMapper) act.getBean("EmpMapper");
		EmpMapper EmpMapper = act.getBean(EmpMapper.class);
		Dept dept = EmpMapper.findallemp("研发部");
		System.out.println(dept);
	}
}

运行结果:
在这里插入图片描述
在编写代码时,遇到最多的问题就是配置文件的问题。
路径一定要配置好,这里给出我的目录结构。
在这里插入图片描述
那就这样了,如果有错误的地方,欢迎指正!
如果需要程序源码,可以私信我发给你。
期待你的点赞关注!
在这里插入图片描述

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

加辣椒了吗?

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

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

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

打赏作者

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

抵扣说明:

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

余额充值