**
今天学校下发了一份试卷,而其中最引起我注意的是这一道编程题!
**
这道题虽然也不难,但也遇到了一些小问题。
解决问题后,心情是舒畅滴!
所以,俺要记录一下!
以后回来翻翻又是一个满满的回忆!
题目如下:
采用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);
}
}
运行结果:
在编写代码时,遇到最多的问题就是配置文件的问题。
路径一定要配置好,这里给出我的目录结构。
那就这样了,如果有错误的地方,欢迎指正!
如果需要程序源码,可以私信我发给你。
期待你的点赞关注!