SpringMVC-MyBatis学习笔记

在这里插入图片描述

告知读者

 本仓库是关于SSM框架中的重要组成SpringMVC和MyBatis的笔记,将基于本人网站做全面总结。

进阶热身

  • 需要掌握java基础,了解javaweb中的MVC模式,springmvc的工作原理。这里有完整的总结
  • 下载jdk,建议jdk1.8系列版本(虽然已经发布12了)。官网
  • 下载Tomcat,建议Tomcat8.5系列版本。官网
  • 安装Eclipse,配置好java环境,确定能正常打开。官网
  • 项目所需jar,仓库中已经上传(lib文件就是)。
  • 关于如何在Eclipse中配置JavaWeb环境,这里有总结,请点击查看

第一回 懵懵懂懂项目初建 仔仔细细结构分析

注意:有两种创建web项目的方式,一种是创建Dynamic Web Project(其中的第三方jar包是在lib文件夹下面,需要由程序员自行去官网 查找下载)。 一种是MavenProject,这种方法有一个方便的地方就是,通过pom.xml文件做了jar文件的版本管理,开发的 时候,在pom文件中直接进行配置,保存后,Eclipse将会根据你的配置,自动去下载所需要的jar包,不需要程序员进行干涉。这里我们鉴于已经有下载好的jar包,便用Dynamic Web Project这种方式做以下总结。

1.打开Eclipse,File–>New–>Dynamic Web Project(如下图)

在这里插入图片描述

2.添加项目名–>选择Tomcat版本–>选择工作集(可选)–>Next

在这里插入图片描述

3.选择生成web.xml文件–>Finish

在这里插入图片描述
至此项目已经创建完成

4.打开项目结构(如下图)

在这里插入图片描述

5.需要程序员编写的是src下面的java文件和一些配置资源文件以及WebContent下面和WEB-INF下面的lib(jar包)web.xml(配置文件)。

6.需要将下载好的jar文件直接复制到lib文件夹下面,选中全部的jar文件,右键Bulid Path–>Add to Bulid Path

7.选中项目名,右键New–>Source Folder (如果找不到,就New–>Other–>搜索框搜索一下) -->命名为config

8.选中WebContent,New–>Folder–>命名为css,New–>Folder–>命名为image ,New–>Folder–>命名为js(新建这三个文件夹目的是为了存放前端的css样式,图片和JavaScript文件)

9.选中WEB-INF,New–>Folder–>命名为pages(前端页面文件夹)

到此,项目结构成型(成型如下图)
在这里插入图片描述

第二回 文件配置我有妙招 峰回路转更进一步

这一回是至关重要的一回,关系到你项目中各个中间件能否按照你的预期和谐的配合工作。这回里面将总结web.xml,
springmvc.xml,mybatis.xml,applicationContext.xml,db.proerties,log4j.properties这些配置文件。除 了web.xml文件在WEB-INF下面之外,其余文件都在资源文件config中。

  • web.xml

web.xml文件是用来配置:过滤器,Springmvc前端控制器,编码方式,mybatis配置文件,spring配置文件等等。

