上篇我们分析了项目的需求并且建立了表结构,这一篇我们开始从底层开始往上一步步实现。
首先需要导入依赖,这个没什么好说的(Maven的配置我之前的博客中有提到),pom.xml文件修改如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.rr.learnssm</groupId>
<artifactId>hrm</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>hrm Maven Webapp</name>
<url>http://maven.apache.org</url>
<!-- 使用 properties标签 统一声明Spring版本号 -->
<properties>
<spring.version>4.3.7.RELEASE</spring.version>
</properties>
<!-- 单元测试 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- Spring相关 -->
<!-- 1.Spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 2.Spring Web依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 3.Spring事务与切面 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 4.Spring JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 5.Spring测试依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 数据库相关 -->
<!-- 1.Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<!-- 2.Mybatis-Spring适配 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 3.c3po连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.3</version>
</dependency>
<!-- 4.Mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.7</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- 日志(log4j)相关 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.1</version>
</dependency>
</dependencies>
<build>
<finalName>hrm</finalName>
</build>
</project>
ctrl+s保存一下,报错的话使用maven update一下,下载太慢的话可能是没配置好阿里镜像。
按图所示创建好java包结构,并在resource目录下创建mapper目录并创建好我之前没创建的文件:
applicationContext.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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 加载数据库属性文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- MyBatis配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!-- 配置扫描器,将MyBatis接口的实现加入到ioc容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描所有的dao接口 -->
<property name="basePackage" value="com.rr.hrm.dao"></property>
</bean>
<!-- 事务配置 -->
<context:component-scan base-package="com.rr.hrm.service" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
springmvc.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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.rr.hrm.controller" />
<!-- 配置视图解析器,方便方法返回 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
</beans>
这两个文件可以写成一个文件,加上后面mybatis总配置文件也可以拆分成spring-web, spring-service, spring-dao三个文件,这个看具体的项目需求。
这两个配置完后就要配置web.xml(在src/main/webapp/WEB-INF下)了,因为springmvc的核心在于一个DispatcherServlet,而Servlet要在web.xml中配置路由:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
新建log4j.properties配置日志:
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.org.fkit.hrm.mapper.UserMapper=DEBUG
log4j.logger.org.fkit.hrm.mapper.DeptMapper=DEBUG
log4j.logger.org.fkit.hrm.mapper.EmployeeMapper=DEBUG
log4j.logger.org.fkit.hrm.mapper.JobMapper=DEBUG
log4j.logger.org.fkit.hrm.mapper.NoticeMapper=DEBUG
log4j.logger.org.fkit.hrm.mapper.DocumentMapper=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
新建db.properties定义数据库属性(前面的spring配置文件会读这个文件,根据自己用户名密码配置相应的值):
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/hrm_db
jdbc.username=root
jdbc.password=root
jdbc.maxPoolSize=20
jdbc.maxIdleTime = 1000
jdbc.minPoolSize=6
jdbc.initialPoolSize=5
接下来是mybatis的总配置文件mybatis-config.xml,它可以配置很多很多dao层访问相关的东西,详细配置见mybatis tutorial:
<?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.rr.hrm.domain"/>
</typeAliases>
</configuration>
我们开始使用mybatis,测试dao层并去获取用户详细信息。
我们在java源文件dao目录下创建UserDao接口:
package com.rr.hrm.dao;
import java.util.List;
import com.rr.hrm.domain.User;
public interface UserDao {
List<User> getAllUsers();
}
在之前创建的mapper目录下创建对应的UserDao.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.rr.hrm.dao.UserDao">
<select id="getAllUsers" resultType="User">
select * from user_inf
</select>
</mapper>
然后在src/test/java下创建TestUserDao类来测试我们这个简单的接口(我们使用SpringTest测试):
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.rr.hrm.dao.UserDao;
import com.rr.hrm.domain.User;
@RunWith(SpringJUnit4ClassRunner.class)
//Telling junit the location of spring configuration file
@ContextConfiguration({"classpath:applicationContext.xml"})
public class TestUserDao {
@Autowired
private UserDao dao;
@Test
public void testUserQuery() {
List<User> users = dao.getAllUsers();
for (User user : users) {
System.out.println(user.getLoginname());
}
}
}
右击编辑区,run as->junit test,console显示:
user_inf表数据:
结果一致,测试完毕。请参考书完成剩下的dao接口(我写的是映射文件+接口方式,和书上的注解方式不一样),虽然这是一个很简单的接口...
时间有限,有什么遗漏的地方或者有问题的地方还请参考源码。
不重要的话:本来这个项目准备腰斩的,因为本人因为能力问题毕业时没有找到JavaWeb的工作(有两个给错过了),二是因为看的人也不多,刚毕业的我现在做的是js全栈的工作(React+Nodejs),这几天一直都在学React+Redux(从入门到关不上门),有多烦就不吐槽了。但是今天看到有朋友催更(真是对我莫大的鼓励),就挤点时间更新一下,后续的话我有时间(滑稽)就更吧,很有可能更的是React的内容,因为这几天踩的坑很大,很想把踩过的坑记录下来。