SSM框架整合(Spring、SpringMVC、MyBatis) --- 实现商品管理系统

        <groupId>org.mybatis</groupId>

        <artifactId>mybatis</artifactId>

        <version>3.5.4</version>

    </dependency>

    <dependency>

        <groupId>org.mybatis</groupId>

        <artifactId>mybatis-spring</artifactId>

        <version>2.0.4</version>

    </dependency>



    <!--Spring-->

    <dependency>

        <groupId>org.springframework</groupId>

        <artifactId>spring-webmvc</artifactId>

        <version>5.1.9.RELEASE</version>

    </dependency>

    <dependency>

        <groupId>org.springframework</groupId>

        <artifactId>spring-jdbc</artifactId>

        <version>5.1.9.RELEASE</version>

    </dependency>



    <!--        Lombok-->

    <dependency>

        <groupId>org.projectlombok</groupId>

        <artifactId>lombok</artifactId>

        <version>1.18.12</version>

    </dependency>
    <dependency>

        <groupId>org.apache.commons</groupId>

        <artifactId>commons-lang3</artifactId>

        <version>3.9</version>

    </dependency>

    <!-- log4j日志输出 -->

    <dependency>

        <groupId>log4j</groupId>

        <artifactId>log4j</artifactId>

        <version>1.2.17</version>

    </dependency>

</dependencies>

<!--静态资源导出-->

<build>

    <resources>

        <resource>

            <directory>src/main/java</directory>

            <includes>

                <include>**/*.properties</include>

                <include>**/*.xml</include>

            </includes>

            <filtering>false</filtering>

        </resource>

        <resource>

            <directory>src/main/resources</directory>

            <includes>

                <include>**/*.properties</include>

                <include>**/*.xml</include>

            </includes>

            <filtering>false</filtering>

        </resource>

    </resources>

</build>



[](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)核心配置文件

=========================================================================



**database.properties**



jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8

jdbc.username=root

jdbc.password=111111




**log4j.properties**



#//???INFO?DEBUG? ???

log4j.rootLogger=infoA,errorA,stdout,DEBUGA

#???spring???

log4j.category.org.springframework = WARN

#???

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target=System.out

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.Threshold = debug

log4j.appender.stdout.layout.ConversionPattern=%d %-5p %c{1}:%L - %m%n

#??error???

log4j.logger.errorA=error

log4j.appender.errorA=org.apache.log4j.DailyRollingFileAppender

log4j.appender.errorA.layout=org.apache.log4j.PatternLayout

log4j.appender.errorA.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n

log4j.appender.errorA.datePattern=yyyy-MM-dd’.log’

log4j.appender.errorA.Threshold = error

log4j.appender.errorA.append=true

log4j.appender.error.File=d:/log/error.log

#??DEBUG???

log4j.logger.DEBUGA=DEBUG

log4j.appender.DEBUGA=org.apache.log4j.DailyRollingFileAppender

log4j.appender.DEBUGA.layout=org.apache.log4j.PatternLayout

log4j.appender.DEBUGA.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n

log4j.appender.DEBUGA.datePattern=yyyy-MM-dd’.log’

log4j.appender.DEBUGA.Threshold = DEBUG

log4j.appender.DEBUGA.append=true

log4j.appender.DEBUGA.File=d:/log/debug_log.log

#??sql??

log4j.logger.com.ibatis=DEBUG

log4j.logger.java.sql.ResultSet=INFO

log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG

log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG

log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG

log4j.logger.java.sql.Connection=DEBUG

log4j.logger.java.sql.Statement=DEBUG

log4j.logger.java.sql.PreparedStatement=DEBUG




**mabatis-config.xml**



<?xml version="1.0" encoding="UTF-8" ?>
<settings>

    <setting name="logImpl" value="STDOUT_LOGGING"/>

</settings>



<typeAliases>

    <package name="com.wanshi.bean"/>

</typeAliases>



<mappers>

    <mapper resource="com/wanshi/mapper/UserInfoMapper.xml"/>

    <mapper resource="com/wanshi/mapper/GoodsMapper.xml"/>

</mappers>



**spring-dao.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"

   xsi:schemaLocation="http://www.springframework.org/schema/beans

   http://www.springframework.org/schema/beans/spring-beans.xsd

   http://www.springframework.org/schema/context

   https://www.springframework.org/schema/context/spring-context.xsd">



<!-- 配置整合mybatis -->

<!-- 1.关联数据库文件 -->

<context:property-placeholder location="classpath:database.properties"/>

<context:property-placeholder location="classpath:log4j.properties"/>

<!-- 2.数据库连接池 -->

<!--数据库连接池

    dbcp 半自动化操作 不能自动连接

    c3p0 自动化操作(自动的加载配置文件 并且设置到对象里面)

-->

<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>



