SpringMVC+MybatisプロジェクトのMaven構築の詳細説明
はじめに
最近は比較的自由にプロジェクトのレビューやビルドをしていましたが、今回は主に spring+SpringMVC+Mybatis を使用しました。プロジェクトの永続化層は Mybatis3 を使用し、制御層は SpringMVC4.1 を使用し、Spring4.1 管理コントローラーを使用し、データベース接続プールは druid データ ソースを使用し、データベースは一時的に MySQL を使用します。结1、データベーステーブルの構造とMavenプロジェクトの構造
データテーブルは次のように非常に単純です(重要ではありません):
注: SRC/main/java、src/test/java、src/test/resources がない場合は、これらのいくつかのソースを作成します。
フォルダ。
2. 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://www.php.cn/"> <modelVersion>4.0.0</modelVersion> <groupId>org.andy.sm</groupId> <artifactId>springmvc_mybatis_demo</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>springmvc_mybatis_demo Maven Webapp</name> <url>http://www.php.cn/</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>4.1.4.RELEASE</spring.version> <jackson.version>2.5.0</jackson.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- 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> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <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> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <!-- mybatis 包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <!--mybatis spring 插件 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> <!-- mysql连接 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <!-- 数据源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.12</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.4</version> </dependency> <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0-alpha-1</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- json --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- 文件上传 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.2</version> </dependency> </dependencies> <build> <finalName>springmvc_mybatis_demo</finalName> <plugins> <!-- Run the JUnit unit tests in an isolated classloader --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.4.2</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <webXml>src/main/webapp/WEB-INF/web.xml</webXml> </configuration> </plugin> <!-- generate java doc --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>2.9.1</version> <configuration> <javadocDirectory>target/javadoc</javadocDirectory> <reportOutputDirectory>target/javadoc</reportOutputDirectory> <charset>UTF-8</charset> <encoding>UTF-8</encoding> <docencoding>UTF-8</docencoding> <show>private</show> </configuration> </plugin> <!-- 部署至本机 --> <plugin> <groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven2-plugin</artifactId> <version>1.0</version> <configuration> <container> <containerId>tomcat6x</containerId> <home>D:\WebServer\apache-tomcat-6.0.39</home> </container> <configuration> <type>existing</type> <home>D:\WebServer\apache-tomcat-6.0.39</home> </configuration> </configuration> </plugin> </plugins> </build> </project>
UserInfo.java(其中List
[java] view plain copy package org.andy.shop.model; import java.util.List; public class UserInfo { private Integer id; private String uname; private Integer unumber; private List<CourseInfo> courseInfos; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname == null ? null : uname.trim(); } public Integer getUnumber() { return unumber; } public void setUnumber(Integer unumber) { this.unumber = unumber; } public List<CourseInfo> getCourseInfos() { return courseInfos; } }
Dao包中的UserInfoMapper.java
[java] view plain copy package org.andy.shop.dao; import java.util.List; import org.andy.shop.model.UserInfo; public interface UserInfoMapper { int deleteByPrimaryKey(Integer id); int insert(UserInfo record); int insertSelective(UserInfo record); UserInfo selectByPrimaryKey(Integer id); int updateByPrimaryKeySelective(UserInfo record); int updateByPrimaryKey(UserInfo record); List<UserInfo> selectAll(); }
mapping 中的配置文件UserInfoMapper.xml
[html] view plain copy <?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="org.andy.shop.dao.UserInfoMapper"> <resultMap id="BaseResultMap" type="org.andy.shop.model.UserInfo"> <id column="id" property="id" jdbcType="INTEGER" /> <result column="uname" property="uname" jdbcType="VARCHAR" /> <result column="unumber" property="unumber" jdbcType="INTEGER" /> </resultMap> <sql id="Base_Column_List"> id, uname, unumber </sql> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer"> select <include refid="Base_Column_List" /> from user_info where id = #{id,jdbcType=INTEGER} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer"> delete from user_info where id = #{id,jdbcType=INTEGER} </delete> <insert id="insert" parameterType="org.andy.shop.model.UserInfo"> insert into user_info (id, uname, unumber ) values (#{id,jdbcType=INTEGER}, #{uname,jdbcType=VARCHAR}, #{unumber,jdbcType=INTEGER} ) </insert> <insert id="insertSelective" parameterType="org.andy.shop.model.UserInfo"> insert into user_info <trim prefix="(" suffix=")" suffixOverrides=","> <if test="id != null"> id, </if> <if test="uname != null"> uname, </if> <if test="unumber != null"> unumber, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="id != null"> #{id,jdbcType=INTEGER}, </if> <if test="uname != null"> #{uname,jdbcType=VARCHAR}, </if> <if test="unumber != null"> #{unumber,jdbcType=INTEGER}, </if> </trim> </insert> <update id="updateByPrimaryKeySelective" parameterType="org.andy.shop.model.UserInfo"> update user_info <set> <if test="uname != null"> uname = #{uname,jdbcType=VARCHAR}, </if> <if test="unumber != null"> unumber = #{unumber,jdbcType=INTEGER}, </if> </set> where id = #{id,jdbcType=INTEGER} </update> <update id="updateByPrimaryKey" parameterType="org.andy.shop.model.UserInfo"> update user_info set uname = #{uname,jdbcType=VARCHAR}, unumber = #{unumber,jdbcType=INTEGER} where id = #{id,jdbcType=INTEGER} </update> <resultMap type="org.andy.shop.model.UserInfo" id="UserCourseMap" extends="BaseResultMap"> <collection property="courseInfos" javaType="list" ofType="org.andy.shop.model.CourseInfo"> <id property="id" column="course_id" jdbcType="INTEGER" /> <result property="cname" column="cname" jdbcType="VARCHAR" /> <result property="caddress" column="caddress" jdbcType="VARCHAR" /> </collection> </resultMap> <select id="selectAll" resultMap="UserCourseMap"> select u.id, u.uname, u.unumber, c.id course_id, c.cname, c.caddress from user_info u left join course_user_info cu on u.id = cu.uid left join course_info c on cu.cid = c.id </select> </mapper>
4、引入Spring并配置相关属性
在src/main/resources创建spring的配置文件,这里创建了spring.xml,信息如下:
[html] view plain copy <?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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.php.cn/ http://www.php.cn/ http://www.php.cn/"> <!--引入配置属性文件 --> <context:property-placeholder location="classpath:config.properties" /> <!--自动扫描含有@Service将其注入为bean --> <context:component-scan base-package="org.andy.shop.service" /> </beans>
5、引入Mybatis并配置数据连接池等信息
5.1、数据连接池druid配置信息
配置连接池配置信息在config.properties中,如下:
[plain] view plain copy
#mysql version database druid setting validationQuery=SELECT 1 jdbc.url=jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf-8 jdbc.username=root jdbc.password=12345
5.2、配置Mybatis相关信息
以下是mybatis的配置信息:spring-mybatis.xml(ps:名字可随便起)
[html] view plain copy
<?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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.php.cn/ http://www.php.cn/ http://www.php.cn/ http://www.php.cn/ http://www.php.cn/ http://www.php.cn/ "> <!-- 配置数据源 使用的是Druid数据源 --> <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- 初始化连接大小 --> <property name="initialSize" value="0" /> <!-- 连接池最大使用连接数量 --> <property name="maxActive" value="20" /> <!-- 连接池最小空闲 --> <property name="minIdle" value="0" /> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="60000" /> <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="33" /> <!-- 用来检测有效sql --> <property name="validationQuery" value="${validationQuery}" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <property name="testWhileIdle" value="true" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="25200000" /> <!-- 打开removeAbandoned功能 --> <property name="removeAbandoned" value="true" /> <!-- 1800秒,也就是30分钟 --> <property name="removeAbandonedTimeout" value="1800" /> <!-- 关闭abanded连接时输出错误日志 --> <property name="logAbandoned" value="true" /> <!-- 监控数据库 --> <property name="filters" value="mergeStat" /> </bean> <!-- myBatis文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --> <property name="mapperLocations" value="classpath:org/andy/shop/mapping/*.xml" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="org.andy.shop.dao" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 注解方式配置事物 --> <!-- <tx:annotation-driven transaction-manager="transactionManager" /> --> <!-- 拦截器方式配置事物 --> <tx:advice id="transactionAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <tx:method name="select*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <!-- Spring aop事务管理 --> <aop:config> <aop:pointcut id="transactionPointcut" expression="execution(* org.andy.shop.service..*Impl.*(..))" /> <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" /> </aop:config> </beans>
主要配置数据连接池,事务管理, mybatis关联映射等,事务采用aop的声明式事务。
6、引入日志
在src/main/resources中添加log4j日志配置信息:
log4j.properties
[plain] view plain copy
### set log levels ### log4j.rootLogger = INFO , C , D , E ### console ### log4j.appender.C = org.apache.log4j.ConsoleAppender log4j.appender.C.Target = System.out log4j.appender.C.layout = org.apache.log4j.PatternLayout log4j.appender.C.layout.ConversionPattern = [springmvc_mybatis_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n ### log file ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = ../logs/springmvc-mybatis-demo.log log4j.appender.D.Append = true log4j.appender.D.Threshold = INFO log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = [springmvc_mybatis_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n ### exception ### log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File = ../logs/springmvc-mybatis-demo_error.log log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = [sspringmvc_mybatis_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
7、创建Service
在src/main/java中创建相关的org.andy.shop.service包和org.andy.shop.service.Impl包。
UserService接口:
[java] view plain copy
package org.andy.shop.service; import java.util.List; import org.andy.shop.model.UserInfo; /** * 创建时间:2015-1-27 下午5:15:03 * @author andy * @version 2.2 */ public interface UserService { UserInfo getUserById(int id); List<UserInfo> getUsers(); int insert(UserInfo userInfo); }
UserServiceImpl实现Service:
[java] view plain copy
package org.andy.shop.service.impl; import java.util.List; import org.andy.shop.dao.UserInfoMapper; import org.andy.shop.model.UserInfo; import org.andy.shop.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * 创建时间:2015-1-27 下午5:22:59 * * @author andy * @version 2.2 */ @Service("userService") public class UserServiceImpl implements UserService { @Autowired private UserInfoMapper userInfoMapper; @Override public UserInfo getUserById(int id) { return userInfoMapper.selectByPrimaryKey(id); } @Override public List<UserInfo> getUsers() { return userInfoMapper.selectAll(); } @Override public int insert(UserInfo userInfo) { int result = userInfoMapper.insert(userInfo); System.out.println(result); return result; } }
8、测试Spring和Mybatis配置
在src/test/java中写测试类,检测是否能够读出数据,若能读出则证明Spring+Mybatis整合成功。
TestUserService测试类:
[java] view plain copy
package org.andy.shop.service; import java.util.List; import org.andy.shop.model.UserInfo; import org.apache.log4j.Logger; 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.alibaba.fastjson.JSON; /** * 创建时间:2015-1-27 下午10:45:38 * * @author andy * @version 2.2 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:spring.xml", "classpath:spring-mybatis.xml" }) public class TestUserService { private static final Logger LOGGER = Logger .getLogger(TestUserService.class); @Autowired private UserService userService; @Test public void testQueryById1() { UserInfo userInfo = userService.getUserById(1); LOGGER.info(JSON.toJSON(userInfo)); } @Test public void testQueryAll() { List<UserInfo> userInfos = userService.getUsers(); LOGGER.info(JSON.toJSON(userInfos)); } @Test public void testInsert() { UserInfo userInfo = new UserInfo(); userInfo.setUname("xiaoming"); userInfo.setUnumber(4); int result = userService.insert(userInfo); System.out.println(result); } }
若是测试成功,那证明已经成功了一半了。
9、引入SpringMVC
9.1 配置SpringMVC配置信息
SpringMVC的配置信息主要包括控制层Controller的bean管理,视图层和控制层配置等等,下面是spring-mvc.xml信息:
[html] view plain copy
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.php.cn/ http://www.php.cn/ http://www.php.cn/ http://www.php.cn/ http://www.php.cn/"> <!-- 自动扫描controller包下的所有类,如果@Controller注入为bean --> <context:component-scan base-package="org.andy.shop.controller" /> <!-- 避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <!-- json转换器 --> <ref bean="mappingJacksonHttpMessageConverter" /> </list> </property> </bean> <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --> <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> <!-- 配置多文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding"> <value>UTF-8</value> </property> <property name="maxUploadSize"> <!-- 上传文件大小限制为31M,31*1024*1024 --> <value>32505856</value> </property> <property name="maxInMemorySize"> <value>4096</value> </property> </bean> </beans>
自动扫描org.andy.shop.controller报下还有@Controller的控制层,注入为bean。
9.2、Web容器web.xml配置
web容器配置启动加载的配置文件,设置SpringMVC拦截的请求(此处拦截.htmls结尾的url请求)
[html] view plain copy <?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://www.php.cn/" id="WebApp_ID" version="2.5"> <display-name>springmvc_mybatis_demo</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml,classpath:spring-mybatis.xml</param-value> </context-param> <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> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 防止spring内存溢出监听器 --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <servlet> <description>spring mvc servlet</description> <servlet-name>rest</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-mvc.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>rest</servlet-name> <url-pattern>*.htmls</url-pattern> </servlet-mapping> <!-- 配置session超时时间,单位分钟 --> <session-config> <session-timeout>30</session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
9.3、Controller控制层
在org.andy.shop.controller创建控制层,如UserController.java
[java] view plain copy
package org.andy.shop.controller; import java.util.List; import org.andy.shop.model.UserInfo; import org.andy.shop.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; /** * 创建时间:2015-1-28 下午1:17:27 * @author andy * @version 2.2 */ @Controller @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @RequestMapping("/showInfo/{userId}") public String showUserInfo(ModelMap modelMap, @PathVariable int userId){ UserInfo userInfo = userService.getUserById(userId); modelMap.addAttribute("userInfo", userInfo); return "/user/showInfo"; } @RequestMapping("/showInfos") public @ResponseBody Object showUserInfos(){ List<UserInfo> userInfos = userService.getUsers(); return userInfos; } }
9.4、视图层
在WEB-INF创建视图总目录views(为了安全起见一般都在WEB-INF下创建),创建/user/showInfo.jsp视图文件。
[html] view plain copy
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>userInfo</title> </head> <body> 姓名: ${userInfo.uname} </body> </html>
9.5、项目总目录结构
到此为demo以及基本创建完成总目录如下:
10、项目测试
将项目编译,Maven build...输入clean compile package,部署到Tomcat服务器,启动项目。
测试1:测试第一个url, http://www.php.cn/:8080/springmvc_mybatis_demo/user/showInfo/1.htmls
测试2:测试第二个json数据返回的url, http://www.php.cn/:8080/springmvc_mybatis_demo/user/showInfos.htmls
ok,数据正常显示,SpringMVC+Mybatis搭建成功。
博客来源:http://www.php.cn/
源码地址:http://www.php.cn/
后续
在测试时,我们并不需要要启动web容器,junit测试时,需要以下几点注意事项:
1、测试时,将pom.xml文件中的依赖包的范围去掉
junit,spring-test,servlet-api的scope范围去掉。
2、在测试编译时,可能会把mybatis的映射配置文件.xml过滤掉,所以需要在pom.xml中添加如下配置:
[html] view plain copy
<resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources>
上述文件添加在
3、项目导入注意事项
下载完之后,只保留pom.xml 和 src两个文件,其他的删除。
右击“Import..” 选择maven项目导入(所以首先要将maven插件装好,maven配好),如下:
导入以后项目会出现叉号,项目是在jdk1.7基础上运行的,需要配置一下项目的环境(jdk装1.7及以上),右击该项目选择“Properties”弹出如下框:
上記の 3 つのフィールドを変更する必要があります:
1. Java Build Path で「Libraries」を選択し、JRE System Library をインストールされている javase-1.7 に変更します
2. Java Compile の JDK Compliance の Compiler Compliance level を次のように変更します。 1.7
3 、プロジェクト ファセットの動的 Web モジュールを 2.5 以降に変更します
変更できますJavaのバージョンを1.7にしました
上記はSpringMVC+Mybatisプロジェクトを構築するMavenの詳細な説明です、詳細 関連コンテンツについては、お支払いくださいPHP 中国語 Web サイト (www.php. cn) に注意してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











