SSM框架整合
1.工具IDEA
2.新建maven工程:
3.整合所需jar包:maven引入
单元测试:junit
日志:logging,logback,
JSON:jackson-databind
Spring:spring-core,spring-context,spring-test,spring-tx,spring-beans,spring-jdbc,spring-web,spring-webmvc
Mybatis:mybatis,mybatis-spring,pagehelper(分页插件)
Mysql:mysql-connector-java
数据源:druid
JSTL:jstl
<?xml version="1.0" encoding="UTF-8"?> <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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>TestSsmProject</groupId> <artifactId>TestSsmProject</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>TestSsmProject Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!-- 实现slf4j接口并整合 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.2</version> </dependency> <!-- JSON --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.7</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.3.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.3.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.2.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.18</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-web --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.3.10.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.12.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-test --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.12.RELEASE</version> <scope>test</scope> </dependency> <!-- mybatis分页插件依赖 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <scope>runtime</scope> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-jxpath/commons-jxpath --> <dependency> <groupId>commons-jxpath</groupId> <artifactId>commons-jxpath</artifactId> <version>1.3</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.ibatis/ibatis-sqlmap --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>24.0-jre</version> </dependency> <!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-core-asl --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.13</version> </dependency> </dependencies> <build> <finalName>TestOneMaven</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.0.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.20.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.0</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build> </project>
4.配置文件:
日志:
# Global logging configuration #在开发环境下日志级别要设置成DEBUG,生产环境设置成info或error log4j.rootLogger=DEBUG, stdout # 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
数据库信息:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/test_crud?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull jdbc.username=root jdbc.password=root validationQuery=SELECT 1
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: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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!--扫描配置文件--> <context:property-placeholder location="classpath:db.properties"></context:property-placeholder> <!--扫描--> <context:component-scan base-package="xin.mikey.www"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <!--配置数据源--> <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="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="stat" /> --> <property name="filters" value="mergeStat" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 配置数据库表对应的java实体类 --> <property name="typeAliasesPackage" value="xin.mikey.www.pojo" /> <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --> <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property> <property name="mapperLocations" value="classpath:xin/mikey/www/mapper/*.xml" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="xin.mikey.www.mapper" /> <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"/> </beans>
<?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: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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!--扫描配置文件--> <context:property-placeholder location="classpath:db.properties"></context:property-placeholder> <!--扫描--> <context:component-scan base-package="xin.mikey.www"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <!--配置数据源--> <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="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="stat" /> --> <property name="filters" value="mergeStat" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 配置数据库表对应的java实体类 --> <property name="typeAliasesPackage" value="xin.mikey.www.pojo" /> <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --> <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property> <property name="mapperLocations" value="classpath:xin/mikey/www/mapper/*.xml" /> </bean> <!--动态代理自动生成mapper的实现类--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="xin.mikey.www.mapper" /> <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"/> </beans>
SprintMvc配置文件:
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!-- 配置自动扫描的包 --> <context:component-scan base-package="xin.mikey.www.controller"></context:component-scan> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean> <!-- default-servlet-handler 将在 SpringMVC 上下文中定义一个 DefaultServletHttpRequestHandler, 它会对进入 DispatcherServlet 的请求进行筛查, 如果发现是没有经过映射的请求, 就将该请求交由 WEB 应用服务器默认的 Servlet 处理. 如果不是静态资源的请求,才由 DispatcherServlet 继续处理 一般 WEB 应用服务器默认的 Servlet 的名称都是 default. 若所使用的 WEB 服务器的默认 Servlet 名称不是 default,则需要通过 default-servlet-name 属性显式指定 --> <mvc:default-servlet-handler/> <mvc:annotation-driven/> <!--<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">--> <!--<property name="converters">--> <!--<set>--> <!--<ref bean="employeeConverter"/>--> <!--</set>--> <!--</property>--> <!--</bean>--> <!--<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">--> <!--<property name="basename" value="i18n"></property>--> <!--</bean>--> <!--<mvc:view-controller path="/i18n" view-name="i18n"></mvc:view-controller>--> <!--<mvc:view-controller path="/i18n2" view-name="i18n2"></mvc:view-controller>--> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" ></bean> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean> <!--<bean class="com.mikey.www.interceptors.FirstInterceptor"></bean>--> <!--配置拦截器(不)作用的路径--> <!--<mvc:interceptor>--> <!--<mvc:mapping path="/emps"/>--> <!--<bean class="com.mikey.www.interceptors.SecondInterceptor"></bean>--> <!--</mvc:interceptor>--> </mvc:interceptors> <!--配置MultipartResolver--> <!--<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">--> <!--<property name="defaultEncoding" value="UTF-8"></property>--> <!--<property name="maxUploadSize" value="1024000"></property>--> <!--</bean>--> <!--配置自定义拦截器--> <!--<bean class="com.mikey.www.interceptors.FirstInterceptor"></bean>--> <!--<!–配置使用simplemappingException–>--> <!--<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">--> <!--<!–<property name="exceptionAttribute" value="ex"></property>–>--> <!--<property name="exceptionMappings">--> <!--<props>--> <!--<prop key="java.lang.ArrayIndexOutOfBoundsException">error</prop>--> <!--</props>--> <!--</property>--> <!--</bean>--> </beans>
Mybatis全局配置文件:
<settings> <!-- 打印查询语句 --> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings>
<?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="mikey.www.pojo"></package> </typeAliases> <plugins> <plugin interceptor="com.github.pagehelper.PageHelper"> <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库--> <property name="dialect" value="mysql"/> </plugin> </plugins> </configuration>
配置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_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- 配置 SpringMVC 的 DispatcherServlet --> <!-- The front controller of this Spring Web application, responsible for handling all application requests --> <!--过滤器解决工程编码--> <filter> <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext</param-value> </context-param> <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc/springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- Map all requests to the DispatcherServlet for handling --> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 配置 HiddenHttpMethodFilter: 把 POST 请求转为 DELETE、PUT 请求 --> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <!--放行静态资源文件--> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/js/*</url-pattern> <url-pattern>/css/*</url-pattern> <url-pattern>/fonts/*</url-pattern> <url-pattern>/images/*</url-pattern> </servlet-mapping> </web-app>
项目结构目录:
编写mapper接口及映射文件:
<?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="xin.mikey.www.mapper.UserMapper"> <!--<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>--> <resultMap id="userMap" type="xin.mikey.www.pojo.User"> <id column="id" property="id"/> <result column="user_id" property="userid"/> <result column="user_sex" property="sex"/> <result column="user_age" property="age"/> <result column="user_email" property="email"/> <result column="user_name" property="username"/> <result column="user_pwd" property="password"/> </resultMap> <select id="findUserById" parameterType="String" resultMap="userMap"> SELECT * FROM user WHERE id=#{value} </select> <insert id="saveUser" parameterType="user" > insert user(id,user_id,user_sex,user_age,user_email,user_name,user_pwd) value(#{id},#{userid},#{sex},#{age},#{email},#{username},#{password}) </insert> <select id="getAllUser" resultMap="userMap"> SELECT * from USER </select> <select id="findUserByIds" parameterType="int" resultMap="userMap"> SELECT * FROM user where <!--SELECT * FROM `user` WHERE user_id=1 or user_id=2;--> <foreach collection="array" item="id" separator="or"> user_id=#{id} </foreach> </select> <!--update--> <update id="updateUser" parameterType="user"> update user set id=#{id},user_id=#{userid},user_sex=#{sex},user_age=#{age},user_email=#{email},user_name=#{username},user_pwd=#{password} where id=#{id} </update> <!--delete--> <delete id="deleteUser" parameterType="java.lang.String"> delete from user where id=#{value} </delete> <!--userLogin--> <select id="userLogin" parameterType="user" resultMap="userMap"> SELECT * from user where user_email=#{usereamil} and user_pwd=#{password} </select> <!--rigister--> <insert id="userRegister" parameterType="user"> insert USER(id,user_email,user_pwd) value (#{id},#{email},#{password}) </insert> </mapper>
package xin.mikey.www.mapper; import org.springframework.stereotype.Repository; import xin.mikey.www.pojo.User; import java.util.List; /** * @author Mikey * @Title: * @Description: * @date 2018/10/15 18:34 * @Version 1.0 */ @Repository public interface UserMapper { public User findUserById(String id) throws Exception; public List<User> findUserByIds(int[] ids) throws Exception; public void saveUser(User user) throws Exception; public void deleteUser(String id) throws Exception; public void updateUser(User user) throws Exception; public List<User> getAllUser() throws Exception; }
pojo类:
package xin.mikey.www.pojo; import org.springframework.stereotype.Component; /** * @author Mikey * @Title: * @Description: * @date 2018/10/15 18:32 * @Version 1.0 */ @Component public class User { private String id; private Integer userid; private String username; private Integer sex; private Integer age; private String email; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getId() { return id; } public void setId(String id) { this.id = id; } public Integer getUserid() { return userid; } public void setUserid(Integer userid) { this.userid = userid; } public Integer getSex() { return sex; } public void setSex(Integer sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User{" + "id='" + id + '\'' + ", userid='" + userid + '\'' + ", username='" + username + '\'' + ", sex=" + sex + ", age=" + age + ", email='" + email + '\'' + ", password='" + password + '\'' + '}'; } }
DAO层:
package xin.mikey.www.dao.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import xin.mikey.www.dao.UserDao; import xin.mikey.www.mapper.UserMapper; import xin.mikey.www.pojo.User; import java.util.List; /** * @author Mikey * @Title: * @Description: * @date 2018/10/15 19:14 * @Version 1.0 */ @Repository public class UserDaoImpl implements UserDao { @Autowired private UserMapper userMapper; @Override public User findUserById(String id) throws Exception { return userMapper.findUserById(id); } @Override public List<User> findUserByIds(int[] ids) throws Exception { return userMapper.findUserByIds(ids); } @Override public void saveUser(User user) throws Exception { userMapper.saveUser(user); } @Override public void deleteUser(String id) throws Exception { userMapper.deleteUser(id); } @Override public void updateUser(User user) throws Exception { userMapper.updateUser(user); } @Override public List<User> getAllUser() throws Exception { List<User> allUser =userMapper.getAllUser(); return allUser; } }
package xin.mikey.www.dao; import org.springframework.stereotype.Repository; import xin.mikey.www.pojo.User; import java.util.List; /** * @author Mikey * @Title: * @Description: * @date 2018/10/15 19:13 * @Version 1.0 */ @Repository public interface UserDao{ public User findUserById(String id) throws Exception; public List<User> findUserByIds(int[] ids) throws Exception; public void saveUser(User user) throws Exception; public void deleteUser(String id) throws Exception; public void updateUser(User user) throws Exception; public List<User> getAllUser() throws Exception; }
Service层:
package xin.mikey.www.service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import xin.mikey.www.dao.UserDao; import xin.mikey.www.pojo.User; import xin.mikey.www.service.UserService; import java.util.List; /** * @author Mikey * @Title: * @Description: * @date 2018/10/15 19:30 * @Version 1.0 */ @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public User findUserById(String id) throws Exception { return userDao.findUserById(id); } @Override public List<User> findUserByIds(int[] ids) throws Exception { return this.userDao.findUserByIds(ids); } @Override public void saveUser(User user) throws Exception { this.userDao.saveUser(user); } @Override public void deleteUser(String id) throws Exception { this.userDao.deleteUser(id); } @Override public void updateUser(User user) throws Exception { this.userDao.updateUser(user); } @Override public List<User> getAllUser() throws Exception { return this.userDao.getAllUser(); } }
package xin.mikey.www.service; import org.springframework.stereotype.Service; import xin.mikey.www.pojo.User; import java.util.List; /** * @author Mikey * @Title: * @Description: * @date 2018/10/15 19:29 * @Version 1.0 */ @Service public interface UserService { public User findUserById(String id) throws Exception; public List<User> findUserByIds(int[] ids) throws Exception; public void saveUser(User user) throws Exception; public void deleteUser(String id) throws Exception; public void updateUser(User user) throws Exception; public List<User> getAllUser() throws Exception; }
Controller层:
package xin.mikey.www.controller; import com.sun.org.glassfish.gmbal.ParameterNames; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestParam; import xin.mikey.www.pojo.User; import java.util.List; import java.util.Map; /** * @author Mikey * @Title: * @Description: * @date 2018/10/15 19:13 * @Version 1.0 */ @Controller public interface UserController { /** * 通过id查找用户信息 * @return * @throws Exception */ public String findUserById(@RequestParam("userid") String id,Map<String,Object> map) throws Exception; public String findUserByIds(@RequestParam("ids") String ids,Map<String,Object> map) throws Exception; public String saveUser(User user,Map<String,Object> map) throws Exception; public String deleteUser(String id,Map<String,Object> map) throws Exception; public String updateUser(User user,Map<String,Object> map) throws Exception; public String userLogin(@RequestParam("eamil") String email,@RequestParam("password") String pwd,Map<String,Object> map); }
package xin.mikey.www.controller.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.collect.Maps; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import xin.mikey.www.controller.UserController; import xin.mikey.www.pojo.User; import xin.mikey.www.service.UserService; import java.util.List; import java.util.Map; import java.util.UUID; /** * @author Mikey * @Title: * @Description: * @date 2018/10/15 19:32 * @Version 1.0 */ @Controller @SessionAttributes("user") @RequestMapping("/user") public class UserControllerImpl implements UserController { private String SCU="success"; @Qualifier("userServiceImpl") @Autowired private UserService userService; @RequestMapping("/loginUI") public String loginUI(){ System.out.println("loginUI"); return "login"; } @RequestMapping("/findUserById/{id}") public String findUserById(@PathVariable("id") String id, Map<String,Object> map) throws Exception { User user= this.userService.findUserById(id); map.put("user",user); return "edit"; } @Override @RequestMapping("/findUserByIds") public String findUserByIds(String ids, Map<String,Object> map) throws Exception { // this.userService.findUserByIds(); return null; } @RequestMapping("/addWork") public String addWorkUI(){ return "addwork"; } @Override @RequestMapping("/saveUser") public String saveUser(User user, Map<String,Object> map) throws Exception { user.setId(UUID.randomUUID().toString()); user.setPassword("000"); userService.saveUser(user); return "redirect:addWork"; } @Override @RequestMapping("/deleteUser/{id}") public String deleteUser(@PathVariable("id") String id, Map<String,Object> map) throws Exception { System.out.println("ID="+id); userService.deleteUser(id); return "redirect:/user/getAll"; } @Override @RequestMapping(value = "/updateUser",method = RequestMethod.PUT) public String updateUser(User user, Map<String,Object> map) throws Exception { userService.updateUser(user); return "redirect:/user/getAll"; } @Override @RequestMapping("/login") public String userLogin(String email, String pwd, Map<String, Object> map) { System.out.println("Message="+email+"//"+pwd); return "main"; } @RequestMapping("/getAll") public String getAllUser(Map<String,Object> map){ List<User> list= null; try { list = userService.getAllUser(); } catch (Exception e) { e.printStackTrace(); } map.put("users",list); return "showAll"; } @RequestMapping("/getAllPage/{str_pageNo}") public ModelAndView getAllUserPage(@PathVariable(value = "str_pageNo",required = false) String str_pageNo, Map<String,Object> maps) throws Exception { //拿到用户需要的是哪一页的文章数据 if(str_pageNo == null){ //开始使用分页插件,准备查询第一页的8条数据 PageHelper.startPage(1, 8); } else{ //准备查询 第X页 的8条数据 PageHelper.startPage(Integer.parseInt(str_pageNo), 8); } //参数Map final Map<String,Object> map = Maps.newHashMap(); //获取所有作者的所有文章 final List<User> articles = userService.getAllUser(); //将查询结果放入分页控件中 final PageInfo<User> pageInfo=new PageInfo<User>(articles); //组装数据,在JSP页面可以通过 ${articles} 或者 ${pageInfo}请求获取数据 map.put("users",articles); map.put("pageInfo",pageInfo); //返回某个具体的JSP页面,并且携带上map里面的存储的数据 return new ModelAndView("showAll",map); } }
报错:
发现target没有映射文件:
解决方法:
pom文件加入:
<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </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://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.atguigu</groupId> <artifactId>ssm-crud</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <!--引入项目依赖的jar包 --> <!-- SpringMVC、Spring --> <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependencies> <!--引入pageHelper分页插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.0.0</version> </dependency> <!-- MBG --> <!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.5</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.7.RELEASE</version> </dependency> <!-- 返回json字符串的支持 --> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.8</version> </dependency> <!--JSR303数据校验支持;tomcat7及以上的服务器, tomcat7以下的服务器:el表达式。额外给服务器的lib包中替换新的标准的el --> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.4.1.Final</version> </dependency> <!-- Spring-Jdbc --> <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.7.RELEASE</version> </dependency> <!--Spring-test --> <!-- https://mvnrepository.com/artifact/org.springframework/spring-test --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.7.RELEASE</version> </dependency> <!-- Spring面向切面编程 --> <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.3.7.RELEASE</version> </dependency> <!--MyBatis --> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.2</version> </dependency> <!-- MyBatis整合Spring的适配包 --> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- 数据库连接池、驱动 --> <!-- https://mvnrepository.com/artifact/c3p0/c3p0 --> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.41</version> </dependency> <!-- (jstl,servlet-api,junit) --> <!-- https://mvnrepository.com/artifact/jstl/jstl --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <!-- junit --> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> </project>
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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.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"> <context:component-scan base-package="com.atguigu"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <!-- Spring的配置文件,这里主要配置和业务逻辑有关的 --> <!--=================== 数据源,事务控制,xxx ================--> <context:property-placeholder location="classpath:dbconfig.properties" /> <bean id="pooledDataSource" 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.user}"></property> <property name="password" value="${jdbc.password}"></property> </bean> <!--================== 配置和MyBatis的整合=============== --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定mybatis全局配置文件的位置 --> <property name="configLocation" value="classpath:mybatis-config.xml"></property> <property name="dataSource" ref="pooledDataSource"></property> <!-- 指定mybatis,mapper文件的位置 --> <property name="mapperLocations" value="classpath:mapper/*.xml"></property> </bean> <!-- 配置扫描器,将mybatis接口的实现加入到ioc容器中 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--扫描所有dao接口的实现,加入到ioc容器中 --> <property name="basePackage" value="com.atguigu.crud.dao"></property> </bean> <!-- 配置一个可以执行批量的sqlSession --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg> <constructor-arg name="executorType" value="BATCH"></constructor-arg> </bean> <!--============================================= --> <!-- ===============事务控制的配置 ================--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--控制住数据源 --> <property name="dataSource" ref="pooledDataSource"></property> </bean> <!--开启基于注解的事务,使用xml配置形式的事务(必要主要的都是使用配置式) --> <aop:config> <!-- 切入点表达式 --> <aop:pointcut expression="execution(* com.atguigu.crud.service..*(..))" id="txPoint"/> <!-- 配置事务增强 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/> </aop:config> <!--配置事务增强,事务如何切入 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 所有方法都是事务方法 --> <tx:method name="*"/> <!--以get开始的所有方法 --> <tx:method name="get*" read-only="true"/> </tx:attributes> </tx:advice> <!-- Spring配置文件的核心点(数据源、与mybatis的整合,事务控制) --> </beans>
springMvc配置文件;
<?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-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!--SpringMVC的配置文件,包含网站跳转逻辑的控制,配置 --> <context:component-scan base-package="com.atguigu" use-default-filters="false"> <!--只扫描控制器。 --> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--配置视图解析器,方便页面返回 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean> <!--两个标准配置 --> <!-- 将springmvc不能处理的请求交给tomcat --> <mvc:default-servlet-handler/> <!-- 能支持springmvc更高级的一些功能,JSR303校验,快捷的ajax...映射动态请求 --> <mvc:annotation-driven/> </beans>
myBatis配置文件:
<?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="mapUnderscoreToCamelCase" value="true"/> </settings> <typeAliases> <package name="com.atguigu.crud.bean"/> </typeAliases> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!--分页参数合理化 --> <property name="reasonable" value="true"/> </plugin> </plugins> </configuration>
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_2_5.xsd" id="WebApp_ID" version="2.5"> <!--1、启动Spring的容器 --> <!-- needed for ContextLoaderListener --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- Bootstraps the root web application context before servlet initialization --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--2、springmvc的前端控制器,拦截所有请求 --> <!-- The front controller of this Spring Web application, responsible for handling all application requests --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- Map all requests to the DispatcherServlet for handling --> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 3、字符编码过滤器,一定要放在所有过滤器之前 --> <filter> <filter-name>CharacterEncodingFilter</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>forceRequestEncoding</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 4、使用Rest风格的URI,将页面普通的post请求转为指定的delete或者put请求 --> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>HttpPutFormContentFilter</filter-name> <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class> </filter> <filter-mapping> <filter-name>HttpPutFormContentFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
数据库参数配置:
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/ssm_crud
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=123456
日志配置文件:
...................
逆向文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <context id="DB2Tables" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressAllComments" value="true" /> </commentGenerator> <!-- 配置数据库连接 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/ssm_crud" userId="root" password="123456"> </jdbcConnection> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- 指定javaBean生成的位置 --> <javaModelGenerator targetPackage="com.atguigu.crud.bean" targetProject=".\src\main\java"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <!--指定sql映射文件生成的位置 --> <sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!-- 指定dao接口生成的位置,mapper接口 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.crud.dao" targetProject=".\src\main\java"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- table指定每个表的生成策略 --> <table tableName="tbl_emp" domainObjectName="Employee"></table> <table tableName="tbl_dept" domainObjectName="Department"></table> </context> </generatorConfiguration>
批量插入数据:
package com.atguigu.crud.test; import java.util.UUID; import org.apache.ibatis.session.SqlSession; 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.atguigu.crud.bean.Employee; import com.atguigu.crud.dao.DepartmentMapper; import com.atguigu.crud.dao.EmployeeMapper; /** * 测试dao层的工作 * @author lfy *推荐Spring的项目就可以使用Spring的单元测试,可以自动注入我们需要的组件 *1、导入SpringTest模块 *2、@ContextConfiguration指定Spring配置文件的位置 *3、直接autowired要使用的组件即可 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:applicationContext.xml"}) public class MapperTest { @Autowired DepartmentMapper departmentMapper; @Autowired EmployeeMapper employeeMapper; @Autowired SqlSession sqlSession; /** * 测试DepartmentMapper */ @Test public void testCRUD(){ /* //1、创建SpringIOC容器 ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml"); //2、从容器中获取mapper DepartmentMapper bean = ioc.getBean(DepartmentMapper.class);*/ System.out.println(departmentMapper); //1、插入几个部门 // departmentMapper.insertSelective(new Department(null, "开发部")); // departmentMapper.insertSelective(new Department(null, "测试部")); //2、生成员工数据,测试员工插入 employeeMapper.insertSelective(new Employee(null, "Jerry", "M", "Jerry@atguigu.com", 1)); //3、批量插入多个员工;批量,使用可以执行批量操作的sqlSession。 // for(){ // employeeMapper.insertSelective(new Employee(null, , "M", "Jerry@atguigu.com", 1)); // } EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class); for(int i = 0;i<1000;i++){ String uid = UUID.randomUUID().toString().substring(0,5)+i; mapper.insertSelective(new Employee(null,uid, "M", uid+"@atguigu.com", 1)); } System.out.println("批量完成"); } }
测试生成mapper文件:
package com.atguigu.crud.test; import java.io.File; import java.util.ArrayList; import java.util.List; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; public class MBGTest { public static void main(String[] args) throws Exception { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; File configFile = new File("mbg.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } }
Mapper文件:
package com.atguigu.crud.dao; import com.atguigu.crud.bean.Employee; import com.atguigu.crud.bean.EmployeeExample; import java.util.List; import org.apache.ibatis.annotations.Param; public interface EmployeeMapper { long countByExample(EmployeeExample example); int deleteByExample(EmployeeExample example); int deleteByPrimaryKey(Integer empId); int insert(Employee record); int insertSelective(Employee record); List<Employee> selectByExample(EmployeeExample example); Employee selectByPrimaryKey(Integer empId); List<Employee> selectByExampleWithDept(EmployeeExample example); Employee selectByPrimaryKeyWithDept(Integer empId); int updateByExampleSelective(@Param("record") Employee record, @Param("example") EmployeeExample example); int updateByExample(@Param("record") Employee record, @Param("example") EmployeeExample example); int updateByPrimaryKeySelective(Employee record); int updateByPrimaryKey(Employee record); }
<?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.atguigu.crud.dao.EmployeeMapper"> <resultMap id="BaseResultMap" type="com.atguigu.crud.bean.Employee"> <id column="emp_id" jdbcType="INTEGER" property="empId" /> <result column="emp_name" jdbcType="VARCHAR" property="empName" /> <result column="gender" jdbcType="CHAR" property="gender" /> <result column="email" jdbcType="VARCHAR" property="email" /> <result column="d_id" jdbcType="INTEGER" property="dId" /> </resultMap> <resultMap type="com.atguigu.crud.bean.Employee" id="WithDeptResultMap"> <id column="emp_id" jdbcType="INTEGER" property="empId" /> <result column="emp_name" jdbcType="VARCHAR" property="empName" /> <result column="gender" jdbcType="CHAR" property="gender" /> <result column="email" jdbcType="VARCHAR" property="email" /> <result column="d_id" jdbcType="INTEGER" property="dId" /> <!-- 指定联合查询出的部门字段的封装 --> <association property="department" javaType="com.atguigu.crud.bean.Department"> <id column="dept_id" property="deptId"/> <result column="dept_name" property="deptName"/> </association> </resultMap> <sql id="Example_Where_Clause"> <where> <foreach collection="oredCriteria" item="criteria" separator="or"> <if test="criteria.valid"> <trim prefix="(" prefixOverrides="and" suffix=")"> <foreach collection="criteria.criteria" item="criterion"> <choose> <when test="criterion.noValue"> and ${criterion.condition} </when> <when test="criterion.singleValue"> and ${criterion.condition} #{criterion.value} </when> <when test="criterion.betweenValue"> and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} </when> <when test="criterion.listValue"> and ${criterion.condition} <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=","> #{listItem} </foreach> </when> </choose> </foreach> </trim> </if> </foreach> </where> </sql> <sql id="Update_By_Example_Where_Clause"> <where> <foreach collection="example.oredCriteria" item="criteria" separator="or"> <if test="criteria.valid"> <trim prefix="(" prefixOverrides="and" suffix=")"> <foreach collection="criteria.criteria" item="criterion"> <choose> <when test="criterion.noValue"> and ${criterion.condition} </when> <when test="criterion.singleValue"> and ${criterion.condition} #{criterion.value} </when> <when test="criterion.betweenValue"> and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} </when> <when test="criterion.listValue"> and ${criterion.condition} <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=","> #{listItem} </foreach> </when> </choose> </foreach> </trim> </if> </foreach> </where> </sql> <sql id="Base_Column_List"> emp_id, emp_name, gender, email, d_id </sql> <sql id="WithDept_Column_List"> e.emp_id, e.emp_name, e.gender, e.email, e.d_id,d.dept_id,d.dept_name </sql> <!-- List<Employee> selectByExampleWithDept(EmployeeExample example); Employee selectByPrimaryKeyWithDept(Integer empId); --> <!-- 查询员工同时带部门信息 --> <select id="selectByExampleWithDept" resultMap="WithDeptResultMap"> select <if test="distinct"> distinct </if> <include refid="WithDept_Column_List" /> FROM tbl_emp e left join tbl_dept d on e.`d_id`=d.`dept_id` <if test="_parameter != null"> <include refid="Example_Where_Clause" /> </if> <if test="orderByClause != null"> order by ${orderByClause} </if> </select> <select id="selectByPrimaryKeyWithDept" resultMap="WithDeptResultMap"> select <include refid="WithDept_Column_List" /> FROM tbl_emp e left join tbl_dept d on e.`d_id`=d.`dept_id` where emp_id = #{empId,jdbcType=INTEGER} </select> <!-- 查询员工不带部门信息的 --> <select id="selectByExample" parameterType="com.atguigu.crud.bean.EmployeeExample" resultMap="BaseResultMap"> select <if test="distinct"> distinct </if> <include refid="Base_Column_List" /> from tbl_emp <if test="_parameter != null"> <include refid="Example_Where_Clause" /> </if> <if test="orderByClause != null"> order by ${orderByClause} </if> </select> <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from tbl_emp where emp_id = #{empId,jdbcType=INTEGER} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer"> delete from tbl_emp where emp_id = #{empId,jdbcType=INTEGER} </delete> <delete id="deleteByExample" parameterType="com.atguigu.crud.bean.EmployeeExample"> delete from tbl_emp <if test="_parameter != null"> <include refid="Example_Where_Clause" /> </if> </delete> <insert id="insert" parameterType="com.atguigu.crud.bean.Employee"> insert into tbl_emp (emp_id, emp_name, gender, email, d_id) values (#{empId,jdbcType=INTEGER}, #{empName,jdbcType=VARCHAR}, #{gender,jdbcType=CHAR}, #{email,jdbcType=VARCHAR}, #{dId,jdbcType=INTEGER}) </insert> <insert id="insertSelective" parameterType="com.atguigu.crud.bean.Employee"> insert into tbl_emp <trim prefix="(" suffix=")" suffixOverrides=","> <if test="empId != null"> emp_id, </if> <if test="empName != null"> emp_name, </if> <if test="gender != null"> gender, </if> <if test="email != null"> email, </if> <if test="dId != null"> d_id, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="empId != null"> #{empId,jdbcType=INTEGER}, </if> <if test="empName != null"> #{empName,jdbcType=VARCHAR}, </if> <if test="gender != null"> #{gender,jdbcType=CHAR}, </if> <if test="email != null"> #{email,jdbcType=VARCHAR}, </if> <if test="dId != null"> #{dId,jdbcType=INTEGER}, </if> </trim> </insert> <select id="countByExample" parameterType="com.atguigu.crud.bean.EmployeeExample" resultType="java.lang.Long"> select count(*) from tbl_emp <if test="_parameter != null"> <include refid="Example_Where_Clause" /> </if> </select> <update id="updateByExampleSelective" parameterType="map"> update tbl_emp <set> <if test="record.empId != null"> emp_id = #{record.empId,jdbcType=INTEGER}, </if> <if test="record.empName != null"> emp_name = #{record.empName,jdbcType=VARCHAR}, </if> <if test="record.gender != null"> gender = #{record.gender,jdbcType=CHAR}, </if> <if test="record.email != null"> email = #{record.email,jdbcType=VARCHAR}, </if> <if test="record.dId != null"> d_id = #{record.dId,jdbcType=INTEGER}, </if> </set> <if test="_parameter != null"> <include refid="Update_By_Example_Where_Clause" /> </if> </update> <update id="updateByExample" parameterType="map"> update tbl_emp set emp_id = #{record.empId,jdbcType=INTEGER}, emp_name = #{record.empName,jdbcType=VARCHAR}, gender = #{record.gender,jdbcType=CHAR}, email = #{record.email,jdbcType=VARCHAR}, d_id = #{record.dId,jdbcType=INTEGER} <if test="_parameter != null"> <include refid="Update_By_Example_Where_Clause" /> </if> </update> <update id="updateByPrimaryKeySelective" parameterType="com.atguigu.crud.bean.Employee"> update tbl_emp <set> <if test="empName != null"> emp_name = #{empName,jdbcType=VARCHAR}, </if> <if test="gender != null"> gender = #{gender,jdbcType=CHAR}, </if> <if test="email != null"> email = #{email,jdbcType=VARCHAR}, </if> <if test="dId != null"> d_id = #{dId,jdbcType=INTEGER}, </if> </set> where emp_id = #{empId,jdbcType=INTEGER} </update> <update id="updateByPrimaryKey" parameterType="com.atguigu.crud.bean.Employee"> update tbl_emp set emp_name = #{empName,jdbcType=VARCHAR}, gender = #{gender,jdbcType=CHAR}, email = #{email,jdbcType=VARCHAR}, d_id = #{dId,jdbcType=INTEGER} where emp_id = #{empId,jdbcType=INTEGER} </update> </mapper>
package com.atguigu.crud.dao; import com.atguigu.crud.bean.Department; import com.atguigu.crud.bean.DepartmentExample; import java.util.List; import org.apache.ibatis.annotations.Param; public interface DepartmentMapper { long countByExample(DepartmentExample example); int deleteByExample(DepartmentExample example); int deleteByPrimaryKey(Integer deptId); int insert(Department record); int insertSelective(Department record); List<Department> selectByExample(DepartmentExample example); Department selectByPrimaryKey(Integer deptId); int updateByExampleSelective(@Param("record") Department record, @Param("example") DepartmentExample example); int updateByExample(@Param("record") Department record, @Param("example") DepartmentExample example); int updateByPrimaryKeySelective(Department record); int updateByPrimaryKey(Department record); }
<?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.atguigu.crud.dao.DepartmentMapper"> <resultMap id="BaseResultMap" type="com.atguigu.crud.bean.Department"> <id column="dept_id" jdbcType="INTEGER" property="deptId" /> <result column="dept_name" jdbcType="VARCHAR" property="deptName" /> </resultMap> <sql id="Example_Where_Clause"> <where> <foreach collection="oredCriteria" item="criteria" separator="or"> <if test="criteria.valid"> <trim prefix="(" prefixOverrides="and" suffix=")"> <foreach collection="criteria.criteria" item="criterion"> <choose> <when test="criterion.noValue"> and ${criterion.condition} </when> <when test="criterion.singleValue"> and ${criterion.condition} #{criterion.value} </when> <when test="criterion.betweenValue"> and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} </when> <when test="criterion.listValue"> and ${criterion.condition} <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=","> #{listItem} </foreach> </when> </choose> </foreach> </trim> </if> </foreach> </where> </sql> <sql id="Update_By_Example_Where_Clause"> <where> <foreach collection="example.oredCriteria" item="criteria" separator="or"> <if test="criteria.valid"> <trim prefix="(" prefixOverrides="and" suffix=")"> <foreach collection="criteria.criteria" item="criterion"> <choose> <when test="criterion.noValue"> and ${criterion.condition} </when> <when test="criterion.singleValue"> and ${criterion.condition} #{criterion.value} </when> <when test="criterion.betweenValue"> and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} </when> <when test="criterion.listValue"> and ${criterion.condition} <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=","> #{listItem} </foreach> </when> </choose> </foreach> </trim> </if> </foreach> </where> </sql> <sql id="Base_Column_List"> dept_id, dept_name </sql> <select id="selectByExample" parameterType="com.atguigu.crud.bean.DepartmentExample" resultMap="BaseResultMap"> select <if test="distinct"> distinct </if> <include refid="Base_Column_List" /> from tbl_dept <if test="_parameter != null"> <include refid="Example_Where_Clause" /> </if> <if test="orderByClause != null"> order by ${orderByClause} </if> </select> <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from tbl_dept where dept_id = #{deptId,jdbcType=INTEGER} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer"> delete from tbl_dept where dept_id = #{deptId,jdbcType=INTEGER} </delete> <delete id="deleteByExample" parameterType="com.atguigu.crud.bean.DepartmentExample"> delete from tbl_dept <if test="_parameter != null"> <include refid="Example_Where_Clause" /> </if> </delete> <insert id="insert" parameterType="com.atguigu.crud.bean.Department"> insert into tbl_dept (dept_id, dept_name) values (#{deptId,jdbcType=INTEGER}, #{deptName,jdbcType=VARCHAR}) </insert> <insert id="insertSelective" parameterType="com.atguigu.crud.bean.Department"> insert into tbl_dept <trim prefix="(" suffix=")" suffixOverrides=","> <if test="deptId != null"> dept_id, </if> <if test="deptName != null"> dept_name, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="deptId != null"> #{deptId,jdbcType=INTEGER}, </if> <if test="deptName != null"> #{deptName,jdbcType=VARCHAR}, </if> </trim> </insert> <select id="countByExample" parameterType="com.atguigu.crud.bean.DepartmentExample" resultType="java.lang.Long"> select count(*) from tbl_dept <if test="_parameter != null"> <include refid="Example_Where_Clause" /> </if> </select> <update id="updateByExampleSelective" parameterType="map"> update tbl_dept <set> <if test="record.deptId != null"> dept_id = #{record.deptId,jdbcType=INTEGER}, </if> <if test="record.deptName != null"> dept_name = #{record.deptName,jdbcType=VARCHAR}, </if> </set> <if test="_parameter != null"> <include refid="Update_By_Example_Where_Clause" /> </if> </update> <update id="updateByExample" parameterType="map"> update tbl_dept set dept_id = #{record.deptId,jdbcType=INTEGER}, dept_name = #{record.deptName,jdbcType=VARCHAR} <if test="_parameter != null"> <include refid="Update_By_Example_Where_Clause" /> </if> </update> <update id="updateByPrimaryKeySelective" parameterType="com.atguigu.crud.bean.Department"> update tbl_dept <set> <if test="deptName != null"> dept_name = #{deptName,jdbcType=VARCHAR}, </if> </set> where dept_id = #{deptId,jdbcType=INTEGER} </update> <update id="updateByPrimaryKey" parameterType="com.atguigu.crud.bean.Department"> update tbl_dept set dept_name = #{deptName,jdbcType=VARCHAR} where dept_id = #{deptId,jdbcType=INTEGER} </update> </mapper>
pojo类:
package com.atguigu.crud.bean; import java.util.HashMap; import java.util.Map; /** * 通用的返回的类 * * @author lfy * */ public class Msg { //状态码 100-成功 200-失败 private int code; //提示信息 private String msg; //用户要返回给浏览器的数据 private Map<String, Object> extend = new HashMap<String, Object>(); public static Msg success(){ Msg result = new Msg(); result.setCode(100); result.setMsg("处理成功!"); return result; } public static Msg fail(){ Msg result = new Msg(); result.setCode(200); result.setMsg("处理失败!"); return result; } public Msg add(String key,Object value){ this.getExtend().put(key, value); return this; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Map<String, Object> getExtend() { return extend; } public void setExtend(Map<String, Object> extend) { this.extend = extend; } }
package com.atguigu.crud.bean; import java.util.ArrayList; import java.util.List; public class EmployeeExample { protected String orderByClause; protected boolean distinct; protected List<Criteria> oredCriteria; public EmployeeExample() { oredCriteria = new ArrayList<Criteria>(); } public void setOrderByClause(String orderByClause) { this.orderByClause = orderByClause; } public String getOrderByClause() { return orderByClause; } public void setDistinct(boolean distinct) { this.distinct = distinct; } public boolean isDistinct() { return distinct; } public List<Criteria> getOredCriteria() { return oredCriteria; } public void or(Criteria criteria) { oredCriteria.add(criteria); } public Criteria or() { Criteria criteria = createCriteriaInternal(); oredCriteria.add(criteria); return criteria; } public Criteria createCriteria() { Criteria criteria = createCriteriaInternal(); if (oredCriteria.size() == 0) { oredCriteria.add(criteria); } return criteria; } protected Criteria createCriteriaInternal() { Criteria criteria = new Criteria(); return criteria; } public void clear() { oredCriteria.clear(); orderByClause = null; distinct = false; } protected abstract static class GeneratedCriteria { protected List<Criterion> criteria; protected GeneratedCriteria() { super(); criteria = new ArrayList<Criterion>(); } public boolean isValid() { return criteria.size() > 0; } public List<Criterion> getAllCriteria() { return criteria; } public List<Criterion> getCriteria() { return criteria; } protected void addCriterion(String condition) { if (condition == null) { throw new RuntimeException("Value for condition cannot be null"); } criteria.add(new Criterion(condition)); } protected void addCriterion(String condition, Object value, String property) { if (value == null) { throw new RuntimeException("Value for " + property + " cannot be null"); } criteria.add(new Criterion(condition, value)); } protected void addCriterion(String condition, Object value1, Object value2, String property) { if (value1 == null || value2 == null) { throw new RuntimeException("Between values for " + property + " cannot be null"); } criteria.add(new Criterion(condition, value1, value2)); } public Criteria andEmpIdIsNull() { addCriterion("emp_id is null"); return (Criteria) this; } public Criteria andEmpIdIsNotNull() { addCriterion("emp_id is not null"); return (Criteria) this; } public Criteria andEmpIdEqualTo(Integer value) { addCriterion("emp_id =", value, "empId"); return (Criteria) this; } public Criteria andEmpIdNotEqualTo(Integer value) { addCriterion("emp_id <>", value, "empId"); return (Criteria) this; } public Criteria andEmpIdGreaterThan(Integer value) { addCriterion("emp_id >", value, "empId"); return (Criteria) this; } public Criteria andEmpIdGreaterThanOrEqualTo(Integer value) { addCriterion("emp_id >=", value, "empId"); return (Criteria) this; } public Criteria andEmpIdLessThan(Integer value) { addCriterion("emp_id <", value, "empId"); return (Criteria) this; } public Criteria andEmpIdLessThanOrEqualTo(Integer value) { addCriterion("emp_id <=", value, "empId"); return (Criteria) this; } public Criteria andEmpIdIn(List<Integer> values) { addCriterion("emp_id in", values, "empId"); return (Criteria) this; } public Criteria andEmpIdNotIn(List<Integer> values) { addCriterion("emp_id not in", values, "empId"); return (Criteria) this; } public Criteria andEmpIdBetween(Integer value1, Integer value2) { addCriterion("emp_id between", value1, value2, "empId"); return (Criteria) this; } public Criteria andEmpIdNotBetween(Integer value1, Integer value2) { addCriterion("emp_id not between", value1, value2, "empId"); return (Criteria) this; } public Criteria andEmpNameIsNull() { addCriterion("emp_name is null"); return (Criteria) this; } public Criteria andEmpNameIsNotNull() { addCriterion("emp_name is not null"); return (Criteria) this; } public Criteria andEmpNameEqualTo(String value) { addCriterion("emp_name =", value, "empName"); return (Criteria) this; } public Criteria andEmpNameNotEqualTo(String value) { addCriterion("emp_name <>", value, "empName"); return (Criteria) this; } public Criteria andEmpNameGreaterThan(String value) { addCriterion("emp_name >", value, "empName"); return (Criteria) this; } public Criteria andEmpNameGreaterThanOrEqualTo(String value) { addCriterion("emp_name >=", value, "empName"); return (Criteria) this; } public Criteria andEmpNameLessThan(String value) { addCriterion("emp_name <", value, "empName"); return (Criteria) this; } public Criteria andEmpNameLessThanOrEqualTo(String value) { addCriterion("emp_name <=", value, "empName"); return (Criteria) this; } public Criteria andEmpNameLike(String value) { addCriterion("emp_name like", value, "empName"); return (Criteria) this; } public Criteria andEmpNameNotLike(String value) { addCriterion("emp_name not like", value, "empName"); return (Criteria) this; } public Criteria andEmpNameIn(List<String> values) { addCriterion("emp_name in", values, "empName"); return (Criteria) this; } public Criteria andEmpNameNotIn(List<String> values) { addCriterion("emp_name not in", values, "empName"); return (Criteria) this; } public Criteria andEmpNameBetween(String value1, String value2) { addCriterion("emp_name between", value1, value2, "empName"); return (Criteria) this; } public Criteria andEmpNameNotBetween(String value1, String value2) { addCriterion("emp_name not between", value1, value2, "empName"); return (Criteria) this; } public Criteria andGenderIsNull() { addCriterion("gender is null"); return (Criteria) this; } public Criteria andGenderIsNotNull() { addCriterion("gender is not null"); return (Criteria) this; } public Criteria andGenderEqualTo(String value) { addCriterion("gender =", value, "gender"); return (Criteria) this; } public Criteria andGenderNotEqualTo(String value) { addCriterion("gender <>", value, "gender"); return (Criteria) this; } public Criteria andGenderGreaterThan(String value) { addCriterion("gender >", value, "gender"); return (Criteria) this; } public Criteria andGenderGreaterThanOrEqualTo(String value) { addCriterion("gender >=", value, "gender"); return (Criteria) this; } public Criteria andGenderLessThan(String value) { addCriterion("gender <", value, "gender"); return (Criteria) this; } public Criteria andGenderLessThanOrEqualTo(String value) { addCriterion("gender <=", value, "gender"); return (Criteria) this; } public Criteria andGenderLike(String value) { addCriterion("gender like", value, "gender"); return (Criteria) this; } public Criteria andGenderNotLike(String value) { addCriterion("gender not like", value, "gender"); return (Criteria) this; } public Criteria andGenderIn(List<String> values) { addCriterion("gender in", values, "gender"); return (Criteria) this; } public Criteria andGenderNotIn(List<String> values) { addCriterion("gender not in", values, "gender"); return (Criteria) this; } public Criteria andGenderBetween(String value1, String value2) { addCriterion("gender between", value1, value2, "gender"); return (Criteria) this; } public Criteria andGenderNotBetween(String value1, String value2) { addCriterion("gender not between", value1, value2, "gender"); return (Criteria) this; } public Criteria andEmailIsNull() { addCriterion("email is null"); return (Criteria) this; } public Criteria andEmailIsNotNull() { addCriterion("email is not null"); return (Criteria) this; } public Criteria andEmailEqualTo(String value) { addCriterion("email =", value, "email"); return (Criteria) this; } public Criteria andEmailNotEqualTo(String value) { addCriterion("email <>", value, "email"); return (Criteria) this; } public Criteria andEmailGreaterThan(String value) { addCriterion("email >", value, "email"); return (Criteria) this; } public Criteria andEmailGreaterThanOrEqualTo(String value) { addCriterion("email >=", value, "email"); return (Criteria) this; } public Criteria andEmailLessThan(String value) { addCriterion("email <", value, "email"); return (Criteria) this; } public Criteria andEmailLessThanOrEqualTo(String value) { addCriterion("email <=", value, "email"); return (Criteria) this; } public Criteria andEmailLike(String value) { addCriterion("email like", value, "email"); return (Criteria) this; } public Criteria andEmailNotLike(String value) { addCriterion("email not like", value, "email"); return (Criteria) this; } public Criteria andEmailIn(List<String> values) { addCriterion("email in", values, "email"); return (Criteria) this; } public Criteria andEmailNotIn(List<String> values) { addCriterion("email not in", values, "email"); return (Criteria) this; } public Criteria andEmailBetween(String value1, String value2) { addCriterion("email between", value1, value2, "email"); return (Criteria) this; } public Criteria andEmailNotBetween(String value1, String value2) { addCriterion("email not between", value1, value2, "email"); return (Criteria) this; } public Criteria andDIdIsNull() { addCriterion("d_id is null"); return (Criteria) this; } public Criteria andDIdIsNotNull() { addCriterion("d_id is not null"); return (Criteria) this; } public Criteria andDIdEqualTo(Integer value) { addCriterion("d_id =", value, "dId"); return (Criteria) this; } public Criteria andDIdNotEqualTo(Integer value) { addCriterion("d_id <>", value, "dId"); return (Criteria) this; } public Criteria andDIdGreaterThan(Integer value) { addCriterion("d_id >", value, "dId"); return (Criteria) this; } public Criteria andDIdGreaterThanOrEqualTo(Integer value) { addCriterion("d_id >=", value, "dId"); return (Criteria) this; } public Criteria andDIdLessThan(Integer value) { addCriterion("d_id <", value, "dId"); return (Criteria) this; } public Criteria andDIdLessThanOrEqualTo(Integer value) { addCriterion("d_id <=", value, "dId"); return (Criteria) this; } public Criteria andDIdIn(List<Integer> values) { addCriterion("d_id in", values, "dId"); return (Criteria) this; } public Criteria andDIdNotIn(List<Integer> values) { addCriterion("d_id not in", values, "dId"); return (Criteria) this; } public Criteria andDIdBetween(Integer value1, Integer value2) { addCriterion("d_id between", value1, value2, "dId"); return (Criteria) this; } public Criteria andDIdNotBetween(Integer value1, Integer value2) { addCriterion("d_id not between", value1, value2, "dId"); return (Criteria) this; } } public static class Criteria extends GeneratedCriteria { protected Criteria() { super(); } } public static class Criterion { private String condition; private Object value; private Object secondValue; private boolean noValue; private boolean singleValue; private boolean betweenValue; private boolean listValue; private String typeHandler; public String getCondition() { return condition; } public Object getValue() { return value; } public Object getSecondValue() { return secondValue; } public boolean isNoValue() { return noValue; } public boolean isSingleValue() { return singleValue; } public boolean isBetweenValue() { return betweenValue; } public boolean isListValue() { return listValue; } public String getTypeHandler() { return typeHandler; } protected Criterion(String condition) { super(); this.condition = condition; this.typeHandler = null; this.noValue = true; } protected Criterion(String condition, Object value, String typeHandler) { super(); this.condition = condition; this.value = value; this.typeHandler = typeHandler; if (value instanceof List<?>) { this.listValue = true; } else { this.singleValue = true; } } protected Criterion(String condition, Object value) { this(condition, value, null); } protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { super(); this.condition = condition; this.value = value; this.secondValue = secondValue; this.typeHandler = typeHandler; this.betweenValue = true; } protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } } }
package com.atguigu.crud.bean; import javax.validation.constraints.Pattern; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.Length; public class Employee { private Integer empId; @Pattern(regexp="(^[a-zA-Z0-9_-]{6,16}$)|(^[\u2E80-\u9FFF]{2,5})" ,message="用户名必须是2-5位中文或者6-16位英文和数字的组合") private String empName; private String gender; //@Email @Pattern(regexp="^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$", message="邮箱格式不正确") private String email; private Integer dId; //希望查询员工的同时部门信息也是查询好的 private Department department; @Override public String toString() { return "Employee [empId=" + empId + ", empName=" + empName + ", gender=" + gender + ", email=" + email + ", dId=" + dId + "]"; } public Employee() { super(); } public Employee(Integer empId, String empName, String gender, String email, Integer dId) { super(); this.empId = empId; this.empName = empName; this.gender = gender; this.email = email; this.dId = dId; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } public Integer getEmpId() { return empId; } public void setEmpId(Integer empId) { this.empId = empId; } public String getEmpName() { return empName; } public void setEmpName(String empName) { this.empName = empName == null ? null : empName.trim(); } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender == null ? null : gender.trim(); } public String getEmail() { return email; } public void setEmail(String email) { this.email = email == null ? null : email.trim(); } public Integer getdId() { return dId; } public void setdId(Integer dId) { this.dId = dId; } }
package com.atguigu.crud.bean; import java.util.ArrayList; import java.util.List; public class DepartmentExample { protected String orderByClause; protected boolean distinct; protected List<Criteria> oredCriteria; public DepartmentExample() { oredCriteria = new ArrayList<Criteria>(); } public void setOrderByClause(String orderByClause) { this.orderByClause = orderByClause; } public String getOrderByClause() { return orderByClause; } public void setDistinct(boolean distinct) { this.distinct = distinct; } public boolean isDistinct() { return distinct; } public List<Criteria> getOredCriteria() { return oredCriteria; } public void or(Criteria criteria) { oredCriteria.add(criteria); } public Criteria or() { Criteria criteria = createCriteriaInternal(); oredCriteria.add(criteria); return criteria; } public Criteria createCriteria() { Criteria criteria = createCriteriaInternal(); if (oredCriteria.size() == 0) { oredCriteria.add(criteria); } return criteria; } protected Criteria createCriteriaInternal() { Criteria criteria = new Criteria(); return criteria; } public void clear() { oredCriteria.clear(); orderByClause = null; distinct = false; } protected abstract static class GeneratedCriteria { protected List<Criterion> criteria; protected GeneratedCriteria() { super(); criteria = new ArrayList<Criterion>(); } public boolean isValid() { return criteria.size() > 0; } public List<Criterion> getAllCriteria() { return criteria; } public List<Criterion> getCriteria() { return criteria; } protected void addCriterion(String condition) { if (condition == null) { throw new RuntimeException("Value for condition cannot be null"); } criteria.add(new Criterion(condition)); } protected void addCriterion(String condition, Object value, String property) { if (value == null) { throw new RuntimeException("Value for " + property + " cannot be null"); } criteria.add(new Criterion(condition, value)); } protected void addCriterion(String condition, Object value1, Object value2, String property) { if (value1 == null || value2 == null) { throw new RuntimeException("Between values for " + property + " cannot be null"); } criteria.add(new Criterion(condition, value1, value2)); } public Criteria andDeptIdIsNull() { addCriterion("dept_id is null"); return (Criteria) this; } public Criteria andDeptIdIsNotNull() { addCriterion("dept_id is not null"); return (Criteria) this; } public Criteria andDeptIdEqualTo(Integer value) { addCriterion("dept_id =", value, "deptId"); return (Criteria) this; } public Criteria andDeptIdNotEqualTo(Integer value) { addCriterion("dept_id <>", value, "deptId"); return (Criteria) this; } public Criteria andDeptIdGreaterThan(Integer value) { addCriterion("dept_id >", value, "deptId"); return (Criteria) this; } public Criteria andDeptIdGreaterThanOrEqualTo(Integer value) { addCriterion("dept_id >=", value, "deptId"); return (Criteria) this; } public Criteria andDeptIdLessThan(Integer value) { addCriterion("dept_id <", value, "deptId"); return (Criteria) this; } public Criteria andDeptIdLessThanOrEqualTo(Integer value) { addCriterion("dept_id <=", value, "deptId"); return (Criteria) this; } public Criteria andDeptIdIn(List<Integer> values) { addCriterion("dept_id in", values, "deptId"); return (Criteria) this; } public Criteria andDeptIdNotIn(List<Integer> values) { addCriterion("dept_id not in", values, "deptId"); return (Criteria) this; } public Criteria andDeptIdBetween(Integer value1, Integer value2) { addCriterion("dept_id between", value1, value2, "deptId"); return (Criteria) this; } public Criteria andDeptIdNotBetween(Integer value1, Integer value2) { addCriterion("dept_id not between", value1, value2, "deptId"); return (Criteria) this; } public Criteria andDeptNameIsNull() { addCriterion("dept_name is null"); return (Criteria) this; } public Criteria andDeptNameIsNotNull() { addCriterion("dept_name is not null"); return (Criteria) this; } public Criteria andDeptNameEqualTo(String value) { addCriterion("dept_name =", value, "deptName"); return (Criteria) this; } public Criteria andDeptNameNotEqualTo(String value) { addCriterion("dept_name <>", value, "deptName"); return (Criteria) this; } public Criteria andDeptNameGreaterThan(String value) { addCriterion("dept_name >", value, "deptName"); return (Criteria) this; } public Criteria andDeptNameGreaterThanOrEqualTo(String value) { addCriterion("dept_name >=", value, "deptName"); return (Criteria) this; } public Criteria andDeptNameLessThan(String value) { addCriterion("dept_name <", value, "deptName"); return (Criteria) this; } public Criteria andDeptNameLessThanOrEqualTo(String value) { addCriterion("dept_name <=", value, "deptName"); return (Criteria) this; } public Criteria andDeptNameLike(String value) { addCriterion("dept_name like", value, "deptName"); return (Criteria) this; } public Criteria andDeptNameNotLike(String value) { addCriterion("dept_name not like", value, "deptName"); return (Criteria) this; } public Criteria andDeptNameIn(List<String> values) { addCriterion("dept_name in", values, "deptName"); return (Criteria) this; } public Criteria andDeptNameNotIn(List<String> values) { addCriterion("dept_name not in", values, "deptName"); return (Criteria) this; } public Criteria andDeptNameBetween(String value1, String value2) { addCriterion("dept_name between", value1, value2, "deptName"); return (Criteria) this; } public Criteria andDeptNameNotBetween(String value1, String value2) { addCriterion("dept_name not between", value1, value2, "deptName"); return (Criteria) this; } } public static class Criteria extends GeneratedCriteria { protected Criteria() { super(); } } public static class Criterion { private String condition; private Object value; private Object secondValue; private boolean noValue; private boolean singleValue; private boolean betweenValue; private boolean listValue; private String typeHandler; public String getCondition() { return condition; } public Object getValue() { return value; } public Object getSecondValue() { return secondValue; } public boolean isNoValue() { return noValue; } public boolean isSingleValue() { return singleValue; } public boolean isBetweenValue() { return betweenValue; } public boolean isListValue() { return listValue; } public String getTypeHandler() { return typeHandler; } protected Criterion(String condition) { super(); this.condition = condition; this.typeHandler = null; this.noValue = true; } protected Criterion(String condition, Object value, String typeHandler) { super(); this.condition = condition; this.value = value; this.typeHandler = typeHandler; if (value instanceof List<?>) { this.listValue = true; } else { this.singleValue = true; } } protected Criterion(String condition, Object value) { this(condition, value, null); } protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { super(); this.condition = condition; this.value = value; this.secondValue = secondValue; this.typeHandler = typeHandler; this.betweenValue = true; } protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } } }
package com.atguigu.crud.bean; public class Department { private Integer deptId; private String deptName; public Department() { super(); // TODO Auto-generated constructor stub } public Department(Integer deptId, String deptName) { super(); this.deptId = deptId; this.deptName = deptName; } public Integer getDeptId() { return deptId; } public void setDeptId(Integer deptId) { this.deptId = deptId; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName == null ? null : deptName.trim(); } }
Service层:
package com.atguigu.crud.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.atguigu.crud.bean.Department; import com.atguigu.crud.dao.DepartmentMapper; @Service public class DepartmentService { @Autowired private DepartmentMapper departmentMapper; public List<Department> getDepts() { // TODO Auto-generated method stub List<Department> list = departmentMapper.selectByExample(null); return list; } }
package com.atguigu.crud.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.atguigu.crud.bean.Employee; import com.atguigu.crud.bean.EmployeeExample; import com.atguigu.crud.bean.EmployeeExample.Criteria; import com.atguigu.crud.dao.EmployeeMapper; @Service public class EmployeeService { @Autowired EmployeeMapper employeeMapper; /** * 查询所有员工 * @return */ public List<Employee> getAll() { // TODO Auto-generated method stub return employeeMapper.selectByExampleWithDept(null); } /** * 员工保存 * @param employee */ public void saveEmp(Employee employee) { // TODO Auto-generated method stub employeeMapper.insertSelective(employee); } /** * 检验用户名是否可用 * * @param empName * @return true:代表当前姓名可用 fasle:不可用 */ public boolean checkUser(String empName) { // TODO Auto-generated method stub EmployeeExample example = new EmployeeExample(); Criteria criteria = example.createCriteria(); criteria.andEmpNameEqualTo(empName); long count = employeeMapper.countByExample(example); return count == 0; } /** * 按照员工id查询员工 * @param id * @return */ public Employee getEmp(Integer id) { // TODO Auto-generated method stub Employee employee = employeeMapper.selectByPrimaryKey(id); return employee; } /** * 员工更新 * @param employee */ public void updateEmp(Employee employee) { // TODO Auto-generated method stub employeeMapper.updateByPrimaryKeySelective(employee); } /** * 员工删除 * @param id */ public void deleteEmp(Integer id) { // TODO Auto-generated method stub employeeMapper.deleteByPrimaryKey(id); } public void deleteBatch(List<Integer> ids) { // TODO Auto-generated method stub EmployeeExample example = new EmployeeExample(); Criteria criteria = example.createCriteria(); //delete from xxx where emp_id in(1,2,3) criteria.andEmpIdIn(ids); employeeMapper.deleteByExample(example); } }
controller层:
package com.atguigu.crud.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.atguigu.crud.bean.Department; import com.atguigu.crud.bean.Msg; import com.atguigu.crud.service.DepartmentService; /** * 处理和部门有关的请求 * @author lfy * */ @Controller public class DepartmentController { @Autowired private DepartmentService departmentService; /** * 返回所有的部门信息 */ @RequestMapping("/depts") @ResponseBody public Msg getDepts(){ //查出的所有部门信息 List<Department> list = departmentService.getDepts(); return Msg.success().add("depts", list); } }
package com.atguigu.crud.controller; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.web.bind.annotation.PathVariable; 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 com.atguigu.crud.bean.Employee; import com.atguigu.crud.bean.Msg; import com.atguigu.crud.service.EmployeeService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; /** * 处理员工CRUD请求 * * @author lfy * */ @Controller public class EmployeeController { @Autowired EmployeeService employeeService; /** * 单个批量二合一 * 批量删除:1-2-3 * 单个删除:1 * * @param id * @return */ @ResponseBody @RequestMapping(value="/emp/{ids}",method=RequestMethod.DELETE) public Msg deleteEmp(@PathVariable("ids")String ids){ //批量删除 if(ids.contains("-")){ List<Integer> del_ids = new ArrayList<>(); String[] str_ids = ids.split("-"); //组装id的集合 for (String string : str_ids) { del_ids.add(Integer.parseInt(string)); } employeeService.deleteBatch(del_ids); }else{ Integer id = Integer.parseInt(ids); employeeService.deleteEmp(id); } return Msg.success(); } /** * 如果直接发送ajax=PUT形式的请求 * 封装的数据 * Employee * [empId=1014, empName=null, gender=null, email=null, dId=null] * * 问题: * 请求体中有数据; * 但是Employee对象封装不上; * update tbl_emp where emp_id = 1014; * * 原因: * Tomcat: * 1、将请求体中的数据,封装一个map。 * 2、request.getParameter("empName")就会从这个map中取值。 * 3、SpringMVC封装POJO对象的时候。 * 会把POJO中每个属性的值,request.getParamter("email"); * AJAX发送PUT请求引发的血案: * PUT请求,请求体中的数据,request.getParameter("empName")拿不到 * Tomcat一看是PUT不会封装请求体中的数据为map,只有POST形式的请求才封装请求体为map * org.apache.catalina.connector.Request--parseParameters() (3111); * * protected String parseBodyMethods = "POST"; * if( !getConnector().isParseBodyMethod(getMethod()) ) { success = true; return; } * * * 解决方案; * 我们要能支持直接发送PUT之类的请求还要封装请求体中的数据 * 1、配置上HttpPutFormContentFilter; * 2、他的作用;将请求体中的数据解析包装成一个map。 * 3、request被重新包装,request.getParameter()被重写,就会从自己封装的map中取数据 * 员工更新方法 * @param employee * @return */ @ResponseBody @RequestMapping(value="/emp/{empId}",method=RequestMethod.PUT) public Msg saveEmp(Employee employee,HttpServletRequest request){ System.out.println("请求体中的值:"+request.getParameter("gender")); System.out.println("将要更新的员工数据:"+employee); employeeService.updateEmp(employee); return Msg.success() ; } /** * 根据id查询员工 * @param id * @return */ @RequestMapping(value="/emp/{id}",method=RequestMethod.GET) @ResponseBody public Msg getEmp(@PathVariable("id")Integer id){ Employee employee = employeeService.getEmp(id); return Msg.success().add("emp", employee); } /** * 检查用户名是否可用 * @param empName * @return */ @ResponseBody @RequestMapping("/checkuser") public Msg checkuser(@RequestParam("empName")String empName){ //先判断用户名是否是合法的表达式; String regx = "(^[a-zA-Z0-9_-]{6,16}$)|(^[\u2E80-\u9FFF]{2,5})"; if(!empName.matches(regx)){ return Msg.fail().add("va_msg", "用户名必须是6-16位数字和字母的组合或者2-5位中文"); } //数据库用户名重复校验 boolean b = employeeService.checkUser(empName); if(b){ return Msg.success(); }else{ return Msg.fail().add("va_msg", "用户名不可用"); } } /** * 员工保存 * 1、支持JSR303校验 * 2、导入Hibernate-Validator * * * @return */ @RequestMapping(value="/emp",method=RequestMethod.POST) @ResponseBody public Msg saveEmp(@Valid Employee employee,BindingResult result){ if(result.hasErrors()){ //校验失败,应该返回失败,在模态框中显示校验失败的错误信息 Map<String, Object> map = new HashMap<>(); List<FieldError> errors = result.getFieldErrors(); for (FieldError fieldError : errors) { System.out.println("错误的字段名:"+fieldError.getField()); System.out.println("错误信息:"+fieldError.getDefaultMessage()); map.put(fieldError.getField(), fieldError.getDefaultMessage()); } return Msg.fail().add("errorFields", map); }else{ employeeService.saveEmp(employee); return Msg.success(); } } /** * 导入jackson包。 * @param pn * @return */ @RequestMapping("/emps") @ResponseBody public Msg getEmpsWithJson( @RequestParam(value = "pn", defaultValue = "1") Integer pn) { // 这不是一个分页查询 // 引入PageHelper分页插件 // 在查询之前只需要调用,传入页码,以及每页的大小 PageHelper.startPage(pn, 5); // startPage后面紧跟的这个查询就是一个分页查询 List<Employee> emps = employeeService.getAll(); // 使用pageInfo包装查询后的结果,只需要将pageInfo交给页面就行了。 // 封装了详细的分页信息,包括有我们查询出来的数据,传入连续显示的页数 PageInfo page = new PageInfo(emps, 5); return Msg.success().add("pageInfo", page); } /** * 查询员工数据(分页查询) * * @return */ // @RequestMapping("/emps") public String getEmps( @RequestParam(value = "pn", defaultValue = "1") Integer pn, Model model) { // 这不是一个分页查询; // 引入PageHelper分页插件 // 在查询之前只需要调用,传入页码,以及每页的大小 PageHelper.startPage(pn, 5); // startPage后面紧跟的这个查询就是一个分页查询 List<Employee> emps = employeeService.getAll(); // 使用pageInfo包装查询后的结果,只需要将pageInfo交给页面就行了。 // 封装了详细的分页信息,包括有我们查询出来的数据,传入连续显示的页数 PageInfo page = new PageInfo(emps, 5); model.addAttribute("pageInfo", page); return "list"; } }
测试类:
package com.atguigu.crud.test; import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import com.atguigu.crud.bean.Employee; import com.github.pagehelper.PageInfo; /** * 使用Spring测试模块提供的测试请求功能,测试curd请求的正确性 * Spring4测试的时候,需要servlet3.0的支持 * @author lfy * */ @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(locations = { "classpath:applicationContext.xml", "file:src/main/webapp/WEB-INF/dispatcherServlet-servlet.xml" }) public class MvcTest { // 传入Springmvc的ioc @Autowired WebApplicationContext context; // 虚拟mvc请求,获取到处理结果。 MockMvc mockMvc; @Before public void initMokcMvc() { mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); } @Test public void testPage() throws Exception { //模拟请求拿到返回值 MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/emps").param("pn", "5")) .andReturn(); //请求成功以后,请求域中会有pageInfo;我们可以取出pageInfo进行验证 MockHttpServletRequest request = result.getRequest(); PageInfo pi = (PageInfo) request.getAttribute("pageInfo"); System.out.println("当前页码:"+pi.getPageNum()); System.out.println("总页码:"+pi.getPages()); System.out.println("总记录数:"+pi.getTotal()); System.out.println("在页面需要连续显示的页码"); int[] nums = pi.getNavigatepageNums(); for (int i : nums) { System.out.print(" "+i); } //获取员工数据 List<Employee> list = pi.getList(); for (Employee employee : list) { System.out.println("ID:"+employee.getEmpId()+"==>Name:"+employee.getEmpName()); } } }
视图层:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!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>员工列表</title> <% pageContext.setAttribute("APP_PATH", request.getContextPath()); %> <!-- web路径: 不以/开始的相对路径,找资源,以当前资源的路径为基准,经常容易出问题。 以/开始的相对路径,找资源,以服务器的路径为标准(http://localhost:3306);需要加上项目名 http://localhost:3306/crud --> <script type="text/javascript" src="${APP_PATH }/static/js/jquery-1.12.4.min.js"></script> <link href="${APP_PATH }/static/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet"> <script src="${APP_PATH }/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script> </head> <body> <!-- 员工修改的模态框 --> <div class="modal fade" id="empUpdateModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> <h4 class="modal-title">员工修改</h4> </div> <div class="modal-body"> <form class="form-horizontal"> <div class="form-group"> <label class="col-sm-2 control-label">empName</label> <div class="col-sm-10"> <p class="form-control-static" id="empName_update_static"></p> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">email</label> <div class="col-sm-10"> <input type="text" name="email" class="form-control" id="email_update_input" placeholder="email@atguigu.com"> <span class="help-block"></span> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">gender</label> <div class="col-sm-10"> <label class="radio-inline"> <input type="radio" name="gender" id="gender1_update_input" value="M" checked="checked"> 男 </label> <label class="radio-inline"> <input type="radio" name="gender" id="gender2_update_input" value="F"> 女 </label> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">deptName</label> <div class="col-sm-4"> <!-- 部门提交部门id即可 --> <select class="form-control" name="dId"> </select> </div> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button> <button type="button" class="btn btn-primary" id="emp_update_btn">更新</button> </div> </div> </div> </div> <!-- 员工添加的模态框 --> <div class="modal fade" id="empAddModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> <h4 class="modal-title" id="myModalLabel">员工添加</h4> </div> <div class="modal-body"> <form class="form-horizontal"> <div class="form-group"> <label class="col-sm-2 control-label">empName</label> <div class="col-sm-10"> <input type="text" name="empName" class="form-control" id="empName_add_input" placeholder="empName"> <span class="help-block"></span> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">email</label> <div class="col-sm-10"> <input type="text" name="email" class="form-control" id="email_add_input" placeholder="email@atguigu.com"> <span class="help-block"></span> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">gender</label> <div class="col-sm-10"> <label class="radio-inline"> <input type="radio" name="gender" id="gender1_add_input" value="M" checked="checked"> 男 </label> <label class="radio-inline"> <input type="radio" name="gender" id="gender2_add_input" value="F"> 女 </label> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">deptName</label> <div class="col-sm-4"> <!-- 部门提交部门id即可 --> <select class="form-control" name="dId"> </select> </div> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button> <button type="button" class="btn btn-primary" id="emp_save_btn">保存</button> </div> </div> </div> </div> <!-- 搭建显示页面 --> <div class="container"> <!-- 标题 --> <div class="row"> <div class="col-md-12"> <h1>SSM-CRUD</h1> </div> </div> <!-- 按钮 --> <div class="row"> <div class="col-md-4 col-md-offset-8"> <button class="btn btn-primary" id="emp_add_modal_btn">新增</button> <button class="btn btn-danger" id="emp_delete_all_btn">删除</button> </div> </div> <!-- 显示表格数据 --> <div class="row"> <div class="col-md-12"> <table class="table table-hover" id="emps_table"> <thead> <tr> <th> <input type="checkbox" id="check_all"/> </th> <th>#</th> <th>empName</th> <th>gender</th> <th>email</th> <th>deptName</th> <th>操作</th> </tr> </thead> <tbody> </tbody> </table> </div> </div> <!-- 显示分页信息 --> <div class="row"> <!--分页文字信息 --> <div class="col-md-6" id="page_info_area"></div> <!-- 分页条信息 --> <div class="col-md-6" id="page_nav_area"> </div> </div> </div> <script type="text/javascript"> var totalRecord,currentPage; //1、页面加载完成以后,直接去发送ajax请求,要到分页数据 $(function(){ //去首页 to_page(1); }); function to_page(pn){ $.ajax({ url:"${APP_PATH}/emps", data:"pn="+pn, type:"GET", success:function(result){ //console.log(result); //1、解析并显示员工数据 build_emps_table(result); //2、解析并显示分页信息 build_page_info(result); //3、解析显示分页条数据 build_page_nav(result); } }); } function build_emps_table(result){ //清空table表格 $("#emps_table tbody").empty(); var emps = result.extend.pageInfo.list; $.each(emps,function(index,item){ var checkBoxTd = $("<td><input type='checkbox' class='check_item'/></td>"); var empIdTd = $("<td></td>").append(item.empId); var empNameTd = $("<td></td>").append(item.empName); var genderTd = $("<td></td>").append(item.gender=='M'?"男":"女"); var emailTd = $("<td></td>").append(item.email); var deptNameTd = $("<td></td>").append(item.department.deptName); /** <button class=""> <span class="" aria-hidden="true"></span> 编辑 </button> */ var editBtn = $("<button></button>").addClass("btn btn-primary btn-sm edit_btn") .append($("<span></span>").addClass("glyphicon glyphicon-pencil")).append("编辑"); //为编辑按钮添加一个自定义的属性,来表示当前员工id editBtn.attr("edit-id",item.empId); var delBtn = $("<button></button>").addClass("btn btn-danger btn-sm delete_btn") .append($("<span></span>").addClass("glyphicon glyphicon-trash")).append("删除"); //为删除按钮添加一个自定义的属性来表示当前删除的员工id delBtn.attr("del-id",item.empId); var btnTd = $("<td></td>").append(editBtn).append(" ").append(delBtn); //var delBtn = //append方法执行完成以后还是返回原来的元素 $("<tr></tr>").append(checkBoxTd) .append(empIdTd) .append(empNameTd) .append(genderTd) .append(emailTd) .append(deptNameTd) .append(btnTd) .appendTo("#emps_table tbody"); }); } //解析显示分页信息 function build_page_info(result){ $("#page_info_area").empty(); $("#page_info_area").append("当前"+result.extend.pageInfo.pageNum+"页,总"+ result.extend.pageInfo.pages+"页,总"+ result.extend.pageInfo.total+"条记录"); totalRecord = result.extend.pageInfo.total; currentPage = result.extend.pageInfo.pageNum; } //解析显示分页条,点击分页要能去下一页.... function build_page_nav(result){ //page_nav_area $("#page_nav_area").empty(); var ul = $("<ul></ul>").addClass("pagination"); //构建元素 var firstPageLi = $("<li></li>").append($("<a></a>").append("首页").attr("href","#")); var prePageLi = $("<li></li>").append($("<a></a>").append("«")); if(result.extend.pageInfo.hasPreviousPage == false){ firstPageLi.addClass("disabled"); prePageLi.addClass("disabled"); }else{ //为元素添加点击翻页的事件 firstPageLi.click(function(){ to_page(1); }); prePageLi.click(function(){ to_page(result.extend.pageInfo.pageNum -1); }); } var nextPageLi = $("<li></li>").append($("<a></a>").append("»")); var lastPageLi = $("<li></li>").append($("<a></a>").append("末页").attr("href","#")); if(result.extend.pageInfo.hasNextPage == false){ nextPageLi.addClass("disabled"); lastPageLi.addClass("disabled"); }else{ nextPageLi.click(function(){ to_page(result.extend.pageInfo.pageNum +1); }); lastPageLi.click(function(){ to_page(result.extend.pageInfo.pages); }); } //添加首页和前一页 的提示 ul.append(firstPageLi).append(prePageLi); //1,2,3遍历给ul中添加页码提示 $.each(result.extend.pageInfo.navigatepageNums,function(index,item){ var numLi = $("<li></li>").append($("<a></a>").append(item)); if(result.extend.pageInfo.pageNum == item){ numLi.addClass("active"); } numLi.click(function(){ to_page(item); }); ul.append(numLi); }); //添加下一页和末页 的提示 ul.append(nextPageLi).append(lastPageLi); //把ul加入到nav var navEle = $("<nav></nav>").append(ul); navEle.appendTo("#page_nav_area"); } //清空表单样式及内容 function reset_form(ele){ $(ele)[0].reset(); //清空表单样式 $(ele).find("*").removeClass("has-error has-success"); $(ele).find(".help-block").text(""); } //点击新增按钮弹出模态框。 $("#emp_add_modal_btn").click(function(){ //清除表单数据(表单完整重置(表单的数据,表单的样式)) reset_form("#empAddModal form"); //s$("")[0].reset(); //发送ajax请求,查出部门信息,显示在下拉列表中 getDepts("#empAddModal select"); //弹出模态框 $("#empAddModal").modal({ backdrop:"static" }); }); //查出所有的部门信息并显示在下拉列表中 function getDepts(ele){ //清空之前下拉列表的值 $(ele).empty(); $.ajax({ url:"${APP_PATH}/depts", type:"GET", success:function(result){ //{"code":100,"msg":"处理成功!", //"extend":{"depts":[{"deptId":1,"deptName":"开发部"},{"deptId":2,"deptName":"测试部"}]}} //console.log(result); //显示部门信息在下拉列表中 //$("#empAddModal select").append("") $.each(result.extend.depts,function(){ var optionEle = $("<option></option>").append(this.deptName).attr("value",this.deptId); optionEle.appendTo(ele); }); } }); } //校验表单数据 function validate_add_form(){ //1、拿到要校验的数据,使用正则表达式 var empName = $("#empName_add_input").val(); var regName = /(^[a-zA-Z0-9_-]{6,16}$)|(^[\u2E80-\u9FFF]{2,5})/; if(!regName.test(empName)){ //alert("用户名可以是2-5位中文或者6-16位英文和数字的组合"); show_validate_msg("#empName_add_input", "error", "用户名可以是2-5位中文或者6-16位英文和数字的组合"); return false; }else{ show_validate_msg("#empName_add_input", "success", ""); }; //2、校验邮箱信息 var email = $("#email_add_input").val(); var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/; if(!regEmail.test(email)){ //alert("邮箱格式不正确"); //应该清空这个元素之前的样式 show_validate_msg("#email_add_input", "error", "邮箱格式不正确"); /* $("#email_add_input").parent().addClass("has-error"); $("#email_add_input").next("span").text("邮箱格式不正确"); */ return false; }else{ show_validate_msg("#email_add_input", "success", ""); } return true; } //显示校验结果的提示信息 function show_validate_msg(ele,status,msg){ //清除当前元素的校验状态 $(ele).parent().removeClass("has-success has-error"); $(ele).next("span").text(""); if("success"==status){ $(ele).parent().addClass("has-success"); $(ele).next("span").text(msg); }else if("error" == status){ $(ele).parent().addClass("has-error"); $(ele).next("span").text(msg); } } //校验用户名是否可用 $("#empName_add_input").change(function(){ //发送ajax请求校验用户名是否可用 var empName = this.value; $.ajax({ url:"${APP_PATH}/checkuser", data:"empName="+empName, type:"POST", success:function(result){ if(result.code==100){ show_validate_msg("#empName_add_input","success","用户名可用"); $("#emp_save_btn").attr("ajax-va","success"); }else{ show_validate_msg("#empName_add_input","error",result.extend.va_msg); $("#emp_save_btn").attr("ajax-va","error"); } } }); }); //点击保存,保存员工。 $("#emp_save_btn").click(function(){ //1、模态框中填写的表单数据提交给服务器进行保存 //1、先对要提交给服务器的数据进行校验 if(!validate_add_form()){ return false; }; //1、判断之前的ajax用户名校验是否成功。如果成功。 if($(this).attr("ajax-va")=="error"){ return false; } //2、发送ajax请求保存员工 $.ajax({ url:"${APP_PATH}/emp", type:"POST", data:$("#empAddModal form").serialize(), success:function(result){ //alert(result.msg); if(result.code == 100){ //员工保存成功; //1、关闭模态框 $("#empAddModal").modal('hide'); //2、来到最后一页,显示刚才保存的数据 //发送ajax请求显示最后一页数据即可 to_page(totalRecord); }else{ //显示失败信息 //console.log(result); //有哪个字段的错误信息就显示哪个字段的; if(undefined != result.extend.errorFields.email){ //显示邮箱错误信息 show_validate_msg("#email_add_input", "error", result.extend.errorFields.email); } if(undefined != result.extend.errorFields.empName){ //显示员工名字的错误信息 show_validate_msg("#empName_add_input", "error", result.extend.errorFields.empName); } } } }); }); //1、我们是按钮创建之前就绑定了click,所以绑定不上。 //1)、可以在创建按钮的时候绑定。 2)、绑定点击.live() //jquery新版没有live,使用on进行替代 $(document).on("click",".edit_btn",function(){ //alert("edit"); //1、查出部门信息,并显示部门列表 getDepts("#empUpdateModal select"); //2、查出员工信息,显示员工信息 getEmp($(this).attr("edit-id")); //3、把员工的id传递给模态框的更新按钮 $("#emp_update_btn").attr("edit-id",$(this).attr("edit-id")); $("#empUpdateModal").modal({ backdrop:"static" }); }); function getEmp(id){ $.ajax({ url:"${APP_PATH}/emp/"+id, type:"GET", success:function(result){ //console.log(result); var empData = result.extend.emp; $("#empName_update_static").text(empData.empName); $("#email_update_input").val(empData.email); $("#empUpdateModal input[name=gender]").val([empData.gender]); $("#empUpdateModal select").val([empData.dId]); } }); } //点击更新,更新员工信息 $("#emp_update_btn").click(function(){ //验证邮箱是否合法 //1、校验邮箱信息 var email = $("#email_update_input").val(); var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/; if(!regEmail.test(email)){ show_validate_msg("#email_update_input", "error", "邮箱格式不正确"); return false; }else{ show_validate_msg("#email_update_input", "success", ""); } //2、发送ajax请求保存更新的员工数据 $.ajax({ url:"${APP_PATH}/emp/"+$(this).attr("edit-id"), type:"PUT", data:$("#empUpdateModal form").serialize(), success:function(result){ //alert(result.msg); //1、关闭对话框 $("#empUpdateModal").modal("hide"); //2、回到本页面 to_page(currentPage); } }); }); //单个删除 $(document).on("click",".delete_btn",function(){ //1、弹出是否确认删除对话框 var empName = $(this).parents("tr").find("td:eq(2)").text(); var empId = $(this).attr("del-id"); //alert($(this).parents("tr").find("td:eq(1)").text()); if(confirm("确认删除【"+empName+"】吗?")){ //确认,发送ajax请求删除即可 $.ajax({ url:"${APP_PATH}/emp/"+empId, type:"DELETE", success:function(result){ alert(result.msg); //回到本页 to_page(currentPage); } }); } }); //完成全选/全不选功能 $("#check_all").click(function(){ //attr获取checked是undefined; //我们这些dom原生的属性;attr获取自定义属性的值; //prop修改和读取dom原生属性的值 $(".check_item").prop("checked",$(this).prop("checked")); }); //check_item $(document).on("click",".check_item",function(){ //判断当前选择中的元素是否5个 var flag = $(".check_item:checked").length==$(".check_item").length; $("#check_all").prop("checked",flag); }); //点击全部删除,就批量删除 $("#emp_delete_all_btn").click(function(){ // var empNames = ""; var del_idstr = ""; $.each($(".check_item:checked"),function(){ //this empNames += $(this).parents("tr").find("td:eq(2)").text()+","; //组装员工id字符串 del_idstr += $(this).parents("tr").find("td:eq(1)").text()+"-"; }); //去除empNames多余的, empNames = empNames.substring(0, empNames.length-1); //去除删除的id多余的- del_idstr = del_idstr.substring(0, del_idstr.length-1); if(confirm("确认删除【"+empNames+"】吗?")){ //发送ajax请求删除 $.ajax({ url:"${APP_PATH}/emp/"+del_idstr, type:"DELETE", success:function(result){ alert(result.msg); //回到当前页面 to_page(currentPage); } }); } }); </script> </body> </html>
日常报错:
1.java.lang.NoClassDefFoundError: javax/el/ELManager:
报错原因:原jdk和Tomcat的el-api架包没有ElManage
解决方法:下载el-api3.0放到Tomcat的lib目录下或者jdk目录下(别放在jdk下,跑springboot会出问题)
2.ajax发送PUT请求封装数据不成功:
失败原因:Tomcat只是封装Post请求的参数
解决方法:在web,xml文件中添加过滤器
总结:
合群是堕落的开始 优秀的开始是孤行