<!-- 3.配置SqlSessionFactory对象 -->

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

    <!-- 注入数据库连接池 -->

    <property name="dataSource" ref="dataSource"/>

    <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->

    <property name="configLocation" value="classpath:mybatis-config.xml"/>

</bean>



<!-- 4.配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 -->

<!--解释 :https://www.cnblogs.com/jpfss/p/7799806.html-->

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

    <!-- 注入sqlSessionFactory -->

    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>

    <!-- 给出需要扫描Dao接口包 -->

    <property name="basePackage" value="com.wanshi.mapper"/>

</bean>



**spring-service.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"

   xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd">

<!-- 扫描service相关的bean -->

<context:component-scan base-package="com.wanshi.service" />



<!--BookServiceImpl注入到IOC容器中-->

<bean id="UserInfoServiceImpl" class="com.wanshi.service.impl.UserInfoServiceImpl">

    <property name="userInfoMapper" ref="userInfoMapper"/>

</bean>

<bean id="GoodsServiceImpl" class="com.wanshi.service.impl.GoodsServiceImpl">

    <property name="goodsMapper" ref="goodsMapper"/>

</bean>



<!-- 配置事务管理器 -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <!-- 注入数据库连接池 -->

    <property name="dataSource" ref="dataSource" />

</bean>



**spring-mvc.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:mvc="http://www.springframework.org/schema/mvc"

   xmlns:context="http://www.springframework.org/schema/context"

   xsi:schemaLocation="http://www.springframework.org/schema/beans

   http://www.springframework.org/schema/beans/spring-beans.xsd

   http://www.springframework.org/schema/mvc

   http://www.springframework.org/schema/mvc/spring-mvc.xsd

   http://www.springframework.org/schema/context

   http://www.springframework.org/schema/context/spring-context.xsd">



<!--    1.注解驱动-->

<mvc:annotation-driven/>

<!--    2.静态资源过滤-->

<mvc:default-servlet-handler/>

<!--    3.扫描包:controller-->

<context:component-scan base-package="com.wanshi.controller"/>

<!--    4.视图解析器-->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

    <property name="prefix" value="/WEB-INF/jsp/"/>

    <property name="suffix" value=".jsp"/>

</bean>



<mvc:interceptors>

    <mvc:interceptor>

        <mvc:mapping path="/**"/>

        <bean id="loginInterceptor" class="com.wanshi.interceptor.LoginInterceptor"/>

    </mvc:interceptor>

</mvc:interceptors>



**applicationContext.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"

   xsi:schemaLocation="http://www.springframework.org/schema/beans

   http://www.springframework.org/schema/beans/spring-beans.xsd">



<import resource="classpath:spring-dao.xml"/>

<import resource="classpath:spring-service.xml"/>

<import resource="classpath:spring-mvc.xml"/>



[](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)核心源代码

========================================================================



* * *



**UserController**



package com.wanshi.controller;

import com.wanshi.bean.UserInfo;

import com.wanshi.service.UserInfoService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpSession;

@Controller

@RequestMapping(“/user”)

public class UserController {

@Autowired

@Qualifier("UserInfoServiceImpl")

private UserInfoService userInfoService;



@RequestMapping("/register")

public String register() {

    return "register";

}



@RequestMapping("/registerPost")

public String registerPost(UserInfo userInfo){

    userInfoService.save(userInfo);

    return "login";

}



@RequestMapping("/loginPost")

public String loginPost(HttpSession session,UserInfo userInfo){

    UserInfo u1 = userInfoService.get(userInfo);

    session.setAttribute("user", u1);

    if (u1 != null) {

        return "redirect:/goods/list";

    }

    return "register";

}

}




**GoodsController**



package com.wanshi.controller;

import com.wanshi.bean.Goods;

import com.wanshi.bean.Page;

import com.wanshi.service.GoodsService;

import org.apache.commons.lang3.StringUtils;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller

@RequestMapping(“/goods”)

public class GoodsController {

@Autowired

@Qualifier("GoodsServiceImpl")

private GoodsService goodsService;



private static final Integer PAGE_SIZE = 2;



@RequestMapping("/list")

public String list(String pageNumb, String buyerName, Model model) {

    Integer pageNum = 1;

    if (pageNumb != null && !pageNumb.equals("")) {

        pageNum = Integer.valueOf(pageNumb);

    }

    Page<Goods> pager = goodsService.list(pageNum, PAGE_SIZE, buyerName);

    model.addAttribute("pager", pager);

    model.addAttribute("buyerName", buyerName);

    return "goods/list";

}



@RequestMapping("/add")

public String add(){

    return "goods/add";

}



@RequestMapping("/addGoods")

public String addGoods(Goods goods){

    goodsService.save(goods);

    return "redirect:/goods/list";

}



@RequestMapping("/edit/{orderId}")

public String edit(@PathVariable("orderId") Integer orderId, Model model) {

    Goods goods = goodsService.get(orderId);

    model.addAttribute("goods", goods);

    return "goods/edit";

}



@RequestMapping("/editPost")

public String editPost(Goods goods) {

    goodsService.update(goods);

    return "redirect:/goods/list";

}



@RequestMapping("/del/{orderId}")

public String del(@PathVariable("orderId") Integer orderId) {

    goodsService.delete(orderId);

    return "redirect:/goods/list";

}

}




