• 创建一个简单的springMVC+mybatis项目(二)


    紧接着上篇文章,接下来的我们用springMVC+mybatis框架实现系统登录和登录成功后显示用户列表的功能

    首先,我们需要为这个项目新建一个数据库,然后创建一张用户表(我们这里使用的是mysql,可视化连接工具用的是navicat)

    1、选中对应你的mysql server的连接->右键选择新建数据库

    2、双击打开数据库

    3、打开sql脚本编写界面,执行建表语句:

    CREATE TABLE `td_user` (
        `user_id` INT (11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
        `user_name` VARCHAR (20) DEFAULT NULL COMMENT '用户名',
        `password` VARCHAR (20) DEFAULT NULL COMMENT '密码',
        `email` VARCHAR (30) DEFAULT NULL COMMENT '用户邮箱',
        `mobile` VARCHAR (20) DEFAULT NULL COMMENT '联系方式',
        `address` VARCHAR (100) DEFAULT NULL COMMENT '地址',
        `status` VARCHAR (5) DEFAULT NULL COMMENT '用户状态:1可用,2注销',
        `create_time` datetime DEFAULT NULL COMMENT '创建时间',
        `create_id` INT (11) DEFAULT NULL COMMENT '创建人id',
        `update_time` datetime DEFAULT NULL COMMENT '修改时间',
        `update_id` INT (11) DEFAULT NULL COMMENT '修改人id',
        PRIMARY KEY (`user_id`)
    ) ENGINE = INNODB AUTO_INCREMENT = 16 DEFAULT CHARSET = utf8 COMMENT = '系统用户表';

    数据库表已经准备好了,下面我们要做的就是使用mybatis给我们提供的方法来用java代码连接数据库

    1、我们最好把数据库的连接信息做成可配置的,这样在升级到测试、uat、生产等不同的环境时我们不需要修改代码,这里我们使用读取properties文件的配置方式

     

    在resources文件夹下创建config/jdbc_config.properties文件

    jdbc_config.properties内容如下:

    jdbc.ip=localhost
    jdpc.port=3306
    jdbc.db.name=helloworld
    jdbc.user=root
    jdbc.password=123

    现在要做的是写spring配置,使得spring容器能够读到properties的配置,修改上文中的spring-context.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"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
        <!-- 方式3.使用注解的方式注入,主要用在java代码中使用注解注入properties文件中相应的value值 -->
        <bean id="propertyConfigurer"
            class="org.springframework.beans.factory.config.PropertiesFactoryBean">
            <!-- 这里是PropertiesFactoryBean类,它也有个locations属性,也是接收一个数组,跟上面一样 -->
            <property name="locations">
                <array>
                    <value>classpath:config/jdbc_config.properties</value>
                    <!-- <value>classpath:work.properties</value> -->
                </array>
            </property>
            <property name="fileEncoding" value="UTF-8"></property>
        </bean>
        <!-- 这句是为了加载jdbc配置到springcontext中,使得连接数据库的${}变量可以获得参数信息 -->
        <bean id="properties"
            class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
            <property name="properties" ref="propertyConfigurer"></property>
        </bean>
    
    </beans>

     2、添加关于mybatis的配置文件:spring-mybatis.xml

    spring-mybatis.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"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
    
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <!-- 基本属性 url、user、password -->
            <property name="url" value="jdbc:mysql://${jdbc.ip}:${jdpc.port}/${jdbc.db.name}?useUnicode=true&amp;characterEncoding=utf-8&amp;zeroDateTimeBehavior=convertToNull" /> 
            <property name="username" value="${jdbc.user}" />
            <property name="password" value="${jdbc.password}" />
            <!-- 配置初始化大小、最小、最大 -->
            <property name="initialSize" value="1" />
            <property name="minIdle" value="1" />
            <property name="maxActive" value="20" />
            <property name="maxIdle" value="20"></property>
            <!-- 配置获取连接等待超时的时间 -->
            <property name="maxWait" value="60000" />
            <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
            <property name="timeBetweenEvictionRunsMillis" value="60000" />
            <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
            <property name="minEvictableIdleTimeMillis" value="300000" />
            <property name="validationQuery" value="SELECT 'x'" />
            <property name="testWhileIdle" value="true" />
            <property name="testOnBorrow" value="false" />
            <property name="testOnReturn" value="false" />
    
            <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
            <property name="poolPreparedStatements" value="false" />
            <!-- 配置监控统计拦截的filters -->
        </bean>
    
    
        <!-- MyBatis配置 -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
            <!-- <property name="typeAliasesPackage" value="com.hjf.boot.api.domain" 
                /> -->
            <!-- 显式指定Mapper文件位置 -->
            <property name="mapperLocations" value="classpath*:mybatis/myxml/**/*.xml" />
        </bean>
        <!-- 扫描basePackage下所有以@MyBatisRepository标识的 接口 -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.study.db" />
            <!-- <property name="annotationClass" value="com.hjf.boot.demo.boot_mybatis.dao.Mapper" 
                /> -->
        </bean>
    
        <!-- 开启事务注解驱动 -->
        <bean id="transactionManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
        </bean>
        <!-- 自动扫描,多个包以 逗号分隔 <context:component-scan base-package="com.sinosig.xb.em"/> -->
        <!-- <aop:aspectj-autoproxy /> -->
        
    </beans>

     根据配置,创建存放数据库表映射文件和实体类的包和文件夹如下:

    3、接下来我们就要使用mybatis的反向工程(即通过数据库表生成通用的java实体类、映射文件及dao层方法)来自动生成部分代码

    1)、首先我们来安装sts使用mybatis反向工程的插件(MyBatis Generator with Eclipse Installing the Eclipse Feature)

    下载插件,地址:http://www.mybatis.org/generator/

     选择一个版本下载即可

    安装参考(https://blog.csdn.net/qq_38002337/article/details/79440215)

     将插件压缩包中的features和plugins里的东西都拷贝到eclipse的文件夹features和plugins下。或者直接将压缩包解压后直接放入eclipse的dropins文件夹下重启eclipse,验证是否安装成功。(sts只是对eclipse的一个简单封装,基本操作同eclipse)

    创建mybatis方向工程需要用到的配置文件generator.xml

    2)、创建generator_helloworld.xml文件(注意,文件实在mybatis文件夹根目录下,与myxml同级),内容如下:generator_helloworld.xml内容

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
            PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    
    <!-- 配置Run As Maven build : Goals 参数 : mybatis-generator:generate -Dmybatis.generator.overwrite=true -->
    <!-- 配置 tableName,使用 Run As Maven build 生成 dao model 层 -->
    <generatorConfiguration>
        <!-- 配置文件路径 -->
        <!-- <properties url="${mybatis.generator.generatorConfig.properties}"/> -->
        <!-- <properties resource="generatorConfig.properties"/> -->
    
        <!--数据库驱动包路径 -->
        <classPathEntry
            location="E:workspacemy.lds.wshelloworldWebContentWEB-INFlibmysql-connector-java-5.1.18.jar" />
        <context id="alertTables" targetRuntime="MyBatis3">
            <!-- mybatio分页插件 -->
            <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"></plugin>
            <!--关闭注释 -->
            <commentGenerator>
                <property name="suppressAllComments" value="true" /><!-- 是否取消注释 -->
                <property name="suppressDate" value="true" /> <!-- 是否生成注释代时间戳 -->
            </commentGenerator>
    
            <!--数据库连接信息 -->
            <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/helloworld" userId="root"
                password="123">
            </jdbcConnection>
    
            <!-- 类型转换 -->
            <javaTypeResolver>
                <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
                <property name="forceBigDecimals" value="false" />
            </javaTypeResolver>
    
            <!--生成的model 包路径 -->
            <javaModelGenerator targetPackage="com.study.db.model"
                targetProject="helloworld/src">
                <!-- 是否在当前路径下新加一层schema,eg:fase路径cn.ffcs.test.domain", true:cn.ffcs.test.domain".[schemaName] -->
                <property name="enableSubPackages" value="ture" />
                <!-- 是否针对string类型的字段在set的时候进行trim调用 -->
                <property name="trimStrings" value="true" />
                <!-- <property name="rootClass" value="com.sinosig.xb.rms.base.BaseEntity"/> -->
            </javaModelGenerator>
    
            <!--生成xml mapper文件 路径 -->
            <sqlMapGenerator targetPackage="mybatis.myxml"
                targetProject="helloworld/src/resources">
                <!-- 是否在当前路径下新加一层schema,eg:fase路径cn.ffcs.test.domain", true:cn.ffcs.test.domain".[schemaName] -->
                <property name="enableSubPackages" value="ture" />
            </sqlMapGenerator>
    
            <!-- 生成的Dao接口 的包路径 -->
            <javaClientGenerator type="XMLMAPPER"
                targetPackage="com.study.db.dao" targetProject="helloworld/src">
                <property name="enableSubPackages" value="ture" />
                <!-- baseDao -->
                <!-- <property name="rootInterface" value="com.xb.alert.platform.db.dao.BaseDao" 
                    /> -->
            </javaClientGenerator>
    
            <!--对应数据库表名 -->
            <!-- schema即为数据库名 tableName为对应的数据库表 domainObjectName要生成的实体类名 enable*ByExample是否生成 
                example类 -->
            <!--tableName="td_user"代表生成所连库的td_user表的反向工程文件 -->
            <!-- <table tableName="td_user" schema="" enableInsert="true" -->
            <!--tableName="td_%"代表生成所连库的所有形如td_%表的反向工程文件 -->
            <!-- <table tableName="td_%" schema="" enableInsert="true" useGeneratedKeys="true" 
                keyProperty="id" -->
            <!--%代表生成所连库的所有表的反向工程文件 -->
            <table tableName="%" schema="" enableInsert="true"
                enableCountByExample="true" enableUpdateByExample="true"
                enableDeleteByExample="true" enableSelectByExample="true"
                selectByExampleQueryId="true">
                <!-- enableCountByExample="true" enableUpdateByExample="false" enableDeleteByExample="false" -->
                <!-- enableSelectByExample="true" selectByExampleQueryId="true"> -->
                <!-- 忽略列,不生成bean 字段 <ignoreColumn column="FRED" /> -->
                <!-- 指定列的java数据类型 <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" 
                    /> -->
            </table>
        </context>
    </generatorConfiguration>
    generator_helloworld.xml内容

    选中generator_helloworld.xml右键选择generator mybatis/ibatis artifacts为每个表生成四个文件(重复执行会报错,要要从新生成要把之前生成的删掉后在执行次操作),分别是:

    表对应的实体类、表与实体类对应的xml映射文件、对表的基本操作类和封装查询条件的example类,在接下来的操作中,我们将一一得见每个文件的用处,具体如下:

     关于查询数据库的基本操作我们已经完成了,下面我们要通过实现一个用户登录的功能来将整个系统跑通

    1、首先我们来写一个前端的登录页面loginPage.jsp和一个登录成功的页面helloworld.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>loginPage</title>
    </head>
    <style type="text/css">
    input {
        font-size: 22px;
    }
    
    .errorMessage {
        font-size: 16px;
        color: red;
        padding-top: 10px;
    }
    </style>
    <script type="text/javascript">
        
    </script>
    <body>
        <div align="center" style="padding-top: 15%; font-size: 30px;">
            <form action="${pageContext.request.contextPath}/doLogin"
                method="post">
                <div>
                    用户名:<input type="text" name="userName" placeholder="用户名"> <span><i
                        class="fa  fa-user"></i></span>
                </div>
                <div>&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"
                        placeholder="密码"> <span></span>
                </div>
                <div style="padding: 10px; font-size: 30px;">
                    <button type="submit">提交</button>
                    <button type="reset">重置</button>
                </div>
                <!-- el表达式   https://www.cnblogs.com/xdp-gacl/p/3938361.html-->
                <div class="errorMessage">${error }</div>
            </form>
        </div>
    </body>
    </html>
    loginPage.jsp页面内容
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>欢迎页面</title>
    <!-- Tell the browser to be responsive to screen width -->
    <meta
        content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
        name="viewport">
    
    </head>
    <body class="hold-transition login-page">亲爱的,恭喜你,成功了!!
    </body>
    </html>
    helloPage.jsp页面内容

     2、创建一个用于登录相关功能的controller类用于接收登录请求并对登录结果做跳转

    LoginController.java内容如下:

    package com.study.controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import com.study.db.model.TdUser;
    import com.study.service.LoginService;
    
    /**
     * 登录控制类
     * @author thc
     */
    @Controller
    public class LoginController {
        @Autowired
        private LoginService lService;
    
        /**
         * 跳转到登录页面的方法
         */
        @RequestMapping(value = "/", method = RequestMethod.GET)
        public String login() {
            // 直接跳转到登录页面
            return "loginPage";
        }
    
        /**
         * 执行登录操作后,跳转到登录成功的系统功能页面
         * @return 返回跳转页面
         */
        @RequestMapping(value = "/doLogin", method = RequestMethod.POST)
        public String dologin(HttpServletRequest request, HttpServletResponse response, Model model,
                @RequestParam(value = "userName") String userName, @RequestParam(value = "password") String passWord) {
            HttpSession session = request.getSession();
            // 数据库校验登录用户
            TdUser u = lService.verifyLogin(userName, passWord);
            if (u != null) {
                // 将登录用户保存到会话session中
                session.setAttribute("loginUser", userName);return "helloPage";
            } else {
                // 登录失败,跳转登录页面,携带错误提示
                model.addAttribute("error", "对不起,用户名或密码错误,请重新登录!!");
                // request.setAttribute("error", "对不起,用户名或密码错误,请重新登录!!");
                return "loginPage";
            }
        }
    }

     阅读LoginController.java的代码我们会发现,我们创建了一个login()的方法,RequestMapping的value="/",意思是只要访问程序(http://localhost:8080/helloword),默认进入该方法,该方法也没有做什么逻辑处理,只是将请求跳转到了登录页面。

    接下来我们有写了一个方法dologin()(因为在loginPage.jsp中form的action我们设置的是${pageContext.request.contextPath}/doLogin,所以当点击提交按钮时,浏览器就会向系统发送http://localhost:8080/helloword/doLogin,从而进入该方法),在这个方法中我们做了登录的相关操作。在这个方法中,我们要注意一下几点:

    1)、因为我们用户名和密码提交的过程要相对安全,所以只能采用post表单的方式提交,所以该方法RequestMapping的method只设置了接收post请求(百度搜索“get请求和post请求”了解两者的区别)

    2)、我们发现在dologin方法中,查询数据库的操作我们并没有直接写在该类里,而是通过spring注解的方式声明了一个LoginService接口,然后调用了他的verifyLogin方法或得的数据库数据,这里我们声明的LoginService是一个接口,给他加上@Autowired注解,在程序启动时,spring容器就会扫描全局所有加了@service注解的LoginService接口的实现类,然后把扫描到的实现类LoginServiceImpl的bean赋值给这个声明(程序启动时,spring会扫描全局,对添加注释的类生成相应的bean)。

     在这里我们会发现,controller只是在接收浏览器的请求然后转发出去,不做过多的业务处理,而具体的业务处理是放在对应的service类里实现的。

    3、下面我们来看下service层的具体实现吧

    新建service包并在其中创建LoginService接口和impl包,在impl包中创建LoginService接口实现类LoginServiceImpl.java,结构如下:

    LoginService 代码如下:
    package com.study.service;
    
    import com.study.db.model.TdUser;
    /**
     * login服务类接口,声明这个service需要的方法,由其实现类实现所声明的方法
     * @author Administrator
     *
     */
    public interface LoginService {
        /**
         * 执行登录校验的方法,登录成功返回用户,登录失败返回null
         * @return
         */
        public TdUser verifyLogin(String userName,String password);
    }
    LoginServiceImpl代码内容如下:
    package com.study.service.impl;
    
    import java.util.List;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Service;
    
    import com.study.db.dao.TdUserMapper;
    import com.study.db.model.TdUser;
    import com.study.db.model.TdUserExample;
    import com.study.service.LoginService;
    
    @Service
    public class LoginServiceImpl implements LoginService {
    
        // 声明一个tduser表的操作类
        @Resource
        private TdUserMapper mapper;
    
        @Override
        public TdUser verifyLogin(String userName, String password) {
            // 查询数据库,看是否存在与此用户名和密码对应的用户
            
            // 创建一个mybatis的查询实体,通过mybatis的形式查询数据库
            TdUserExample example = new TdUserExample();
            // 这样封装查询实体的方式可以避免拼接sql引起的安全问题:sql注入
            example.createCriteria().andUserNameEqualTo(userName).andPasswordEqualTo(password);
            // 调用mybatis反向工程生成的表操作类的查询方法
            List<TdUser> ls = mapper.selectByExample(example);
            if (ls != null && ls.size() != 0) {
                return ls.get(0);
            }
            // 返回查询结果
            return null;
        }
    
    }

    至此,整个登录功能的基本完成了,可以启动服务,通过http://localhost:8080/helloword请求应用,测试功能。

    1、启动报错:

    今天实验dbcp时,出的错,用的jar包是
    commons-dbcp-1.4.jar
    commons-pool2-2.4.1.jar
    commons-collections4-4.0.jar
    奇怪的是明明需要的包都有,怎会报错。后来将commons-pool2-2.4.1 换成 commons-pool-1.6后解决了。
    ---------------------
    作者:月夜轻飞雪
    来源:CSDN
    原文:https://blog.csdn.net/birdofsky/article/details/47043105
    版权声明:本文为博主原创文章,转载请附上博文链接!

     其实我只是添加了一个commons-pool-1.6.jar包,程序中原本有commons-dbcp-1.4.jar,并没有需要引入commons-collections4-4.0.jar 

     2、再次尝试启动,继续报错:

    org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.study.service.LoginService com.study.controller.LoginController.lService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.study.service.LoginService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)
        at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
        ... 30 more

    意思就是spring加载不到LoginServiceImpl,可能原因有两个

    1)、LoginServiceImpl.java类上面没有加@service注解  ——查看发现加了

     

    2)、那就肯定是LoginServiceImpl.java类所在的包没有被spring容器扫描到,那肯定是配置全局扫描范围的时候错了,查看servlet-context.xml文件发现:

     

     <context:component-scan base-package="com.study.controller" /> 意思是只扫描controller包下的类,所以要修改为扫描所有包

     

    3、启动,报错

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in file [E:workspacemy.lds.ws.metadata.pluginsorg.eclipse.wst.server.core mp0wtpwebappshelloworldWEB-INFclassesspringspring-mybatis.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [E:workspacemy.lds.ws.metadata.pluginsorg.eclipse.wst.server.core mp0wtpwebappshelloworldWEB-INFclassesmybatismyxmlgenerator_helloworld.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.NullPointerException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1488)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:524)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:608)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5068)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5584)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1572)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1562)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
    Caused by: org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [E:workspacemy.lds.ws.metadata.pluginsorg.eclipse.wst.server.core mp0wtpwebappshelloworldWEB-INFclassesmybatismyxmlgenerator_helloworld.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.NullPointerException
    at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:522)
    at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:381)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1547)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1485)
    ... 22 more

    意思就是mybatismyxmlgenerator_helloworld.xml文件无法解析成java实体与数据库表的影视文件Mapper XML,原因是我们配置了mybatismyxml这个路径是存放java实体与表的映射文件的,放入了反向工程文件,默认也被解析了,但是肯定会解析错的,所以报错了

    解决:把
    generator_helloworld.xml从myxml中移出来,如下:

    再次启动,成功!!

    数据库添加一条记录:

    INSERT into td_user (user_name,password,email,mobile,address,status) VALUES('test','123456','test@163.com','13211575602','北京','1')

    访问页面:http://localhost:8080/helloworld/

    用刚刚插入的用户登录,跳转到登录成功的页面

     

    输入错误的密码试试:

    提示登录失败

    接下来我们将在下一篇文章“创建一个简单的springMVC+mybatis项目(三)”里实现权限校验和用户列表的显示,以及用户信息的更改等操作。。

    
    
    
  • 相关阅读:
    java线程间的协作
    java线程间的共享
    java多线程基础API
    java并发编程基础概念
    如何设计一套规则引擎系统
    Stream—一个早产的婴儿
    Java函数式编程的前生今世
    关于微服务划分的一些思考
    如何更优雅的给控制器 “减负”
    PHP简洁之道
  • 原文地址:https://www.cnblogs.com/tianhaichao/p/10245691.html
Copyright © 2020-2023  润新知