MyBatis 動的 SQL タグの解釈: Set タグの使用法の詳細な説明 MyBatis は、豊富な動的 SQL タグを提供し、データベース操作ステートメントを柔軟に構築できる優れた永続層フレームワークです。このうち、Set タグは、UPDATE ステートメントで SET 句を生成するために使用され、更新操作でよく使用されます。この記事では、MyBatis での Set タグの使用法を詳細に説明し、特定のコード例を通じてその機能を示します。 SetタグとはMyBatiで使用するSetタグです。

Maven ビルド ツールの最適化: コンパイル速度の最適化: 並列コンパイルと増分コンパイルを活用します。依存関係の最適化: 依存関係ツリーを分析し、BOM (部品表) を使用して推移的な依存関係を管理します。実際のケース: コンパイル速度と依存関係管理の最適化を例を通して説明します。

MyBatis 1次キャッシュの詳細解説:データアクセス効率を高めるには?開発プロセス中、効率的なデータ アクセスは常にプログラマーの焦点の 1 つでした。 MyBatis のような永続層フレームワークの場合、キャッシュはデータ アクセス効率を向上させるための重要な方法の 1 つです。 MyBatis は、一次キャッシュと二次キャッシュという 2 つのキャッシュ メカニズムを提供しており、一次キャッシュはデフォルトで有効になっています。この記事では、MyBatis の 1 次キャッシュのメカニズムを詳細に紹介し、読者の理解を深めるために具体的なコード例を示します。

