SSM整合方式二

2018-08-13  本文已影响11人  神豪VS勇士赢

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类

image.png

第四步:开发持久层(生成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 部分:


image.png

配置监听器:


image.png

此部分主要负责


image.png

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

配置监听器的优势一:
ex:如果配置有误:


image.png

web容器启动就报错:


image.png

优势二:可以对配置做分层

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


image.png

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

image.png

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

image.png image.png
上一篇 下一篇

猜你喜欢

热点阅读