SSM整合方式二
SSM框架整合二
第一步:根据需求做设计
CREATE TABLE t_user_info
(
u_id
bigint(20) NOT NULL AUTO_INCREMENT,
u_name
varchar(255) NOT NULL,
u_pass
varchar(255) DEFAULT NULL,
PRIMARY KEY (u_id
)
) ENGINE=InnoDB AUTO_INCREMENT=150 DEFAULT CHARSET=utf8;
第二步:搭建环境
JDK版本环境(线上服务器若之前就是1.6,若统一升级到1.8需要线下所有功能重新测试通过后才能上线。)
测试童鞋:回归测试。
导入的包和上面第一个整合一样 唯一修改的就是数据库连接池 这里我们使用了德鲁伊数据库连接池
DTO:
public class UserInfoDto {
private Long uId;
private String uName;
private String uPass;
private String hiddenInfo;
@Override
public String toString() {
return "UserInfoDto{" +
"uId=" + uId +
", uName='" + uName + '\'' +
", uPass='" + uPass + '\'' +
", hiddenInfo='" + hiddenInfo + '\'' +
'}';
}
public Long getuId() {
return uId;
}
public void setuId(Long uId) {
this.uId = uId;
}
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
public String getuPass() {
return uPass;
}
public void setuPass(String uPass) {
this.uPass = uPass;
}
public String getHiddenInfo() {
return hiddenInfo;
}
public void setHiddenInfo(String hiddenInfo) {
this.hiddenInfo = hiddenInfo;
}
public UserInfoDto() {
}
public UserInfoDto(Long uId, String uName, String uPass, String hiddenInfo) {
this.uId = uId;
this.uName = uName;
this.uPass = uPass;
this.hiddenInfo = hiddenInfo;
}
}
PageDto:
public class PageDto {
private Integer start;
private Integer size;
private Integer total;
private Integer totalPage;
private Integer currentPage;
public Integer getStart() {
return start;
}
public void setStart(Integer start) {
this.start = start;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
this.size = size;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public Integer getTotalPage() {
return totalPage;
}
public void setTotalPage(Integer totalPage) {
this.totalPage = totalPage;
}
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public PageDto() {
}
public PageDto(Integer start, Integer size, Integer total, Integer totalPage, Integer currentPage) {
this.start = start;
this.size = size;
this.total = total;
this.totalPage = totalPage;
this.currentPage = currentPage;
}
}
第三步:生成Mybatis映射文件和实体类
生成了DAO接口,生成Example类

第四步:开发持久层(生成Mapper接口的方式)
不需要自己写实现类,但是需要配置,好动态生成代理实现类(扫描)
第五步:开发服务层
使用注解方式
使用生成的example类查询
public interface UserInfoService {
void addUserInfo(UserInfoDto userInfoDto);
void deleteUserInfo(Long aLong);
void updateUserInfo(UserInfoDto userInfoDto);
void deletUserInfoBatch(Long[] aLong);
UserInfoDto queryUserInfoById(Long aLong);
List<UserInfoDto> queryUserInfoAll();
List<UserInfoDto> queryUserInfoByPage(Integer index, Integer size);
List<UserInfoDto> queryUserInfoLikeSomeThing(String s);
/**
* 分页 封装 PageDto 的方法
* @param pageDto
* @return
*/
List<UserInfoDto> queryUserInfoByPage2(PageDto pageDto);
}
@Service("UserInfoService")
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private UserInfoMapper userInfoMapper;
@Override
public void addUserInfo(UserInfoDto userInfoDto) {
UserInfo userInfo=new UserInfo();
BeanUtils.copyProperties(userInfoDto,userInfo);
userInfoMapper.insertSelective(userInfo);
}
@Override
public void deleteUserInfo(Long aLong) {
userInfoMapper.deleteByPrimaryKey(aLong);
}
@Override
public void updateUserInfo(UserInfoDto userInfoDto) {
UserInfo userinfo=new UserInfo();
BeanUtils.copyProperties(userInfoDto,userinfo);
int i = userInfoMapper.updateByPrimaryKey(userinfo);
System.out.println("========================>"+i);
}
@Override
public void deletUserInfoBatch(Long[] aLong) {
for (Long aLong1 : aLong) {
userInfoMapper.deleteByPrimaryKey(aLong1);
}
}
@Override
public UserInfoDto queryUserInfoById(Long aLong) {
UserInfoDto userInfoDto=new UserInfoDto();
UserInfo userInfo = userInfoMapper.selectByPrimaryKey(aLong);
BeanUtils.copyProperties(userInfo,userInfoDto);
return userInfoDto;
}
@Override
public List<UserInfoDto> queryUserInfoAll() {
UserInfoExample userInfoExample=new UserInfoExample();
List<UserInfo> userInfos = userInfoMapper.selectByExample(userInfoExample);
List<UserInfoDto> userInfoDtos=new ArrayList<>();
for (UserInfo userInfo : userInfos) {
UserInfoDto userInfoDto=new UserInfoDto();
BeanUtils.copyProperties(userInfo,userInfoDto);
userInfoDtos.add(userInfoDto);
}
return userInfoDtos;
}
/**
* 这个方法与之前不同之处在于使用了分页插件
*/
@Override
public List<UserInfoDto> queryUserInfoByPage(Integer start, Integer size) {
PageHelper.startPage(start,size);
UserInfoExample userInfoExample=new UserInfoExample();
List<UserInfo> userInfos = userInfoMapper.selectByExample(userInfoExample);
PageInfo pageInfo=new PageInfo(userInfos);
List<UserInfoDto> userInfoDtos1=new ArrayList<>();
for (UserInfo userInfo : userInfos) {
UserInfoDto userInfoDto=new UserInfoDto();
BeanUtils.copyProperties(userInfo,userInfoDto);
userInfoDtos1.add(userInfoDto);
}
long total = pageInfo.getTotal();
System.out.println("======="+total);
long pageNumber = (total/size)+1;
System.out.println("======"+pageNumber);
return userInfoDtos1 ;
}
@Override
public List<UserInfoDto> queryUserInfoLikeSomeThing(String s) {
UserInfoExample userInfoExample=new UserInfoExample();
UserInfoExample.Criteria criteria = userInfoExample.createCriteria();
criteria.andUNameLike("%"+s+"%");
List<UserInfo> userInfos = userInfoMapper.selectByExample(userInfoExample);
List<UserInfoDto> userInfoDtos=new ArrayList<>();
for (UserInfo userInfo : userInfos) {
UserInfoDto userInfoDto=new UserInfoDto();
BeanUtils.copyProperties(userInfo,userInfoDto);
userInfoDtos.add(userInfoDto);
}
return userInfoDtos;
}
@Override
public List<UserInfoDto> queryUserInfoByPage2(PageDto pageDto) {
PageHelper.startPage(pageDto.getStart(),pageDto.getSize());
List<UserInfoDto> userInfoDtos =new ArrayList<>();
UserInfoExample userInfoExample=new UserInfoExample();
List<UserInfo> userInfos = userInfoMapper.selectByExample(userInfoExample);
PageInfo pageInfo=new PageInfo(userInfos);
Long total = pageInfo.getTotal();
Long l = (total / pageDto.getSize())+1;
int i1 = l.intValue();
int i = total.intValue();
pageDto.setTotal(i);
pageDto.setTotalPage(i1);
for (UserInfo userInfo : userInfos) {
UserInfoDto userInfoDto =new UserInfoDto();
BeanUtils.copyProperties(userInfo,userInfoDto);
userInfoDtos.add(userInfoDto);
}
return userInfoDtos;
}
}
模糊查询:
QfUserExample example = new QfUserExample();
QfUserExample.Criteria criteria = example.createCriteria();
criteria.andUsernameLike("%感恩%");
List<QfUser> qfUsers = qfUserMapper.selectByExample(example);
单表条件功能丰富。
时间工具类:
public class ComDate {
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
public static Date strToDate(String strDate) {
Date parse = null;
try {
parse = simpleDateFormat.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
}
return parse;
}
public static String dateToStr(Date date ){
String format = simpleDateFormat.format(date);
return format;
}
}
第六步:开发表现层
@Controller
public class UserInfoController {
@Autowired
@Qualifier("UserInfoService")
private UserInfoService userInfoService;
@RequestMapping("/addUserInfo.do")
public ModelAndView addUserInfo(UserInfoDto userInfoDto){
ModelAndView modelAndView=new ModelAndView();
userInfoService.addUserInfo(userInfoDto);
modelAndView.setViewName("forward:/listUserInfo.do");
return modelAndView;
}
@RequestMapping("/listUserInfo.do")
public String listUserInfo(Model model){
List<UserInfoDto> userInfoDtos = userInfoService.queryUserInfoAll();
model.addAttribute("userInfoDtos",userInfoDtos);
return "listUserInfo";
}
@RequestMapping("/deleteByIds.do")
public String deleteByIds(HttpServletRequest request){
String[] ids = request.getParameterValues("ids");
Long [] longs= new Long[ids.length];
for(int i=0;i<ids.length;i++){
longs[i]=Long.parseLong(ids[i]);
}
userInfoService.deletUserInfoBatch(longs);
return "forward:/listUserInfo.do";
}
@RequestMapping("/editUserInfo.do")
public String editUserInfo(HttpServletRequest request,Model model){
String uId = request.getParameter("uId");
UserInfoDto userInfoDto = userInfoService.queryUserInfoById(Long.parseLong(uId));
model.addAttribute("userInfoDto",userInfoDto);
return "editUserino";
}
@RequestMapping("/updateUserInfoById.do")
public String updateUserInfoById(UserInfoDto userInfoDto){
userInfoService.updateUserInfo(userInfoDto);
return "forward:/listUserInfo.do";
}
@RequestMapping("/queryUserInfoByPage.do")
@ResponseBody
public List<UserInfoDto> queryUserInfoByPage(){
List list = userInfoService.queryUserInfoByPage(1, 5);
return list;
}
@RequestMapping("/queryUserInfoByPage2.do")
public String queryUserInfoByPage2(HttpServletRequest request,Model model){
String page = request.getParameter("page");
int currentPage=1;
if(StringUtils.isEmpty(page)){
currentPage=1;
}else{
currentPage=Integer.parseInt(page);
}
PageDto pageDto=new PageDto();
pageDto.setStart(currentPage);
pageDto.setSize(5);
List<UserInfoDto> userInfoDtos = userInfoService.queryUserInfoByPage2(pageDto);
if(currentPage<1){
currentPage=1;
}else if (currentPage>pageDto.getTotalPage()){
currentPage=pageDto.getTotalPage();
}
model.addAttribute("currentPage",currentPage);
model.addAttribute("maxSize",pageDto.getTotalPage());
model.addAttribute("userInfoDtos",userInfoDtos);
return "listUserInfo";
}
}
第七步:整合持久层配置+服务层
持久层resources/applicationContext-servive.xml
1)连接池:com.alibaba.druid.pool.DruidDataSource
2)加载db属性文件:如db. Properties
<context:property-placeholder location="classpath:properties/*.properties">
3)创建SqlSessionFactory:org.mybatis.spring.SqlSessionFactoryBean
4)注意mapper接口扫描生成代理类(必须定位到具体的DAO包)
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.zyh.dao"></property>
</bean>
完整的配置文件如下:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/testmybatis01?characterEncoding=utf-8"></property>
<property name="username" value="root"></property>
<property name="password" value="zyh"></property>
<property name="maxWait" value="3000"></property>
<property name="maxActive" value="30"></property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations" value="classpath:com/zyh/mapper/*Mapper.xml"></property>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<prop key="helperDialect">mysql</prop>
<prop key="reasonable" >true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.zyh.dao"></property>
</bean>
<context:component-scan base-package="com.zyh.service"></context:component-scan>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="query*" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="myPoint" expression="execution( * com.zyh.service.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="myAdvice" pointcut-ref="myPoint"></aop:advisor>
</aop:config>
Web.xml
添加初始化容器的配置,服务器启动的时候,加载所有的bean,如果有异常,启动就可以看见失败的部分。
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-servive.xml</param-value>
</context-param>
<filter>
<filter-name>encode</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>encode</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
web.xml 需要注意的两个部分
此部分主要负责加载 dao 以及 service 部分:

配置监听器:

此部分主要负责

配置监听器的优点:
Spring容器的监听listener,在web容器启动的时候,会加载配置文件中的所有Bean.也就是创建所有的对象。提前发现问题。如果不加监听,只有在第一次访问才加载。
配置监听器的优势一:
ex:如果配置有误:

web容器启动就报错:

优势二:可以对配置做分层
在表现层的配置DispatcherServlet前端控制器,仅仅只需要加载表现层的配置就可以了。
分层配置:

表现层只加载表现层的配置(子容器)

监听器加载:持久层,服务层的配置(父容器)