下面给出的是简单web项目中所需的配置(这次项目中web.xml配置)
    <?xml version="1.0" encoding="UTF-8"?>
   <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://java.sun.com/xml/ns/javaee"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
            version="3.0">
      <!-- Spring MVC配置 -->
        <servlet>
           <servlet-name>springmvc</servlet-name>
           <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 可以自定义servlet.xml配置文件的位置和名称,默认为WEB-INF目录下,名称为[<servlet-name>]-servlet.xml,
            如spring-servlet.xml-->
           <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>classpath:springmvc.xml</param-value>
           </init-param>
           <load-on-startup>1</load-on-startup>
            <!--Servlet3.0以上文件上传配置 -->
             <multipart-config>
                 <!--上传文件的最大限制5MB -->
                 <max-file-size>5242880</max-file-size>
                 <!--请求的最大限制20MB -->
                 <max-request-size>20971520</max-request-size>
                 <!--当文件的大小超过临界值时将写入磁盘 -->
                 <file-size-threshold>0</file-size-threshold>
             </multipart-config>
        </servlet>
        <!--所有请求都会被springmvc拦截 -->
        <servlet-mapping>
           <servlet-name>springmvc</servlet-name>
           <url-pattern>/</url-pattern>
        </servlet-mapping>
        <!-- Spring配置 -->
        <listener>
           <listener-class>
             org.springframework.web.context.ContextLoaderListener
           </listener-class>
        </listener>
        <!-- 指定Spring Bean的配置文件所在目录。默认配置在WEB-INF目录下 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:applicationContext.xml</param-value>
        </context-param>
        <!-- Spring MVC字符过滤器配置 -->
        <filter>
           <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
           <url-pattern>/*</url-pattern>
        </filter-mapping>
 </web-app>
  • springmvc.xml

springmvc.xml文件是给springmvc做相关的配置。拦截方式,视图处理器,前端拦截器等。

下面给出的是简单web项目中所需的配置(这次项目中springmvc.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-4.3.xsd 
              http://www.springframework.org/schema/mvc 
              http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd 
              http://www.springframework.org/schema/context 
              http://www.springframework.org/schema/context/spring-context-4.3.xsd">

        <!-- 用于使用@ResponseBody后返回中文避免乱码 -->
        <bean
           class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
           <property name="messageConverters">
              <list>
                 <bean id="stringHttpMessageConverter"
                    class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="writeAcceptCharset" value="false" />
                    <!-- 用于避免响应头过大 -->
                    <property name="supportedMediaTypes">
                       <list>
                          <value>text/html;charset=UTF-8</value>
                       </list>
                    </property>
                 </bean>
              </list>
           </property>
        </bean>
        <!-- 扫描controller注解、,多个包中间使用半角逗号分隔 -->
        <context:component-scan base-package="com.neepu.controller" />
        <!-- 支持mvc注解驱动 -->
        <mvc:annotation-driven enable-matrix-variables="true" />
        <!-- Spring MVC不处理静态资源 -->
        <mvc:default-servlet-handler />
        <!-- 视图解析器 -->
        <bean
           class="org.springframework.web.servlet.view.InternalResourceViewResolver"
           id="internalResourceViewResolver">
           <!-- 前缀 -->
           <property name="prefix" value="/WEB-INF/" />
           <!-- 后缀 -->
           <property name="suffix" value=".jsp" />
        </bean>
     <!--文件上传解析器 -->
         <!--Spring MVC默认不能识别multipart格式的文件内容 -->
         <bean id="multipartResolver"
             class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
          </bean>
        </beans>
  • mybatis.xml

mybatis.xml文件是给mybatis做相关的配置。注解开发,扫描配置,数据源配置,数据库连接配置,sqlSessionFactory配置等等。

下面给出的是简单web项目中所需的配置(这次项目中mybatis.xml的配置)
           <?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">  
        <configuration>  
            <!-- 配置mybatis的缓存,延迟加载等等一系列属性 -->  
            <settings>  
                <!-- 全局映射器启用缓存 -->  
                <setting name="cacheEnabled" value="true" />  
                <!-- 查询时,关闭关联对象即时加载以提高性能 -->  
                <setting name="lazyLoadingEnabled" value="true" />  
                <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->  
                <setting name="aggressiveLazyLoading" value="false" />  
                <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->  
                <setting name="multipleResultSetsEnabled" value="true" />  
                <!-- 允许使用列标签代替列名 -->  
                <setting name="useColumnLabel" value="true" />  
      <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->  
                <setting name="useGeneratedKeys" value="true" />  
                <!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->  
                <setting name="autoMappingBehavior" value="FULL" />  
                <!-- 对于批量更新操作缓存SQL以提高性能 -->  
                <!-- <setting name="defaultExecutorType" value="BATCH" />   -->
                <!-- 数据库超过25000秒仍未响应则超时 -->  
                <setting name="defaultStatementTimeout" value="25000" />  
            </settings>  
        </configuration>  
  • applicationContext.xml

applicationContext.xml文件是给spring做相关的配置,事务管理等配置。

下面给出的是简单web项目中所需的配置(这次项目中applicationContext.xml的配置)
       <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans" 
           xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans 
                             http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
                             http://www.springframework.org/schema/context
                             http://www.springframework.org/schema/context/spring-context-4.2.xsd
                             http://www.springframework.org/schema/mvc
                             http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
                             http://www.springframework.org/schema/tx
                             http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
                             http://mybatis.org/schema/mybatis-spring 
                             http://mybatis.org/schema/mybatis-spring.xsd ">

      <!-- 扫描huaxiren.neepu包下面的java文件,有Spring的相关注解的类,则把这些类注册为Spring的bean -->
            <context:component-scan base-package="huaxiren.neepu"/>
           <!-- 使用PropertyOverrideConfigurer后处理器加载数据源参数 -->
           <context:property-override location="classpath:db.properties"/>
           <!-- 配置c3p0数据源 -->
           <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"/>
		  <!-- 创建sqlSessionFactory。生产sqlSession -->
		  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		    <property name="dataSource" ref="dataSource"></property>
	      </bean>
	      <!-- 配置mybatis接口代理开发sqlSessionFactory 是上面sqlSession工厂id-->
	      <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		    <property name="basePackage" value="huaxiren.neepu.mapper"></property>
		    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
	      </bean>
           <!-- JDBC事务管理器 -->
           <bean id="transactionManager" 
           class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
               p:dataSource-ref="dataSource"/>
           <!-- 启用支持annotation注解方式事务管理 -->
           <tx:annotation-driven transaction-manager="transactionManager"/>
        </beans>
  • db.proerties

db.proerties文件是数据库连接信息配置文件。

下面给出的是以mysql数据库为例的配置文件(注意自己数据库的用户名和密码,以及数据库名)
 dataSource.driverClass=com.mysql.jdbc.Driver
 dataSource.jdbcUrl=jdbc:mysql://127.0.0.1:3306/huaxiren?   useUnicode=true&amp;characterEncoding=utf8
 dataSource.user=root
 dataSource.password=root
 dataSource.maxPoolSize=20
 dataSource.maxIdleTime = 1000
 dataSource.minPoolSize=6
 dataSource.initialPoolSize=5
  • log4j.properties

log4j.properties文件是log4j日志信息配置文件。

下面给出的是以log4j日志管理作出的配置
     log4j.rootLogger=DEBUG,Console,File   
     log4j.appender.Console=org.apache.log4j.ConsoleAppender  
     log4j.appender.Console.Target=System.out  
     log4j.appender.Console.layout = org.apache.log4j.PatternLayout  
     log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n   
     log4j.appender.File = org.apache.log4j.RollingFileAppender
     log4j.appender.File.File = logs/ssm.log    
     log4j.appender.File.MaxFileSize = 10MB    
     log4j.appender.File.Threshold = ALL  
     log4j.appender.File.layout = org.apache.log4j.PatternLayout  
     log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n  

第三回 控制生成还需注解 前端拦截切勿心急

做好前面所有的配置以后,关于配置文件先告一段落,不再重提。话说这是基于java开发网站,到现在为止,java代码却迟迟不现身,那么这回,就将开始做java代码的编写工作,为了让读者能很直观看到自己的网站能运行,先不做特别复杂的业务代码编写,这里先写出 一个控制器,调试通自己的网站即可(也可以测试自己前面的配置文件是否正确配置)

WEB-INF文件夹下面新建index.jsp文件,huaxiren.neepu.controller包下面新建UserController类

下面给出的是UserController类完整代码
   package huaxiren.neepu.controller;
   import org.springframework.stereotype.Controller;
   import org.springframework.web.bind.annotation.RequestMapping;
   @Controller
   public class UserController {
	@RequestMapping("/index")
	public String index() {
		return "/index";
	}
    }

运行项目,鼠标点击选中项目,右击Run As–>Run As Server–>添加你的项目–>Finish

查看控制台,log4j正常打印日志,服务器完全起来之后,将会在Eclipse中呼出一个浏览器,你只需要在地址栏后面添加index,回车即可。

以上笔记主要介绍了,java web开发过程中环境的搭建、配置文件的编写等一些列准备工作,真正的java代码开发编写,数据库CRUD操作至此尚未涉及,接下来的笔记将开始web开发之旅。主要实现的功能有系统登录注册、数据库CRUD、Shiro密码盐值加密、上传下载、ajax校验码生成,GoEasy消息实时发送,等功能。

第四回 网站访问提前注册 登录校验数据查询

网站开发过程中,必然要提供用户注册登录功能,不然怎么能知道是哪些用户访问了网站,怎么样给用户提供权限,管理员和普通用户所访问的资源是不一样的,这就必然涉及到用户信息的统一化管理。这回笔者将提到登录之前到实现登录所做的一些列工作。

小插曲** 关于Spring IOC的理解(控制反转或依赖注入)通过@Service和@Resource两个注解说明

  • @Service 对应的是业务层Bean,例如:

    @Service("userService")
     public class UserServiceImpl implements UserService {
     ………
     }
    

    @Service(“userService”)注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做"userService",这样当Controller需要使用UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注入给Controller:在Controller只需要声明一个名字叫“userService”的变量来接收由Spring注入的"userService"即可,具体代码如下:

  • @Resource

    // 注入userService
    @Resource(name = "userService")
    private UserService userService;
    

    注意:在Controller声明的“userService”变量的类型必须是“UserServiceImpl”或者是其父类“UserService”,否则由于类型不一致而无法注入,由于Controller中的声明的“userService”变量使用了@Resource注解去标注,并且指明了其name = “userService”,这就等于告诉Spring,说我Controller要实例化一个“userService”,你Spring快点帮我实例化好,然后给我,当Spring看到userService变量上的@Resource的注解时,根据其指明的name属性可以知道,Controller中需要用到一个UserServiceImpl的实例,此时Spring就会把自己创建好的名字叫做"userService"的UserServiceImpl的实例注入给Controller中的“userService”变量,帮助Controller完成userService的实例化,这样在Controller中就不用通过“UserService userService = new UserServiceImpl();”这种最原始的方式去实例化userService了。如果没有Spring,那么当Controller需要使用UserServiceImpl时,必须通过“UserService userService = new UserServiceImpl();”主动去创建实例对象,但使用了Spring之后,Controller要使用UserServiceImpl时,就不用主动去创建UserServiceImpl的实例了,创建UserServiceImpl实例已经交给Spring来做了,Spring把创建好的UserServiceImpl实例给Controller,Controller拿到就可以直接用了。Controller由原来的主动创建UserServiceImpl实例后就可以马上使用,变成了被动等待由Spring创建好UserServiceImpl实例之后再注入给Controller,Controller才能够使用。这说明Controller对“UserServiceImpl”类的“控制权”已经被“反转”了,原来主动权在自己手上,自己要使用“UserServiceImpl”类的实例,自己主动去new一个出来马上就可以使用了,但现在自己不能主动去new“UserServiceImpl”类的实例,new“UserServiceImpl”类的实例的权力已经被Spring拿走了,只有Spring才能够new“UserServiceImpl”类的实例,而Controller只能等Spring创建好“UserServiceImpl”类的实例后,再“恳求”Spring把创建好的“UserServiceImpl”类的实例给他,这样他才能够使用“UserServiceImpl”,这就是Spring核心思想“控制反转”,也叫“依赖注入”,“依赖注入”也很好理解,Controller需要使用UserServiceImpl干活,那么就是对UserServiceImpl产生了依赖,Spring把Controller需要依赖的UserServiceImpl注入(也就是“给”)给Controller,这就是所谓的“依赖注入”。对Controller而言,Controller依赖什么东西,就请求Spring注入给他,对Spring而言,Controller需要什么,Spring就主动注入给他。

建立数据库,创建用户登录信息数据表 user_inf

创建项目所需数据库,以mysql数据库为例,通过Navicat数据库管理工具,很方便创建一张数据表 user_inf
如果有需要的,这里有安装数据库和创建教程https://blog.csdn.net/weixin_44644403/article/details/88306003

user_inf创建的sql代码 数据库引擎采用mysql默认的InnoDB引擎,编码格式UTF-8,id设置为自增 AUTO_INCREMENT(读者根据自己的实际需求创建字段)

     CREATE TABLE `user_inf` (
     `id` int(11) NOT NULL AUTO_INCREMENT,
  	 `username` varchar(255) DEFAULT NULL,
 	 `password` varchar(255) DEFAULT NULL,
	  PRIMARY KEY (`id`)
	 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

数据库创建好了之后,数据库就先告一段落,但这个时候,你得明确,数据库目前情况下没有一条用户信息,即use_inf 目前是一张空表

通过逆向工程,生成mapper.xml以及数据库java实体pojo

这一步的操作其实很简单

  • 第一步:在mybatis官网上提供下载提供好的逆向工程(包括所依赖jar)逆向工程已经上传至本仓库
  • 第二步:将此逆向工程部署在java project项目中,修改配置文件中的数据库属性()
  • 第三步:运行java application 应用程序即可生成所需文件。

完整逆向工程之后,将POJO实体类和Mapper.java(接口),mapper.xml(实现类)copy到web项目中即可。

编写前端jsp注册登录页面(提前写好,已经上传至仓库,jsp部分,笔者不再提供代码解析)

编写java代码创建操作数据库

  • 第一步:编写修改Mapper.java中的接口方法,增加或者删除一些方法定义

    public interface UserMapper {
        int deleteByPrimaryKey(Integer id);
        int insert(User record);  //插入接口
        int insertSelective(User record);
        User selectByPrimaryKey(Integer id);
        int updateByPrimaryKeySelective(User record);
        int updateByPrimaryKey(User record);
        //方法包含多参数时  记得使用@Param注解
        User selectUserByName(@Param("username")String username, @Param("password")String password);
    }
    
  • 第二步:编写修改Mapper.xml中的实现方法,可以保留自己有用的一些sql

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="huaxiren.neepu.mapper.UserMapper">
      <!-- 插入方法具体实现到sql语句,这里注意,id必须和UserMapper.java中的方法名一直,必须一致 -->
      <insert id="insert" parameterType="huxiren.neepu.po.User">
        insert into user_inf (id, username, password)
        values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR})
      </insert>
      <!--登录方法具体实现到sql语句,这里注意,id必须和UserMapper.java中的方法名一直,必须一致 -->
      <select id="selectUserByName" parameterType="java.lang.String"          resultType="huxiren.neepu.po.User">
         select * from user_inf where username = #{username,jdbcType=VARCHAR} and password = # {password,jdbcType=VARCHAR}
      </select>
    </mapper>
    
  • 第二步:编写前端页面提交后的拦截Controller,编写Controller中业务逻辑代码,完成插入

    @Controller
    public class UserController {
    	@Resource
       //接口实现类,通过注解,直接生成一个实现类对象userMapper
        private UserMapper userMapper;
    	//注册页面跳转控制器
    	@RequestMapping("/regist")
    	public String regist() {
    		return "/regist";
    	}
    	//注册页面提交成功后跳转到登录界面
    		@RequestMapping("/login")
    		public String login() {
    			return "/login";
    	}
    	//登录成功跳转到成功页面index	
    		@RequestMapping("/index")
    		public String index() {
    			return "/index";
    	}
    
    	//注册业务实现类    注册页面输入  admin  123456
    	@RequestMapping("/addUser")
    	public ModelAndView addUser(ModelAndView mv,@RequestParam("username")String username,
    			@RequestParam("password")String password) {
    	    //这里将用户信息封装到user对象中
    		User user = new User();
    		user.setUsername(username);
    		user.setPassword(password);
    		//将user对象作为参数出入掺入方法
    		userMapper.insert(user);
    		mv.setViewName("redirect:/login");
    		return mv;
    	}
    	//登录业务实现类   登录页面admin   123456
    	@RequestMapping("/toLogin")
    	public ModelAndView toLogin(ModelAndView mv,@RequestParam("username")String username,
    			@RequestParam("password")String password) {
    	    //这里通过用户的用户名和密码去数据库查询,看是否有此用户
    		User user = userMapper.selectUserByName(username,password);
    		if(user!=null) {
    			mv.setViewName("redirect:/index");//登录成功跳转到index页面
    		}else {
    			mv.setViewName("redirect:/login");//重定向到登录页面
    		}
    		return mv;
    	}
    }
    
    

    持续更新完善中,敬请期待…
    这篇文章出自本人自己总结编写,未经授权,禁止引用!

发布了32 篇原创文章 · 获赞 4 · 访问量 2369

猜你喜欢

转载自blog.csdn.net/weixin_44644403/article/details/103307301