今天开始总结下之前学过的所有东西,简单来说就是针对SSM的简单的集合框架,无其他的特殊内容如增加缓存之类的
接下来分为三个部分
一、SSM框架的理解(个人的理解哦)
二、SSM框架的实现
三、SSM框架实现的代码
OK,正文开始继续
一、SSM框架的理解
SSM框架是由SpringMVC+Spring+Mybatis组成的目前主流的框架,正如大多数框架而言,SSM也是分为表现层、业务层、持久层,继而对应着我们的SSM,由SpringMVC控制着页面和业务层的交互,业务层是Spring控制的Service,控制着业务层,Mybatis是和底层数据库交互的,当然后面我也会相应的总结与redis实现
二、SSM框架的实现(流程)
正如我之前写过的一篇博客,里面写着关于SpringMVC的运行方式,我就不多说了,过程我也就直接阐述来关于SSM的,起点是用户给的请求,前端控制器会拿到,再根据URL配对在处理器映射器里面的ResultMapping("参数"),接着映射器会返回给前端,前端控制器也就是DispatcherServlet,它会返回给处理器适配器,处理器适配器交给Handler处理器,也就是运行Hander(Controller)就是运行这个东西,在这儿开始,业务层开始进入,通过Spring的注解@Resource也可以是@autow自动注入吧!接着业务层开始接管任务,ServiceImpl实现它所实现的业务逻辑,servecInpl实现类里面就包含对Mybatis的操作,接着Mybatis对底层数据库的执行,接着依次逆序回到Handler(Control)回到Handler处理器,返回一个ModleAndView或者其他类型的数据返回给页面,页面可以选择填充数据,或者不填充,接着就是相应给用户
三、实现的代码(之前我看过很多的XML配置文件,都不怎么样,都会有一些问题,自己注意下,就行了)
1、持久层
一、Mapper
package com.ssm.mybatis.mapper;
import com.ssm.mybatis.pojo.User;
import com.ssm.mybatis.pojo.UserExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.ssm.mybatis.pojo.UserExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface UserMapper {
int countByExample(UserExample example);
int countByExample(UserExample example);
int deleteByExample(UserExample example);
int deleteByPrimaryKey(Integer id);
int insert(User record);
int insertSelective(User record);
List<User> selectByExample(UserExample example);
User selectByPrimaryKey(Integer id);
int updateByExampleSelective(@Param("record") User record, @Param("example") UserExample example);
int updateByExample(@Param("record") User record, @Param("example") UserExample example);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(User record);
}
}
二、Pojo
package com.ssm.mybatis.pojo;
public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
}很整洁的pojo,没有其他,同样也是逆向工程自动生成的
this.name = name == null ? null : name.trim();
}
}很整洁的pojo,没有其他,同样也是逆向工程自动生成的
三、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">
<!--全局Setting配置,根据需要再加 -->
<configuration>
<!-- <properties resource="classpath:log4j.properties">
</properties> -->
<!-- 定义别名-->
<typeAliases>
<package name="com.ssm.mybatis.pojo"/>
</typeAliases>
</configuration>
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--全局Setting配置,根据需要再加 -->
<configuration>
<!-- <properties resource="classpath:log4j.properties">
</properties> -->
<!-- 定义别名-->
<typeAliases>
<package name="com.ssm.mybatis.pojo"/>
</typeAliases>
</configuration>
2、业务层
一、Service和servicImpl
package com.ssm.service;
import org.springframework.stereotype.Service;
import com.ssm.mybatis.pojo.User;
@Service
public interface UserOrderService {
public User find(Integer id) throws Exception;
public interface UserOrderService {
public User find(Integer id) throws Exception;
public boolean addUser(UserOrderService user);
public User UserOrder();
}
}
package com.ssm.serviceImpl;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.stereotype.Service;
import com.ssm.mybatis.mapper.UserMapper;
import com.ssm.mybatis.pojo.User;
import com.ssm.service.UserOrderService;
import com.ssm.mybatis.pojo.User;
import com.ssm.service.UserOrderService;
@Service
public class UserOrderServiceImpl implements UserOrderService{
public class UserOrderServiceImpl implements UserOrderService{
@Resource(name = "userMapper")
private UserMapper userMapper;
private UserMapper userMapper;
@Override
public User find( Integer id) throws Exception {
// TODO Auto-generated method stub
return userMapper.selectByPrimaryKey(id);
}
public User find( Integer id) throws Exception {
// TODO Auto-generated method stub
return userMapper.selectByPrimaryKey(id);
}
@Override
public boolean addUser(UserOrderService user) {
// TODO Auto-generated method stub
return false;
}
@Override
public User UserOrder() {
// TODO Auto-generated method stub
return userMapper.selectByPrimaryKey(null);
}
}
3、表现层
一、handler(Controller)
package com.ssm.controller;
import java.util.List;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.ssm.mybatis.pojo.User;
import com.ssm.service.UserOrderService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.ssm.mybatis.pojo.User;
import com.ssm.service.UserOrderService;
@Controller
public class MyFristWeb {
@Resource(name = "UserOrderServiceImpl")
private UserOrderService userOrderService;
@RequestMapping("/addUser.do")
public ModelAndView addUser() {
User userOrderCustom= userOrderService.UserOrder();
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("userOrderCustom", userOrderCustom);
modelAndView.setViewName("Love");
return modelAndView;
}
public class MyFristWeb {
@Resource(name = "UserOrderServiceImpl")
private UserOrderService userOrderService;
@RequestMapping("/addUser.do")
public ModelAndView addUser() {
User userOrderCustom= userOrderService.UserOrder();
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("userOrderCustom", userOrderCustom);
modelAndView.setViewName("Love");
return modelAndView;
}
@RequestMapping("/userlist.do")
public String userList() {
return "user_list";
}
public String userList() {
return "user_list";
}
@RequestMapping("/loadUpdate.do")
public String loadUpdate() {
public String loadUpdate() {
return "user_update";
}
@RequestMapping("/updateUser.do")
public String updateUser() {
return "user_info";
}
}
@RequestMapping("/deleteUser.do")
public String deleteUser() {
public String deleteUser() {
return "user_info";
}
}
二、配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">
<!-- 定义事务管理器 -->
<!-- 数据库的事务控制 -->
<!-- 1.配置数据库相关参数properties的属性:${url} -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">
<!-- 定义事务管理器 -->
<!-- 数据库的事务控制 -->
<!-- 1.配置数据库相关参数properties的属性:${url} -->
<!-- 2.数据库连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 配置连接池属性 -->
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}" />
<!-- c3p0连接池的私有属性 -->
<property name="maxPoolSize" value="30" />
<property name="minPoolSize" value="10" />
<!-- 关闭连接后不自动commit -->
<property name="autoCommitOnClose" value="false" />
<!-- 获取连接超时时间 -->
<property name="checkoutTimeout" value="10000" />
<!-- 当获取连接失败重试次数 -->
<property name="acquireRetryAttempts" value="2" />
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 配置连接池属性 -->
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}" />
<!-- c3p0连接池的私有属性 -->
<property name="maxPoolSize" value="30" />
<property name="minPoolSize" value="10" />
<!-- 关闭连接后不自动commit -->
<property name="autoCommitOnClose" value="false" />
<!-- 获取连接超时时间 -->
<property name="checkoutTimeout" value="10000" />
<!-- 当获取连接失败重试次数 -->
<property name="acquireRetryAttempts" value="2" />
</bean>
<!-- 配置Service -->
<bean id="UserOrderServiceImpl" class="com.ssm.serviceImpl.UserOrderServiceImpl"/>
<bean id="UserOrderServiceImpl" class="com.ssm.serviceImpl.UserOrderServiceImpl"/>
<!-- 3.配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<!-- 扫描entity包 使用别名 -->
<!-- <property name="typeAliasesPackage" value="com.ssm.mybatis.pojo" /> -->
<!-- 扫描sql配置文件:mapper需要的xml文件 -->
<!-- <property name="mapperLocations" value="classpath:mapper/*.xml" /> -->
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<!-- 扫描entity包 使用别名 -->
<!-- <property name="typeAliasesPackage" value="com.ssm.mybatis.pojo" /> -->
<!-- 扫描sql配置文件:mapper需要的xml文件 -->
<!-- <property name="mapperLocations" value="classpath:mapper/*.xml" /> -->
</bean>
<!-- 4.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中如果使用扫面多个包的话,中间使用半角的逗号隔开
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="com.ssm.mybatis.mapper" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="com.ssm.mybatis.mapper" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 定义事务策略 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 传播行为 -->
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 传播行为 -->
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<!--pointcut元素定义一个切入点,execution中的第一个星号 用以匹配方法的返回类型,
这里星号表明匹配所有返回类型。 com.simple.sso.service.*.*(..)表明匹配com.ssm.service包下的所有类的所有
方法 -->
<aop:pointcut id="myPointcut" expression="execution(* com.ssm.service.*.*(..))" />
<!--将定义好的事务处理策略应用到上述的切入点 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
</aop:config>
</beans>
</tx:advice>
<aop:config>
<!--pointcut元素定义一个切入点,execution中的第一个星号 用以匹配方法的返回类型,
这里星号表明匹配所有返回类型。 com.simple.sso.service.*.*(..)表明匹配com.ssm.service包下的所有类的所有
方法 -->
<aop:pointcut id="myPointcut" expression="execution(* com.ssm.service.*.*(..))" />
<!--将定义好的事务处理策略应用到上述的切入点 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
</aop:config>
</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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 扫面Controller -->
<context:component-scan base-package="com.ssm"/>
<!-- 配置试图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/JSP/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 两个标准配置 -->
<!-- 将springmvc不能处理的请求交给Tomcat -->
<mvc:default-servlet-handler/>
<!-- 能支持springmvc更高的一些功能,JSR303校验,快捷的ajax。。。 -->
<mvc:annotation-driven></mvc:annotation-driven>
<import resource="classpath:applicationContext-transaction.xml"/>
</beans>
<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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 扫面Controller -->
<context:component-scan base-package="com.ssm"/>
<!-- 配置试图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/JSP/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 两个标准配置 -->
<!-- 将springmvc不能处理的请求交给Tomcat -->
<mvc:default-servlet-handler/>
<!-- 能支持springmvc更高的一些功能,JSR303校验,快捷的ajax。。。 -->
<mvc:annotation-driven></mvc:annotation-driven>
<import resource="classpath:applicationContext-transaction.xml"/>
</beans>
四、Web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 扫面Controller -->
<context:component-scan base-package="com.ssm"/>
<!-- 配置试图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/JSP/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 两个标准配置 -->
<!-- 将springmvc不能处理的请求交给Tomcat -->
<mvc:default-servlet-handler/>
<!-- 能支持springmvc更高的一些功能,JSR303校验,快捷的ajax。。。 -->
<mvc:annotation-driven></mvc:annotation-driven>
<import resource="classpath:applicationContext-transaction.xml"/>
</beans>
<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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 扫面Controller -->
<context:component-scan base-package="com.ssm"/>
<!-- 配置试图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/JSP/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 两个标准配置 -->
<!-- 将springmvc不能处理的请求交给Tomcat -->
<mvc:default-servlet-handler/>
<!-- 能支持springmvc更高的一些功能,JSR303校验,快捷的ajax。。。 -->
<mvc:annotation-driven></mvc:annotation-driven>
<import resource="classpath:applicationContext-transaction.xml"/>
</beans>
最后的最后,小小的总结下,对于通过逆向工程生成的POJO和MAPPER不用修改,直接另外再添加一个类继承类实现
有需要我的文件的小伙伴,直接下方留言和你的邮箱,分享至上,谢谢!