**LoginInterceptor**



package com.wanshi.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    //1.对登录,注册,风格直接放行

    //获取请求的uri地址

    String uri = request.getRequestURI();

    if (uri.contains("login") || uri.contains("register")) {

        return true;

    }



    //2.进行session验证

    Object user = request.getSession().getAttribute("user");

    if (user == null) {

        request.getRequestDispatcher("/WEB-INF/jsp/login.jsp")

                .forward(request, response);

        return false;

    }

    return true;

}

}




**Page分页类**



package com.wanshi.bean;

import java.util.ArrayList;

import java.util.List;

/**

  • 该类的使用方法必须严格按照一下流程

  • 1 计算得到 总记录数 rowCount

  • 2 使用带参构造方法初始化,例如 Page page1 = new Page(3, 5, 57 );

  • 3 设置当前页记录 page1.setList(list1 );

  • @author Administrator

  • @param

*/

public class Page {

/**

 * 当前页码前的页码数

 */

private static final int BeforePageNumbCount =  4;



/**

 * 当前页码后的页码数

 */

private static final int AfterPageNumbCount = 3;



/**

 * 当前页码

 */

private int currPage;

/**

 * 总记录数

 */

private int rowCount;

/**

 * 每页记录数

 * 该参数就是 limit arg1,arg2 中的第2个参数 arg2

 */

private int pageSize;

/**

 * 总页数

 */

private int pageCount;

/**

 * 前1页页码

 */

private int prevPageNumb;

/**

 * 后一页页码

 */

private int nextPageNumb;



/**

 * 当前页的第1个条记录的索引

 * 该变量就是 limit arg1,arg2 的第一个参数 arg1

 */

private int currPageFirstRowIndex;

/**

 * 当前页记录列表

 */

private List<T> list;

/**

 * 页码列表 , 即可显示的页码

 */

private List<Integer> pageButtonNumbs ;



/**

 * 初始化,不考虑 列表记录数

 *

 * @param _currPage

 * @param rowCount

 */

public Page(int _currPage, int _pageSize, int _rowCount){



    this.pageSize = _pageSize;

    this.rowCount = _rowCount;



    // 计算总页数

    this.pageCount = this.rowCount / this.pageSize;

    if(this.rowCount% this.pageSize !=0 || this.rowCount == 0){

        this.pageCount ++ ;

    }



    // 修正当前页

    this.currPage = _currPage ;

    if(this.currPage< 1 ){

        this.currPage = 1;

    }



    if(this.currPage > this.pageCount ){

        this.currPage = this.pageCount;

    }



    // 计算当前页第一条记录的索引

    this.currPageFirstRowIndex = (this.currPage-1)* this.pageSize ;



    // 计算并修正 前一页 和 后一页

    this.prevPageNumb = this.currPage - 1;

    this.nextPageNumb = this.currPage + 1;



    if(this.prevPageNumb<1){

        this.prevPageNumb = 1;

    }

    if(this.prevPageNumb>1 && this.prevPageNumb >= this.pageCount){

        this.prevPageNumb = this.pageCount-1;

    }

    if(this.nextPageNumb <= 1 ){

        this.nextPageNumb = 2;

最后

关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份pdf文档内,分成了以下几大专题:

  • Java基础部分

  • 算法与编程

  • 数据库部分

  • 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)

这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。

作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。
this.pageCount ){

        this.currPage = this.pageCount;

    }



    // 计算当前页第一条记录的索引

    this.currPageFirstRowIndex = (this.currPage-1)* this.pageSize ;



    // 计算并修正 前一页 和 后一页

    this.prevPageNumb = this.currPage - 1;

    this.nextPageNumb = this.currPage + 1;



    if(this.prevPageNumb<1){

        this.prevPageNumb = 1;

    }

    if(this.prevPageNumb>1 && this.prevPageNumb >= this.pageCount){

        this.prevPageNumb = this.pageCount-1;

    }

    if(this.nextPageNumb <= 1 ){

        this.nextPageNumb = 2;

最后

关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份pdf文档内,分成了以下几大专题:

  • Java基础部分

[外链图片转存中…(img-cExsgujx-1721158559731)]

  • 算法与编程

[外链图片转存中…(img-BN89Dvvb-1721158559732)]

  • 数据库部分

[外链图片转存中…(img-V0HnucBx-1721158559732)]

  • 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)

[外链图片转存中…(img-Ay6xkYr7-1721158559733)]

这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。

作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。

  • 25
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值