创建一个maven项目
步骤:new project->maven->勾选create from archetype(选maven-archetype-webapp结尾的)->next---->finish
创建的项目可能没有src,main啥的,要自己创建。
总体目录结构如下:
标记src/main/java 为source,对应的src/main/resource标记为resource。测试的暂时没用上,标记同理。
配置文件
1 web.xml
webapp中的WEB-INF中的web.xml配置文件如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>c4compete</display-name>
<!-- 配置编码方式-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置springmvc的前端控制器 指向spring-mvc.xml 程序在启动的时候就加载springmvc 可以接受所有请求 load-on-startup:表示启动容器时初始化该Servlet; -->
<servlet>
<servlet-name>springServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 可以自定义servlet.xml配置文件的位置和名称, 默认为WEB-INF目录下,名称为[<servlet-name>]-servlet.xml,如spring-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value> classpath:spring/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 将前端URL请求和后台处理方法controller建立对应关系-->
<servlet-mapping>
<servlet-name>springServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- Spring配置 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 取消对某一类文件的拦截-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.md</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value> classpath:spring/applicationContext.xml</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
<!-- 欢迎页面-->
<welcome-file-list>
<welcome-file>/WEB-INF/index.jsp</welcome-file>
</welcome-file-list>
<!--404错误展示页面,可自行配置-->
<!--<error-page>-->
<!--<error-code>404</error-code>-->
<!--<location>/WEB-INF/views/404.jsp</location>-->
<!--</error-page>-->
<!--设置session失效时间为30分钟 -->
<session-config>
<session-timeout>600</session-timeout>
</session-config>
</web-app>
2 applicationContext.xml
位置在main/resource/spring/下。
<?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:beans="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-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/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd" >
<!-- ①:对com.springmvc包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
<context:component-scan base-package="com.c4"/>
<mvc:annotation-driven />
<!-- 静态资源访问 -->
<!--如果webapp下你新建了文件夹,想访问里面的静态资源,那么就要在这配置一下-->
<!-- <mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/styles/" mapping="/styles/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>-->
<!-- Configures the @Controller programming model
<mvc:annotation-driven />-->
<!-- ②:启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter"/>
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 配置视图解析器,把控制器的逻辑视频映射为真正的视图 -->
<!-- /WEB-INF/jsp/start.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 配置dbcp数据库连接池 -->
<!-- <context:property-placeholder location="classpath:db.properties"/> -->
<!--数据库配置 -->
<bean id = "propertyConfigurer" class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<!-- 数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="initialSize" value="1"/>
<property name="maxActive" value="100"/>
<property name="maxIdle" value="5"/>
<property name="maxWait" value="80000"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 拦截器 -->
<mvc:interceptors>
<!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>
<!-- 定义无Controller的path<->view直接映射 -->
<!-- <mvc:view-controller path="/" view-name="redirect:/" /> -->
<!-- 配置SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 加载mybatis的配置文件-->
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
<!-- 数据源-->
<property name="dataSource" ref="dataSource"/>
<!-- mapper.xml扫描-->
<property name="mapperLocations" value="classpath:sqlmap/*.xml"/>
</bean>
<!-- mapper扫描器-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.c4.dao"/>
</bean>
</beans>
3 jdbc.properties
driver=com.mysql.jdbc.Driver
#mytest为我本地的数据库名
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
username=root
#下面输入自己数据库的密码
password=123456
#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=60000
4 log4j.properties
###set log levels ###
log4j.rootLogger = INFO,D
###输出到控制台###
log4j.logger.toConsole=debug,stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =%d{yyyy-MM-dd HH\:mm\:ss} [%5p] - %c -%F(%L) -%m%n
###输出到日志文件 ###
##其中File 可以采用绝对路径 亦可以采用相对路径 catalina.home 是tomcat目录 如果没有logs文件夹 将会报错 ##
##更加倾向于将日志文件放在 tomcat的日志目录下${catalina.home}/logs/salesmanb2bError.log ##
##绝对路径如:e:/salesmanb2bError.log ##
log4j.logger.daily=INFO,D
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ${catalina.home}/logs/helloworld/helloworld.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern =%d{yyyy-MM-dd HH\:mm\:ss} [%5p] - %c -%F(%L) -%m%n
##log4j.logger.org.apache.ibatis=debug,stdout
##log4j.logger.java.sql=debug,stdout
配置文件就以上部分。另外如果dao中定义了mapper就要写对应的mapper.xml文件到sqlmap中。
写一个简单的样例作为测试。实事上,以上配置完成,即可直接写一个控制器,可以直接访问到控制器,类似进入servlet的dopost或者doget方法。
5 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>
<settings>
<!-- 打印查询语句 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
5 测试
controller
package com.c4.controller;
import com.alibaba.fastjson.JSON;
import com.c4.service.impl.UserServiceImpl;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping(value = "/user",produces = {"application/json;charset=UTF-8"})
public class UserController {
@Resource
private UserServiceImpl userServiceImpl;
@RequestMapping(value = "/get-list", method = RequestMethod.GET)
@ResponseBody
public String userLogin(@RequestParam Map params)
{
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
list = this.userServiceImpl.getList(params);
/* Map<String, Object> map = new HashMap<String, Object>();
map.put("name","张三");
map.put("age",18);
list.add(map);*/
return JSON.toJSONString(list);
}
}
dao下的mapper接口
package com.c4.dao;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
@Repository
public interface UserMapper {
List<Map<String, Object>> GetAllUserList();
}
没有使用到entity里面的类,故在此省略。
UserService接口
package com.c4.service;
import java.util.List;
import java.util.Map;
public interface UserService {
List<Map<String, Object>> getList(Map map);
}
UserServiceImpl实现
package com.c4.service.impl;
import com.c4.dao.UserMapper;
import com.c4.service.UserService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@Service("UserService")
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
public List<Map<String, Object>> getList(Map map) {
//List<Map<String, Object>> userInfos = userInfoMapper.selectMaps(new EntityWrapper<UserInfo>());
List<Map<String, Object>> userInfos = userMapper.GetAllUserList();
return userInfos;
}
}
关键的异步UserMapper.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.c4.dao.UserMapper" >
<!-- <resultMap id="BaseResultMap" type="com.model.UserInfo">
<id property="uid" column="uid" jdbcType="INTEGER" />
<result column="username" property="username" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" />
<result column="email" property="email" jdbcType="VARCHAR" />
<result column="role_id" property="role" jdbcType="INTEGER" />
<result column="school_id" property="school" jdbcType="INTEGER" />
<result column="major_id" property="major" jdbcType="INTEGER" />
<result column="flag" property="flag" jdbcType="INTEGER" />
</resultMap>-->
<sql id="Base_Column_List" >
uid, username,password,role_id, school_id, major_id,email,flag
</sql>
<!--<select id="GetAllUserList" resultType="map" >-->
<!--select user_info.uid,user_info.username,user_info.password,user_info.email,user_info.flag,-->
<!--school_info.school_id,school_info.school_name as school,-->
<!--major_info.major_name as major,major_info.major_id,-->
<!--role_info.role_name as role,role_info.role_id-->
<!--from user_info-->
<!--inner join school_info,major_info,role_info-->
<!--where user_info.school_id = school_info.school_id and user_info.major_id = major_info.major_id and user_info.role_id = role_info.role_id-->
<!--</select>-->
<select id="GetAllUserList" resultType="map" >
select * from users
</select>
<select id="getUserListBySchoolId" parameterType="java.lang.Integer" resultType="map">
select * from user_info where school_id = #{schoolId,jdbcType=INTEGER}
</select>
<select id="getUserListByMajorId" parameterType="java.lang.Integer" resultType="map">
select * from user_info where major_id = #{majorId,jdbcType=INTEGER}
</select>
<select id="getUserListByRoleId" parameterType="java.lang.Integer" resultType="map">
select * from user_info where role_id = #{roleId,jdbcType=INTEGER}
</select>
<select id="GetSearchUserList" parameterType="java.lang.String" resultType="map" >
select user_info.uid,user_info.username,user_info.password,user_info.email,user_info.flag,
school_info.school_id,school_info.school_name as school,
case when user_info.major_id is null then null else major_info.major_id end as major_id,
case when user_info.major_id is null then null else major_info.major_name end as major,
role_info.role_name as role,role_info.role_id
from user_info,school_info,major_info,role_info
where user_info.school_id = school_info.school_id
and (user_info.major_id = major_info.major_id or user_info.major_id is NULL)
and user_info.role_id = role_info.role_id
and
(
user_info.username like CONCAT('%',#{searchText},'%')
or school_info.school_name like CONCAT('%',#{searchText},'%')
or (user_info.major_id = major_info.major_id and major_info.major_name like CONCAT('%',#{searchText},'%') )
or user_info.email like CONCAT('%',#{searchText},'%')
)
GROUP BY user_info.username
</select>
<!-- <update id="updateUser" parameterType="com.model.UserInfo" >
update user_info
set username=#{username}, school_id=#{schoolId}, major_id=#{majorId}, role_id=#{roleId}, email=#{email}
where uid = #{uid,jdbcType=INTEGER}
</update>-->
</mapper>
最中测试结果:
CREATE TABLE `users` (
`uid` int(50) NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
日志输出: