<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、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。
作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。