springMVC-Mybatis-memcached整合流程
- 格式:pdf
- 大小:570.13 KB
- 文档页数:13
Spring+SpringMVC+Mybatis整合redis SSM整合redisredis是⼀种⾮关系型数据库,与mongoDB不同的是redis是内存数据库,所以访问速度很快。
常⽤作缓存和发布-订阅式的消息队列。
这⾥⽤的是ssm框架+maven构建的项⽬。
开发⼯具是idea⾸先是需要引⼊的pom.xml⽂件:<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><piler.source>1.7</piler.source><piler.target>1.7</piler.target><!-- mybatis版本号 --><mybatis.version>3.2.4</mybatis.version><!-- log4j⽇志⽂件管理包版本 --><slf4j.version>1.6.6</slf4j.version><log4j.version>1.2.12</log4j.version><spring.version>4.2.5.RELEASE</spring.version></properties><dependencies><!-- 引⼊redis --><!-- redis cache related.....start --><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.6.0.RELEASE</version></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.4.2</version></dependency><!-- spring核⼼包 --><!-- springframe start --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-oxm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><!-- springframe end --><!-- mybatis核⼼包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><!-- mybatis/spring包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.2</version></dependency><!-- commons --><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.4</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-pool</groupId><artifactId>commons-pool</artifactId><version>1.5.6</version></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId> <version>1.8.3</version></dependency><dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId> <version>3.1</version></dependency><dependency><groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.1</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.9</version></dependency><dependency><groupId>javax.annotation</groupId><artifactId>jsr250-api</artifactId><version>1.0</version></dependency><dependency><groupId>net.sf.ezmorph</groupId><artifactId>ezmorph</artifactId><version>1.0.6</version></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency><!-- ⽇志⽂件管理包 --><!-- log start --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-1.2-api</artifactId><version>2.8.2</version></dependency><!-- log end --><!--log4j --><!--mysql数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> <version>5.1.21</version></dependency><!-- jstl --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2.1-b03</version><scope>provided</scope></dependency><!-- servlet --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><!-- junit测试包 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!--jackJson--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.1.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.1.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.1.0</version></dependency><dependency><groupId>org.apache.geronimo.bundles</groupId><artifactId>aspectjweaver</artifactId><version>1.6.8_2</version></dependency><dependency><groupId>aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.5.4</version></dependency></dependencies><build><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources></build>我的项⽬结构如下:然后引⼊各个配置⽂件:1,数据库:2.redis.properties# Redis settingsredis.host=127.0.0.1redis.port=6379#redis.pass=passwordredis.dbIndex=0redis.expiration=3000redis.maxIdle=300redis.maxActive=600redis.maxWait=1000redis.testOnBorrow=true3,spring的配置⽂件appcalitionContext.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:mvc="/schema/mvc"xmlns:context="/schema/context"xmlns:cache="/schema/cache"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/mvc/schema/mvc/spring-mvc.xsd/schema/context/schema/context/spring-context.xsd/schema/cache/schema/cache/spring-cache.xsd"><mvc:annotation-driven/><context:component-scan base-package="com.springredis"/><bean id="dataSource" class="mons.dbcp.BasicDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/user?useSSL=true"/><property name="username" value="root"/><property name="password" value="1234"/></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 数据源 --><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:sqlmap/*Mapper.xml"/><property name="typeAliasesPackage" value="com.springredis.entity"/></bean><!-- 在spring容器中配置mapper的扫描器产⽣的动态代理对象在spring的容器中⾃动注册,bean的id就是mapper类名(⾸字母⼩写)--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 指定扫描包的路径,就是mapper接⼝的路径,多个包中间以半⾓逗号隔开 --><property name="basePackage" value="com.springredis.dao"/><!-- 配置sqlSessionFactoryBeanName --><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/></bean><bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/><property name="prefix" value="/WEb-INF/"/><property name="suffix" value=".jsp"/></bean></beans>4,编写spring-redis.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:cache="/schema/cache"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/cache/schema/cache/spring-cache.xsd"><bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:properties/redis.properties</value></list></property></bean><!--配置redis的参数--><bean class="redis.clients.jedis.JedisPoolConfig" id="poolConfig"><property name="maxIdle" value="${redis.maxIdle}"/><property name="maxTotal" value="${redis.maxActive}"/><property name="maxWaitMillis" value="${redis.maxWait}"/><property name="testOnBorrow" value="${redis.testOnBorrow}"/></bean><!--配置redis的连接参数如需要密码,请配置,database是redis的指定哪个库--><bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${redis.host}"/><property name="port" value="${redis.port}"/><!--<property name="password" value="${redis.password}"/>--><property name="database" value="${redis.dbIndex}"/><property name="poolConfig" ref="poolConfig"/></bean><!--redis操作模版,使⽤该对象可以操作redis --><bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"><property name="connectionFactory" ref="jedisConnectionFactory"/><property name="keySerializer"><bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/></property><property name="valueSerializer"><bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/></property><!--开启事务--><property name="enableTransactionSupport" value="true"/></bean><!-- 配置redis缓存管理器 --><bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"><constructor-arg name="redisOperations" ref="redisTemplate"/><property name="defaultExpiration" value="${redis.expiration}"/></bean><!-- 配置RedisCacheConfig --><bean id="redisCacheConfig" class="com.springredis.config.redis.RedisCacheConfig"><constructor-arg ref="jedisConnectionFactory"/><constructor-arg ref="redisTemplate"/><constructor-arg ref="redisCacheManager"/></bean><bean id="keyGenerator" class="com.springredis.config.redis.KeyGenerator"/><cache:annotation-driven cache-manager="redisCacheManager" key-generator="keyGenerator"/></beans>5,在config的redis⽂件下新建RedisCacheConfig类package com.springredis.config.redis;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.context.annotation.Bean;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import ng.reflect.Method;/*** ⽂件描述:* 创建⽤户:emotion* 创建时间:2018/6/22*/public class RedisCacheConfig extends CachingConfigurerSupport {private volatile JedisConnectionFactory jedisConnectionFactory;private volatile RedisTemplate<String, String> redisTemplate;private volatile RedisCacheManager redisCacheManager;public RedisCacheConfig() {super();}/*** 带参数的构造⽅法初始化所有的成员变量** @param jedisConnectionFactory* @param redisTemplate* @param redisCacheManager*/public RedisCacheConfig(JedisConnectionFactory jedisConnectionFactory, RedisTemplate<String, String> redisTemplate, RedisCacheManager redisCacheManager) {this.jedisConnectionFactory = jedisConnectionFactory;this.redisTemplate = redisTemplate;this.redisCacheManager = redisCacheManager;}public JedisConnectionFactory getJedisConnecionFactory() {return jedisConnectionFactory;}public RedisTemplate<String, String> getRedisTemplate() {return redisTemplate;}public RedisCacheManager getRedisCacheManager() {return redisCacheManager;}}6,在redis下新建KeyGenerator类package com.springredis.config.redis;import ng.reflect.Method;/*** ⽂件描述:* 创建⽤户:emotion* 创建时间:2018/6/22*/public class KeyGenerator implements org.springframework.cache.interceptor.KeyGenerator {@Overridepublic Object generate(Object o, Method method, Object... params) {//规定本类名+⽅法名+参数名为keyStringBuilder sb = new StringBuilder();sb.append(o.getClass().getName());sb.append("-");sb.append(method.getName());sb.append("-");for (Object param : params) {sb.append(param.toString());}return sb.toString();}}7,在spring的applicationContext.xml中引⼊spring-redis.xml<import resource="spring-redis.xml"/>8,编写web.xml<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="/xml/ns/javaee" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_3_0 <display-name>Archetype Created Web Application</display-name><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/applicationContext.xml</param-value></context-param><!-- 配置编码⽅式--><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 配置springmvc的前端控制器指向spring-mvc.xml 程序在启动的时候就加载springmvc 可以接受所有请求 load-on-startup:表⽰启动容器时初始化该Servlet; --><servlet><servlet-name>springServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 可以⾃定义servlet.xml配置⽂件的位置和名称,默认为WEB-INF⽬录下,名称为[<servlet-name>]-servlet.xml,如spring-servlet.xml --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/applicationContext.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><!-- 将前端URL请求和后台处理⽅法controller建⽴对应关系--><servlet-mapping><servlet-name>springServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--<!– Spring配置 –>--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><welcome-file-list><welcome-file>/index.jsp</welcome-file></welcome-file-list></web-app>9,编写对应的实体类,mapper接⼝,controller控制器,service业务9.1,User实体类import com.fasterxml.jackson.core.SerializableString;import java.io.Serializable;public class User implements Serializable {//如果不实现Serializable接⼝会报错private Integer id;private String name;private String sex;private Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}9.2,编写mapper接⼝package com.springredis.dao;import er;import java.util.List;public interface UserDao {List<User> getLists();Integer add(User user);}9.4,在Sqlmap下编写UserMapper.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd" > <mapper namespace="erDao"><select id="getLists" resultType="er">SELECT * FROM users</select><insert id="add" parameterType="er">INSERT INTO users (name,sex,age)VALUES (#{name},#{sex},#{age})</insert></mapper>9.5,编写service业务层9.5.1:编写service接⼝package com.springredis.service;import er;import java.util.List;public interface IUserService {List<User> getLists();Integer add(User user);}9.5.2编写service实现类package com.springredis.service;import er;import erDao;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;import java.util.List;/*** ⽂件描述:* 创建⽤户:emotion* 创建时间:2018/6/22*/@Servicepublic class UserServiceImpl implements IUserService {@Autowiredprivate UserDao userDao;@Cacheable(value="user")@Overridepublic List<User> getLists() {System.out.println("打印语句则没有⾛缓存");return userDao.getLists();}@CacheEvict(value= "user",allEntries=true)//清空缓存,@Overridepublic Integer add(User user) {return userDao.add(user);}}缓存机制说明:所有的查询结果都放进了缓存,也就是把MySQL查询的结果放到了redis中去,然后第⼆次发起该条查询时就可以从redis中去读取查询的结果,从⽽不与MySQL交互,从⽽达到优化的效果,redis的查询速度之于MySQL的查询速度相当于内存读写速度 /硬盘读写速度@Cacheable("users")注解的意义就是把该⽅法的查询结果放到redis中去,下⼀次再发起查询就去redis中去取,存在redis中的数据的key就是users;要是写增加⼀个⽤户则需要把原来的key(users)清除掉@CacheEvict(value={"users","users1"},allEntries=true) 的意思就是执⾏该⽅法后要清除redis中key名称为a,b的数据;9.6,编写Controller控制器package com.springredis.controller;import er;import com.springredis.service.IUserService;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 org.springframework.web.bind.annotation.RestController;import java.util.List;@Controllerpublic class UserController {@Autowiredprivate IUserService userService;@RequestMapping("/list")@ResponseBodypublic List<User> getLists(){return userService.getLists();}@RequestMapping("/add")@ResponseBodypublic boolean add(User user){return userService.add(user)>0;}}此⽂章制作案例,不做具体的详解,下⼀篇⽂章做具体讲解,,。
Spring整合MyBatis的三种⽅式1、整合之前的环境准备导⼊相关的jar包Junit测试<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>MyBatis<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version></dependency>MySQL数据库<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency>Spring相关<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.3</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.3</version></dependency>aspectJ AOP 织⼊器<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></dependency>mybatis-spring整合包【重点】<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.5</version></dependency>配置Maven静态资源过滤问题!<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource></resources></build>2、回忆MyBatis编写⼀个实体类Userpublic class User {private Integer id;private String name;private String pwd;// getter and setter// 有参和⽆参// toString}编写MyBatis核⼼配置⽂件jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=falseername=rootjdbc.password=123456<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-////DTD Config 3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><properties resource="jdbc.properties"/><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${ername}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments></configuration>编写UserMapper接⼝public interface UserMapper {List<User> userList();}编写接⼝对应的Mapper.xml⽂件<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="erMapper"><select id="userList" resultType="er">select * from er</select></mapper>注册Mapper.xml⽂件<mappers><mapper resource="com/jh/mapper/UserMapper.xml"/></mappers>编写测试类@Testpublic void userList() throws IOException {String resource = "mybatis-config.xml";InputStream stream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);SqlSession sqlSession = sqlSessionFactory.openSession(true);UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> userList = erList();userList.forEach(System.out::println);sqlSession.close();}输出结果User{id=1, name='⼩王', pwd='123456'}User{id=2, name='张三', pwd='123456'}User{id=3, name='李四', pwd='123456'}3、MyBatis-Spring学习引⼊Spring之前需要了解mybatis-spring包中的⼀些重要类;什么是 MyBatis-Spring?MyBatis-Spring 会帮助你将 MyBatis 代码⽆缝地整合到 Spring 中。
SpringBoot+MySQL+MyBatis整合Redis实现缓存操作本地安装 Redis项⽬结构:SpringBootRedis ⼯程项⽬结构如下: controller - Controller 层 dao - 数据操作层 model - 实体层 service - 业务逻辑层 Application - 启动类 resources 资源⽂件夹 application.properties - 应⽤配置⽂件,应⽤启动会⾃动读取配置 generatorConfig.xml - mybatis 逆向⽣成配置(这⾥不是本⽂只要重点,所以不进⾏介绍) mapper ⽂件夹 StudentMapper.xml - mybatis 关系映射 xml ⽂件项⽬⼯程代码详情pom.xml 配置<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.7.RELEASE</version><relativePath/><!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><!-- web 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- tomcat插件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency><!-- Test 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- mysql 依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version></dependency><!-- redis 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.1.6.RELEASE</version></dependency><!-- mybatis 依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version></dependency><!-- Gson json 格式化 --><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.5</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!-- mybatis.generator 插件 --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.7</version><configuration><configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile><overwrite>true</overwrite></configuration><!-- 数据库依赖 --><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.15</version></dependency></dependencies></plugin></plugins></build></project>application.properties 配置spring:datasource:url: jdbc:mysql://localhost:3306/mydb?useSSL=trueusername: oukelepassword: oukeledriver-class-name: com.mysql.jdbc.Driver# 配置 redisredis:# redis 数据库索引(默认为0)database: 0# redis 服务地址host: 127.0.0.1# redis 连接端⼝port: 6379# redis 服务器链接密码(默认为空)password:# 连接超时时间(毫秒)timeout: 5000# 配置 redis 连接池jedis:pool:# 连接池最⼤连接数 (使⽤负值表⽰没有限制)max-active: 8# 连接池最⼤阻塞等待时间(使⽤负值表⽰没有限制)max-wait: -1# 连接池的最⼤空闲连接max-idle: 8# 连接池中最⼩空闲连接min-idle: 0# 配置 mybatismybatis:# 设置实体类所在的包名typeAliasesPackage: com.example.demo.model# mybatis xml 映射关系mapper-locations: classpath:mapper/*.xml项⽬结构图model 层 Student.javapackage com.example.demo.model;public class Student {private Integer id;private String numbercode;private String stuname;private String stusex;private Integer stuage;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getNumbercode() {return numbercode;}public void setNumbercode(String numbercode) {this.numbercode = numbercode == null ? null : numbercode.trim(); }public String getStuname() {return stuname;}public void setStuname(String stuname) {this.stuname = stuname == null ? null : stuname.trim();}public String getStusex() {return stusex;}public void setStusex(String stusex) {this.stusex = stusex == null ? null : stusex.trim();}public Integer getStuage() {return stuage;}public void setStuage(Integer stuage) {this.stuage = stuage;}@Overridepublic String toString() {return "Student{" +"id=" + id +", numbercode='" + numbercode + '\'' +", stuname='" + stuname + '\'' +", stusex='" + stusex + '\'' +", stuage=" + stuage +'}';}}View Codedao 层 StudentMapper.java (使⽤了注解 + xml 形式 )package com.example.demo.dao;import com.example.demo.model.Student;import org.apache.ibatis.annotations.Delete;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Select;import org.springframework.stereotype.Repository;import java.util.List;@Repositorypublic interface StudentMapper {@Select("select * from student")List<Student> selectAll();@Select("select * from student where numbercode = #{numberCode}") Student getStudent(@Param("numberCode") String numberCode);@Delete("delete from student where numbercode = #{numberCode}") int delete(@Param("numberCode") String numberCode);int update(Student student);int insert(Student student);}View Codeservice 层 StudentService.javapackage com.example.demo.service;import com.example.demo.model.Student;import java.util.List;public interface StudentService {List<Student> selectAll();Student getStudent(String numberCode);int delete(String numberCode);int update(Student student);int insert(Student student);}View Codeservice imple (业务实现)层 StudentServiceImpl.javapackage com.example.demo.service.impl;import com.example.demo.dao.StudentMapper;import com.example.demo.model.Student;import com.example.demo.service.StudentService;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.ValueOperations;import org.springframework.stereotype.Service;import ng.reflect.Type;import java.util.List;import java.util.concurrent.TimeUnit;@Servicepublic class StudentServiceImpl implements StudentService {@Autowiredprivate StudentMapper studentMapper;@Autowiredprivate RedisTemplate redisTemplate;@Overridepublic List<Student> selectAll() {String key = "student_list";Boolean hasKey = redisTemplate.hasKey(key);ValueOperations operations = redisTemplate.opsForValue();if (hasKey) {String redisList = (String) operations.get(key);Type type = new TypeToken<List<Student>>() {}.getType();List<Student> list = new Gson().fromJson(redisList,type);System.out.println("StudentServiceImpl.selectAll() : 从缓存取得数据,条数:" + list.size());return list;}List<Student> list = studentMapper.selectAll();String toJson = new Gson().toJson(list);// 存在到缓存中operations.set(key, toJson, 10, TimeUnit.SECONDS);return list;}/*** 获取⼀位学⽣逻辑:* 如果缓存存在,从缓存中获取学⽣信息* 如果缓存不存在,从 DB 中获取学⽣信息,然后插⼊缓存*/@Overridepublic Student getStudent(String numberCode) {// 从缓存中取出学⽣信息String key = "student_" + numberCode;Boolean hasKey = redisTemplate.hasKey(key);ValueOperations operations = redisTemplate.opsForValue();// 缓存存在if (hasKey) {String str = (String) operations.get(key);Student student = new Gson().fromJson(str, Student.class);System.out.println("StudentServiceImpl.getStudent() : 从缓存取得数据 >> " + student.toString());return student;}Student student = studentMapper.getStudent(numberCode);String str = new Gson().toJson(student);// 插⼊缓存中operations.set(key, str, 10, TimeUnit.SECONDS);System.out.println("StudentServiceImpl.getStudent() : 学⽣信息插⼊缓存 >> " + student.toString());return student;}@Overridepublic int delete(String numberCode) {String key = "student_" + numberCode;Boolean hasKey = redisTemplate.hasKey(key);int delete = studentMapper.delete(numberCode);if( delete > 0){// 缓存存在,进⾏删除if (hasKey) {redisTemplate.delete(key);System.out.println("StudentServiceImpl.update() : 从缓存中删除编号学⽣ >> " + numberCode); }}return delete;}/*** 更新学⽣信息逻辑:* 如果缓存存在,删除* 如果缓存不存在,不操作*/@Overridepublic int update(Student student) {String key = "student_" + student.getNumbercode();Boolean hasKey = redisTemplate.hasKey(key);int update = studentMapper.update(student);if( update > 0 ){// 缓存存在,进⾏删除if (hasKey) {redisTemplate.delete(key);System.out.println("StudentServiceImpl.update() : 从缓存中删除学⽣ >> " + student.toString()); }}return update;}@Overridepublic int insert(Student student) {String key = "student_list";int insert = studentMapper.insert(student);if (insert > 0) {redisTemplate.delete(key);}return insert;}}View Codecontroller 层 StudentController.javapackage com.example.demo.controller;import com.example.demo.model.Student;import com.example.demo.service.StudentService;import com.google.gson.Gson;import org.apache.ibatis.annotations.Param;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import java.util.List;@RestController@RequestMapping(path = "/student")public class StudentController {@Autowiredprivate StudentService studentService;@GetMapping( path = "/getList")public List<Student> getList(){List<Student> students = studentService.selectAll();return students;}@GetMapping( path = "/getStudent")public String getList(@Param("numberCode") String numberCode){ Student students = studentService.getStudent(numberCode); String str = new Gson().toJson(students);return str;}@PostMapping(path = "/insert")public String insert(@RequestBody Student student){int insert = studentService.insert(student);String msg = "";if( insert > 0 ){msg = "{\"msg\":\"新增成功\",\"flag\":true}";}else {msg = "{\"msg\":\"新增失败\",\"flag\":false}";}return msg;}@GetMapping(path = "/delete")public String delete(@Param("numberCode") String numberCode){ int delete = studentService.delete(numberCode);String msg = "";if( delete > 0 ){msg = "{\"msg\":\"删除成功!!\",\"flag\":true}";}else {msg = "{\"msg\":\"删除失败!!\",\"flag\":false}";}return msg;}@PostMapping(path = "/update")public String update(@RequestBody Student student){int update = studentService.update(student);String msg = "";if( update > 0 ){msg = "{\"msg\":\"更新成功\",\"flag\":true}";}else {msg = "{\"msg\":\"更新失败\",\"flag\":false}";}return msg;}}View Code。
springmvc+spring+mybatis整合首先在整合这个框架的时候,想想其一般的步骤是怎样的,先有个步骤之后,不至于在后面的搞混了,这样在整合的时候也比较清晰些。
然后我们就细细的一步一步来整合。
1 创建一个Web项目。
2 导入Mybatis3、Spring4、SpringMVC4、连接数据库(我使用的数据库是mysql)的jar包。
我所用的包:spring-websocket-4.2.0.RELEASE.jar3 创建Mybatis3、Spring4、SpringMVC4、连接数据库的配置文件。
4 配置web.xml1<?xml version="1.0" encoding="UTF-8"?>2<web-app version="2.5"3xmlns="/xml/ns/javaee"4xmlns:xsi="/2001/XMLSchema-instance" 5xsi:schemaLocation="/xml/ns/javaee6/xml/ns/javaee/web-app_2_5.xsd">78<!-- 告知javaEE容器,有哪些内容需要添加到上下文中去--> 9<context-param>10<param-name>contextConfigLocation</param-name> 11<param-value>12/WEB-INF/classes/applicationContext.xml,13<!-- /WEB-INF/classes/mvc-servlet.xml -->14</param-value>15</context-param>161718<!-- 加载LOG4J -->19<context-param>20<param-name>log4jConfigLocation</param-name> 21<param-value>/WEB-INF/log4j.xml</param-value>22</context-param>2324<context-param>25<param-name>log4jRefreshInterval</param-name> 26<param-value>60000</param-value>27</context-param>2829<!-- 动态设置项目的运行路径-->30<context-param>31<param-name>webAppRootKey</param-name>32<param-value>ssm.root</param-value>33</context-param>3435<!-- 配置静态资源-->36<servlet-mapping>37<servlet-name>default</servlet-name>38<url-pattern>/static/*</url-pattern>39</servlet-mapping>404142<!-- 配置springmvc的前端控制器-->43<servlet>44<servlet-name>mvc</servlet-name>45<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>46<!-- 默认情况下:DispatcherServlet会寻找WEB-INF下,命名规范为[servlet-name]-servlet.xml文件。
SpringMVC与MyBatis整合(⼀)——查询⼈员列表从今天开始,⼀点点的记录做毕设和学习的过程。
寒假才开始接触SpringMVC和MyBatis,之前对框架的概念理解并不到位,也没学过Spring。
⽬前学习起来思路并不很清晰,有些东西我还不能理解,只是参考别⼈的代码然后⾃⼰调试修改,在不断的查资料、编写代码和调试错误中学习。
这篇博客更新的是整合SpringMVC和MyBatis来查询所有的⼈员列表以及⼀些学习笔记。
这些代码后期还需要⼤量的修改,仅作为⼊门程序,当做练习。
⼀、SpringMVC+mybatis的系统架构:⼆、⼯程架构:三、数据库⽂件四、整合过程第⼀、整合持久层:mybatis和spring整合,通过spring管理mapper接⼝。
使⽤mapper的扫描器⾃动扫描mapper接⼝在spring中进⾏注册。
1. 编写po类。
package po;import java.util.Date;public class Person{private int id;private String username;private String sex;private int age;private String card_id;private String actor;private String depart;private Date in_time;private String phoneNum;public int getId(){return id;}public void setId(int id){this.id = id;}public String getUsername(){return username;}public void setUsername(String username){ername = username;}public String getSex(){return sex;}public void setSex(String sex){this.sex = sex;}public int getAge(){return age;}public void setAge(int age){this.age = age;}public String getCard_id(){return card_id;}public void setCard_id(String card_id){this.card_id = card_id;}public String getActor(){return actor;}public void setActor(String actor){this.actor = actor;}public String getDepart(){return depart;}public void setDepart(String depart){this.depart = depart;}public Date getIn_time(){return in_time;}public void setIn_time(Date in_time){this.in_time = in_time;}public String getPhoneNum(){return phoneNum;}public void setPhoneNum(String phoneNum){this.phoneNum = phoneNum;}}View Code2. 编写mapper.java和mapper.xml,两者名称⼀致。
主要介绍三大框架的整合,至于环境的搭建以及项目的创建可以参考其他资料。
这次整合主要用到两个配置文件:spring-mybatis.xm,包含spring和mybatis的配置文件,还有个是spring-mvc.xml的配置文件,此外有两个资源文件:jdbc.propertis和log4j.properties。
完整的目录结构如下图:本框架中用到的所有jar包都在源码中。
本测试项目中用到的是sqlserver数据库,MyEclipse 8.6和apache-tomcat-7.0.41下来逐一介绍配置文件:1、spring-mybatis.xml这个文件就是用来完成spring和mybatis的整合的。
这里面也没多少行配置,主要的就是自动扫描,自动注入,配置数据库,注释也很详细<?xml version="1.0"encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xmlns:context="/schema/context"xmlns:mvc="/schema/mvc"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.1.xsd/schema/context/schema/context/spring-context-3.1.xsd/schema/mvc/schema/mvc/spring-mvc-4.0.xsd"><!-- 自动扫描 --><context:component-scan base-package="com.myProcess.study"/><!-- 引入配置文件 --><bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"value="classpath:jdbc.properties"/> </bean><bean id="dataSource"class="mons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName"value="${driver}"/><property name="url"value="${url}"/><property name="username"value="${username}"/><property name="password"value="${password}"/><!-- 初始化连接大小 --><property name="initialSize"value="${initialSize}"></property><!-- 连接池最大数量 --><property name="maxActive"value="${maxActive}"></property><!-- 连接池最大空闲 --><property name="maxIdle"value="${maxIdle}"></property><!-- 连接池最小空闲 --><property name="minIdle"value="${minIdle}"></property><!-- 获取连接最大等待时间 --><property name="maxWait"value="${maxWait}"></property></bean><!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --><bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource"ref="dataSource"/><!-- 自动扫描mapping.xml文件 --><property name="mapperLocations"value="classpath:com/myProcess/study/mapping/*.xml"></property></bean><!-- DAO接口所在包名,Spring会自动查找其下的类 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage"value=".hnust.dao"/><property name="sqlSessionFactoryBeanName"value="sqlSessionFactory"></property></bean><!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --> <bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"ref="dataSource"/></bean></beans>2、log4j.propertieslog4j.rootLogger=INFO,Console,File#定义日志输出目的地为控制台log4j.appender.Console=org.apache.log4j.ConsoleAppenderlog4j.appender.Console.Target=System.out#可以灵活地指定日志输出格式,下面一行是指定具体的格式yout = org.apache.log4j.PatternLayoutyout.ConversionPattern=[%c]-%m%n#文件大小到达指定尺寸的时候产生一个新的文件log4j.appender.File = org.apache.log4j.RollingFileAppender#指定输出目录log4j.appender.File.File = logs/ssm.log#定义文件最大大小log4j.appender.File.MaxFileSize = 10MB# 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志log4j.appender.File.Threshold = ALLyout = org.apache.log4j.PatternLayoutyout.ConversionPattern =[%p][%d{yyyy-MM-ddHH\:mm\:ss}][%c]%m%n3、spring-mvc.xml主要是自动扫描控制器,视图模式,注解的启动这三个<?xml version="1.0"encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xmlns:context="/schema/context"xmlns:mvc="/schema/mvc"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.1.xsd/schema/context/schema/context/spring-context-3.1.xsd/schema/mvc/schema/mvc/spring-mvc-4.0.xsd"><!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 --><context:component-scan base-package="com.myProcess.study.web"/><!--避免IE执行AJAX时,返回JSON出现下载文件 --><bean id="mappingJacksonHttpMessageConverter"class="org.springframework.http.converter.json.MappingJacksonHttpMessageConvert er"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value></list></property></bean><!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 --><beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAd apter"><property name="messageConverters"><list><ref bean="mappingJacksonHttpMessageConverter"/><!-- JSON转换器 --></list></property></bean><!-- 定义跳转的文件的前后缀,视图模式配置--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个可用的url地址 --><property name="prefix"value="/WEB-INF/jsp/"/><property name="suffix"value=".jsp"/></bean><!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 --><bean id="multipartResolver"class="monsMultipartResolver"> <!-- 默认编码 --><property name="defaultEncoding"value="utf-8"/><!-- 文件大小最大值 --><property name="maxUploadSize"value="10485760000"/><!-- 内存中的最大值 --><property name="maxInMemorySize"value="40960"/></bean></beans>4、web.xml这里面对spring-mybatis.xml的引入以及配置的spring-mvc的Servlet就是为了完成SSM整合,之前2框架整合不需要在此处进行任何配置。
SpringBoot整合MyBatis超详细教程⽬录1.整合MyBatis操作1.1.配置模式1.2.注解模式1.3.混合模式1.整合MyBatis操作前⾯⼀篇提到了,实际项⽬中更常⽤的还是MyBatis框架,⽽SpringBoot整合MyBatis进⾏CRUD也⾮常⽅便。
下⾯从配置模式、注解模式、混合模式三个⽅⾯进⾏说明MyBatis与SpringBoot的整合。
1.1.配置模式MyBatis配置模式是指使⽤mybatis配置⽂件的⽅式与SpringBoot进⾏整合,相对应的就有mybatis-config.xml(⽤于配置驼峰命名,也可以省略这个⽂件)、XxxMapper.xml⽂件。
主要步骤为:导⼊mybatis官⽅starter编写mapper接⼝。
标准@Mapper注解编写sql映射⽂件并绑定mapper接⼝在application.yaml中指定Mapper配置⽂件的位置,以及指定全局配置⽂件的信息(建议;配置在mybatis.configuration中,可以省略mybatis-config.xml⽂件)下⾯是具体整合配置步骤:①引⼊相关依赖pom.xml配置:pom.xml<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--整合mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>②编写对应Mapper接⼝:@Mapper //这个注解表⽰了这个类是⼀个mybatis的mapper接⼝类@Repositorypublic interface UserMapper {//@Select("select * from user")List<User> findAllUsers();//@Insert("insert into user(id, username, password) values (#{id}, #{username}, #{password})")void insert(User user);//@Update("update user set username = #{username}, password = #{password} where id = #{id}")void update(User user);//@Delete("delete from user where id = #{id}")void deleteById(Integer id);}③在resources下创建对应的mapper⽂件,对应domain类,数据库表单如下:User类:@Datapublic class User {private Integer id;private String username;private String password;}数据库user表:UserMapper.xml⽂件:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd"> <!--namespace表⽰当前mapper的唯⼀标识:⼀般使⽤domain的全路径名+Mapper来命名--><mapper namespace="com.fengye.springboot_erMapper"><!--id:⽅法表⽰,⼀般配置对应的⽅法;resultType:表⽰该⽅法有返回,返回需要封装到对应实体的类型--><select id="findAllUsers" resultType="com.fengye.springboot_er">select * from user</select><insert id="insert" parameterType="com.fengye.springboot_er">insert into user(id, username, password) values (#{id}, #{username}, #{password})</insert><update id="update" parameterType="com.fengye.springboot_er">update user set username = #{username}, password = #{password} where id = #{id}</update><delete id="deleteById" parameterType="Integer">delete from user where id = #{id}</delete></mapper>④对应配置application.yml⽂件:application.ymlserver:port: 8083spring:datasource:username: rootpassword: admin#假如时区报错,增加时区配置serverTimezone=UTCurl: jdbc:mysql://localhost:3306/mybatis02_0322?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8 driver-class-name: com.mysql.cj.jdbc.Drivermybatis:#config-location: classpath:mybatis/mybatis-config.xml 使⽤了configuration注解则⽆需再指定mybatis-config.xml⽂件 mapper-locations: classpath:mybatis/mapper/*.xmlconfiguration: #指定mybatis全局配置⽂件中的相关配置项map-underscore-to-camel-case: true1.2.注解模式注解模式使⽤主要步骤:导⼊mybatis官⽅依赖注解⽅式编写mapper接⼝在application.yaml中指定Mapper配置⽂件的位置,以及指定全局配置⽂件的信息可以看到注解模式⽐配置模式少了编写Mapper.xml⽂件,简化了简单SQL语句的xml⽂件编写。
SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)使用SSM(Spring、SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方。
之前没有记录SSM整合的过程,这次刚刚好基于自己的一个小项目重新搭建了一次,而且比项目搭建的要更好一些。
以前解决问题的过程和方法并没有及时记录,以后在自己的小项目中遇到我再整理分享一下。
这次,先说说三大框架整合过程。
个人认为使用框架并不是很难,关键要理解其思想,这对于我们提高编程水平很有帮助。
不过,如果用都不会,谈思想就变成纸上谈兵了!!!先技术,再思想。
实践出真知。
(可通过图片水印查看博客地址)1、基本概念1.1、SpringSpring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。
它是为了解决企业应用开发的复杂性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
然而,Spring的用途不仅限于服务器端的开发。
从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
1.2、SpringMVCSpring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。
Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
1.3、MyBatisMyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
spring与mybatis整合过程第⼀步:整合dao层
mybatis和spring整合,通过spring管理mapper接⼝。
使⽤mapper的扫描器⾃动扫描mapper接⼝在spring中进⾏注册。
第⼆步:整合service层
通过spring管理 service接⼝。
使⽤配置⽅式将service接⼝配置在spring配置⽂件中。
实现事务控制。
第三步:整合springmvc
由于springmvc是spring的模块,不需要整合。
主要配置有:
1). mybatis配置⽂件sqlMapConfig.xml配置别名⾃动扫描(实体类)
2). mapper扫描器(接⼝,数据库访问接⼝)
3). 数据库连接池配置
4). 声明式事务配置
5). 启⽤注解扫描:<context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>
6). 配置注解映射器和适配器: <mvc:annotation-driven></mvc:annotation-driven>
7). 视图解析器:<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
8). 配置控制类: DispatcherServlet前端控制器
9). 配置spring配置⽂件加载类:ClassLoadListener。
⼀步步教你整合SSM框架(SpringMVC+Spring+MyBatis)详细教程前⾔SSM(Spring+SpringMVC+Mybatis)是⽬前较为主流的企业级架构⽅案,不知道⼤家有没有留意,在我们看招聘信息的时候,经常会看到这⼀点,需要具备SSH框架的技能;⽽且在⼤部分教学课堂中,也会把SSH作为最核⼼的教学内容。
但是,我们在实际应⽤中发现,SpringMVC可以完全替代Struts,配合注解的⽅式,编程⾮常快捷,⽽且通过restful风格定义url,让地址看起来⾮常优雅。
另外,MyBatis也可以替换Hibernate,正因为MyBatis的半⾃动特点,我们程序猿可以完全掌控SQL,这会让有数据库经验的程序猿能开发出⾼效率的SQL语句,⽽且XML配置管理起来也⾮常⽅便。
好了,如果你也认同我的看法,那么下⾯我们⼀起来做整合吧!话不多说,来⼀起看看详细的介绍:在写代码之前我们先了解⼀下这三个框架分别是⼲什么的?相信⼤以前也看过不少这些概念,我这就⽤⼤⽩话来讲,如果之前有了解过可以跳过这⼀⼤段,直接看代码!1. SpringMVC:它⽤于web层,相当于controller(等价于传统的servlet和struts的action),⽤来处理⽤户请求。
举个例⼦,⽤户在地址栏输⼊http://⽹站域名/login,那么springmvc就会拦截到这个请求,并且调⽤controller层中相应的⽅法,(中间可能包含验证⽤户名和密码的业务逻辑,以及查询数据库操作,但这些都不是springmvc的职责),最终把结果返回给⽤户,并且返回相应的页⾯(当然也可以只反馈josn/xml等格式数据)。
springmvc就是做前⾯和后⾯过程的活,与⽤户打交道!!2. Spring:太强⼤了,以⾄于我⽆法⽤⼀个词或⼀句话来概括它。
但与我们平时开发接触最多的估计就是IOC容器,它可以装载bean(也就是我们java中的类,当然也包括service dao⾥⾯的),有了这个机制,我们就不⽤在每次使⽤这个类的时候为它初始化,很少看到关键字new。
springMVc+Ibatis+Mecached简单配置文档作者:赵洋编写时间:2013年12月20日文档信息:本文档基于spring4.0.0M2,mybatis3.1.1编写的简单的框架整合流程,针对于需要整个两个框架的朋友而编写,并且内容都由demo中拷贝而出,能够完整正确的运行。
框架信息:框架名称:spring-framework版本:spring4.0.0M2框架名称:MyBatis版本:3.1.1memcached-win32-1.4.4-14所需jar包://请保证jar包版本的对应性,否则可能出现不可预知错误aspectjrt.jar commons-logging.jar java_memcached-release_2.6.6.jarjavax-inject.jar jcl-over-slf4j-1.6.4.jar jsp-api.jar jstl.jar junit4.4.jarlog4j-1.2.14.jar logback-access-1.0.13.jar logback-classic-1.0.13.jarlogback-core-1.0.13.jar mybatis-3.1.1.jar mybatis-spring-1.1.0.jarmysql-connector-java-5.1.23-bin.jar org.springframework.transaction-3.0.0.RELEASE.jar servlet-api.jar slf4j-api-1.6.4.jar slf4j-log4j12-1.6.4.jar spring-aop-4.0.0.M2.jarspring-beans-4.0.0.M2.jar spring-context-4.0.0.M2.jarspring-context-support-4.0.0.M2.jar spring-core-4.0.0.M2.jarspring-expression-4.0.0.M2.jar spring-jdbc-4.0.0.M2.jar spring-web-4.0.0.M2.jar spring-webmvc-4.0.0.M2.jar spy-2.4.jar spymemcached-2.8.1.jarMyBatis配置创建mybatis配置文件(mybatis-config.xml)<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE configurationPUBLIC"-////DTD Config 3.0//EN""/dtd/ibatis-3-config.dtd"><configuration><!--给持久层对象配置个别名,能方便调用 --><typeAliases><typeAlias type="er"alias="User"/></typeAliases><!--接口映射文件的位置 --><mappers><mapper resource="test/dao/IUserDao.xml"/> </mappers></configuration>创建数据库(demo)创建数据表(user)创建完毕后请填充测试数据创建实体类(User)package test.bean;import java.io.Serializable;//继承Serializable表示此类可序列化publicclass User implements Serializable{ privateint id;private String name;private String gender;//缓存序列化时需要用到的属性privatestaticfinallong serialVersionUID = 1L;publicint getId() {return id;}publicvoid setId(int id) {this.id = id;}public String getName() {return name;}publicvoid setName(String name) { = name;}public StringgetGender() {return gender;}publicvoid setGender(String gender) {this.gender = gender;}}创建dao层接口(IUserDao.java)package test.dao;import er;publicinterface IUserDao {User getUser(String name);}创建dao层接口所对应的配置文件(IUserDao.xml)请与接口类使用相同的名字<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapperPUBLIC"-////DTD Mapper 3.0//EN""/dtd/ibatis-3-mapper.dtd"><!-- 务必配置正确namespace就是所映射的接口类--><mapper namespace="test.dao.IUserDao"><!-- resultType="User"这个使用的是配置文件里面的别名(配置文件为mybatis-config.xml) --><select id="getUser"parameterType="string"resultType="User">select * from user where name=#{name}</select></mapper>在spring配置文件中配置数据源(完整配置见spring部分)<!-- 获取JDBC连接属性 --><context:property-placeholder location="/WEB-INF/config/jdbc.properties"/><!-- 配置数据源 --><bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName"><value>${jdbc.driverClassName}</value></property><property name="url"><value>${jdbc.url}</value></property></bean><!-- sqlSessionFactory --><!-- MyBatis在spring中Bean的配置,都是固定的 --><bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean" ><property name="configLocation"value="/WEB-INF/config/mybatis-config.xml"/><property name="dataSource"ref="dataSource"/></bean><bean id="sqlSession"class="org.mybatis.spring.SqlSessionTemplate"><constructor-arg index="0"ref="sqlSessionFactory"/></bean><!-- 配置映射器 --><bean id="userMapper"class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface"value="test.dao.IUserDao"/><property name="sqlSessionFactory"ref="sqlSessionFactory"/></bean><!-- 为业务逻辑层注入数据的对象 --><bean id="userServer"class="erServerImpl"><property name="userDao"ref="userMapper"></property><property name="memcachedClient"ref="memcachedClient"></property></bean>配置数据库连接参数文件(jdbc.properties)jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc\:mysql\://localhost\:3306/demo?user\=test&password\=test Memcached配置Memcached安装一、下载memcached的稳定版本,然后解压到某个目录下面,我放到了d:\app\memcached下载链接找到c:\WINDOWS\system32\cmd.exe,右键以管理员身份运行,否则会报错,切换到memcached目录下面,安装Cmd切换目录的代码为cd –d d:/memcachedCmd代码1.memcached.exe –d install启动Cmd代码1.memcached.exe -d startspring自动生成memcached对象在spring配置文件中配置(完成内容见spring部分)<!--memcached注入--><bean id="memcachedClient"class="net.spy.memcached.spring.MemcachedClien tFactoryBean"><property name="servers"value="localhost:11211"/><property name="protocol"value="BINARY"/><property name="transcoder"><bean class="net.spy.memcached.transcoders.SerializingTranscoder"><property name="compressionThreshold"value="1024"/></bean></property><property name="opTimeout"value="50"/><property name="timeoutExceptionThreshold"value="1998"/><property name="hashAlg"><value type="net.spy.memcached.DefaultHashAlgorithm">KETAMA_HASH</value> </property><property name="locatorType"value="CONSISTENT"/><property name="failureMode"value="Redistribute"/><property name="useNagleAlgorithm"value="false"/></bean>注入业务类中完整内容见spring配置部分<!--为业务逻辑层注入数据的对象 --><bean id="userServer"class="erServerImpl"><property name="userDao"ref="userMapper"></property><property name="memcachedClient"ref="memcachedClient"></property></bean>注入后在业务类中直接调用即可(具体调用见spring部分)Spring配置web.xml中添加spring配置<!—spring监听配置--><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/config/applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</list ener-class></listener>web.xml中添加springMVC配置<!--springmvc入口配置 start --><servlet><servlet-name>springMVC</servlet-name><!--springmvc总控制器--><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/config/mvc-dispatcher-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springMVC</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><!--springmvc入口配置 end -->编写springMVC配置文档(mvc-dispatcher-servlet.xml)<?xml version="1.0"encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd/schema/context/schema/context/spring-context-3.0.xsd"><!--spring 组件扫描配置 --><context:component-scan base-package="test.controller"/><!--配置视图解析器 (该配置的是jstl解析器的一个扩展解析类) --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!—请求转发的目录--><property name="prefix"value="/WEB-INF/pages/"/><!—请求转发的文件类型--><property name="suffix"value=".jsp"/></bean></beans>编写spring配置文档(applicationContext.xml)<?xml version="1.0"encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd /schema/context/schema/context/spring-context-3.0.xsd"><!--获取JDBC连接属性 --><context:property-placeholder location="/WEB-INF/config/jdbc.properties"/> <!--配置数据源 --><bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName"><value>${jdbc.driverClassName}</value></property><property name="url"><value>${jdbc.url}</value></property></bean><!--sqlSessionFactory --><!--MyBatis在spring中Bean的配置,都是固定的 --><bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean" ><property name="configLocation"value="/WEB-INF/config/mybatis-config.xml"/> <property name="dataSource"ref="dataSource"/></bean><bean id="sqlSession"class="org.mybatis.spring.SqlSessionTemplate"><constructor-arg index="0"ref="sqlSessionFactory"/></bean><!--配置映射器 --><bean id="userMapper"class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface"value="test.dao.IUserDao"/><property name="sqlSessionFactory"ref="sqlSessionFactory"/></bean><!--memcached注入--><bean id="memcachedClient"class="net.spy.memcached.spring.MemcachedClien tFactoryBean"><property name="servers"value="localhost:11211"/><property name="protocol"value="BINARY"/><property name="transcoder"><bean class="net.spy.memcached.transcoders.SerializingTranscoder"><property name="compressionThreshold"value="1024"/></bean></property><property name="opTimeout"value="50"/><property name="timeoutExceptionThreshold"value="1998"/><property name="hashAlg"><value type="net.spy.memcached.DefaultHashAlgorithm">KETAMA_HASH</value> </property><property name="locatorType"value="CONSISTENT"/><property name="failureMode"value="Redistribute"/><property name="useNagleAlgorithm"value="false"/></bean><!--为业务逻辑层注入数据的对象 --><bean id="userServer"class="erServerImpl"><property name="userDao"ref="userMapper"></property><property name="memcachedClient"ref="memcachedClient"></property></bean><bean id="login"class="erController" ><property name="server" ref="userServer"></property></bean></beans>配置数据库连接参数文件(jdbc.properties)jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc\:mysql\://localhost\:3306/demo?user\=test&password\=test 编写spring控制器调用的服务接口(IUserServer)packagetest.server;er;importtest.dao.IUserDao;public interface IUserServer {public User testMethod(String userName);}编写spring控制器调用的服务类(UserServerImpl)packagetest.server;importnet.spy.memcached.MemcachedClient;importorg.springframework.beans.factory.annotation.Autowired;er;importtest.dao.IUserDao;public class UserServerImpl implements IUserServer{privateIUserDaouserDao;privateMemcachedClientmemcachedClient;publicIUserDaogetUserDao() {returnuserDao;}//依赖注入,根据属性名自动注入@Autowiredpublic void setUserDao(IUserDaouserDao) {erDao = userDao;}publicMemcachedClientgetMemcachedClient() {returnmemcachedClient;}//依赖注入(分布式缓存,在spring中自动生成)@Autowiredpublic void setMemcachedClient(MemcachedClientmemcachedClient) {this.memcachedClient = memcachedClient;}public User testMethod(String userName){User user;//判断缓存中数据是否存在,如果不存在则添加,存在则读取if(this.memcachedClient.get("user")!=null){user=(User) this.memcachedClient.get("user");}else{user=userDao.getUser(userName);this.memcachedClient.add("user", 7200, user);}return user;}}编写spring访问的控制器(UserController)注意:controller必须位置springMVC配置文件中组件扫描路径下packagetest.controller;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.servlet.ModelAndView;er;erServer;/*** 登录控制器* @author tanfei* @date Feb 1, 2013 9:38:13 AM*/@Controllerpublic class UserController {UserServer server;publicUserServergetServer() {return server;}//依赖注入,根据属性名自动注入@Autowiredpublic void setServer(UserServer server) {this.server = server;}//根据访问连接调用控制器,此控制器的调用连接为localhost:8080/demo/login.do@RequestMapping("login")publicModelAndViewhandleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception{//创建ModelAndView对象,login为返回的jsp页面的名称,全路径是根据在springMVC配置文件中配置的前缀与后缀拼接而成ModelAndView mode= new ModelAndView("login");User user=server.testMethod("aa");//将对象加入mode返回到前台页面mode.addObject("user", user);return mode;}}编写jsp页面显示后台控制器的返回值(login.jsp)<%String path = request.getContextPath();String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort ()+path+"/";%><%@page language="java"import="java.util.*"pageEncoding="gbk"%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'index.jsp' starting page</title></head><body>//该实体类有三个属性。