MyBatisGenerator は、MyBatis が公式に提供するコード生成ツールで、開発者がデータベース テーブル構造に準拠した JavaBeans、Mapper インターフェイス、および XML マッピング ファイルを迅速に生成するのに役立ちます。コード生成に MyBatisGenerator を使用するプロセスでは、構成パラメーターの設定が重要です。この記事では、構成パラメータの観点から開始し、MyBatisGenerator の機能を詳しく説明します。

MyBatis のキャッシュ メカニズムの分析: 1 次キャッシュと 2 次キャッシュの違いと応用 MyBatis フレームワークでは、キャッシュはデータベース操作のパフォーマンスを効果的に向上させることができる非常に重要な機能です。そのうち、一次キャッシュと二次キャッシュは、MyBatis でよく使用される 2 つのキャッシュ メカニズムです。この記事では、一次キャッシュと二次キャッシュの違いと用途を詳細に分析し、具体的なコード例を示して説明します。 1. レベル 1 キャッシュ レベル 1 キャッシュはローカル キャッシュとも呼ばれ、デフォルトで有効になっており、オフにすることはできません。 1次キャッシュはSqlSesです

MyBatis ではエスケープ文字以下を使用することが一般的な要件であり、実際の開発プロセスではこのような状況がよく発生します。以下では、MyBatis で以下のエスケープ文字を使用する方法を詳しく紹介し、具体的なコード例を示します。まず、SQL ステートメントで以下のエスケープ文字がどのように表現されるかを明確にする必要があります。 SQL ステートメントでは、以下の演算子は通常 " で始まります。

タイトル: Maven Advanced Tutorial: Jar パッケージのインポートのさまざまな方法の詳細な探索 Maven は、Java プロジェクト管理ツールとして、プロジェクトの構築、依存関係の管理などに広く使用されています。実際の開発プロセスでは、さまざまなサードパーティ ライブラリの Jar パッケージを使用することが多く、Jar パッケージを効率的にインポートする方法は習得しなければならないスキルとなっています。この記事では、Maven に Jar パッケージをインポートする方法 (ローカル Jar パッケージ、リモート ウェアハウス Jar パッケージ、カスタム Jar パッケージの使用など) を詳しく掘り下げ、具体的な詳細を示します。

MyBatis は優れた永続層フレームワークであり、XML とアノテーションに基づいたデータベース操作をサポートし、シンプルで使いやすく、豊富なプラグイン メカニズムも提供します。その中でも、ページング プラグインは、よく使用されるプラグインの 1 つです。この記事では、MyBatis ページング プラグインの原理を詳しく説明し、具体的なコード例で説明します。 1. ページング プラグインの原理 MyBatis 自体はネイティブ ページング機能を提供しませんが、プラグインを使用してページング クエリを実装できます。ページング プラグインの原理は主に MyBatis を傍受することです
