Spring+SpringMVC+MyBatis整合开发,创建网页对数据库增,查,idea版。自学过程记录

22 篇文章 1 订阅
19 篇文章 1 订阅

如有错误欢迎指正

        现在有一个maven项目,需要我来增加两个网页,实现对数据库的增,查。

        在此之前,最好了解一下SSM整合开发的思路和代码结构,对整体项目做到心中有数,才能从容地敲下每一段代码。我是在b站看的动力节点的SpringMVC的视频。

        基本步骤如下,项目的配置我也不会,所以只讲代码部分

         数据库的student表是下图所示

         然后创建一个实体类QdStudent.java,和数据库对应,定义3个变量,并写对应函数,变量名最好和数据库的属性名一致,以便调用,不然的话需要在项目配置文件另外写别名,如下

        接下来写接口QdStudentMapper.java,一个增加函数,一个查询函数,查询函数返回的是一个list,接口如下

        接口中的方法将在QdStudentMapper.xml文件中以SQL语句去实现,它们之间的映射关系是由MyBatis这个框架帮你完成的,需要写一下配置文件。

        接下来写QdStudentMapper.xml文件,namespace是接口名的全限定名称(点击一下接口文件,ctrl+alt+shift+c,就把全限定名称复制下来了,直接到namespace那里ctrl+v)。select标签的id是接口中的方法名,resulttype是实体类的全限定名称,在标签中写SQL语句

        接下来写QdStudentService.java,定义qdStudentMapper时需要写@Autowired注解

        接下来写QdStudentController.java,在写controller的时候定义qdStudentService也需要用@Autowired注解,不然无法使用。

 写到这里我先运行了一下,结果报错了,我当场去世

2021-08-03 16:01:25,703 ERROR [org.springframework.web.servlet.DispatcherServlet] - Context initialization failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'qdStudentController': Unsatisfied dependency expressed through field 'qdStudentService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'qdStudentService': Unsatisfied dependency expressed through field 'qdStudentMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.zqgc.modules.qd.mapper.QdStudentMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

        看了一下其他同类型的代码,好多的Controller都继承了一个叫BaseController的抽象类,这样来看的话,可能是这个项目设置的一种结构,为同一类的Controller写一个BaseController。

        进入BaseController看一下,@Value是什么东西,简单来说就是从配置文件中获得名为${XXX}的属性赋值给下面定义的变量。详细解释在我另一篇文章中Spring中的@Value(“${}“)是什么东西_m0_59834108的博客-CSDN博客

         所以QdStaffUserController中的${adminPath}我终于知道是从BaseController中继承来的,但是我现在自己创建的controller如果不用BaseController中的属性和方法,应该就不用继承了把。

        但是报错了,那我还是写一下试试吧。写了之后还是报错,继承某个类只是为了用父类中的东西,我不用,应该可以不继承。

        错误提示是下面这样的,根据经验和垃圾的英语,我判断是mapper的问题

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'qdStudentController': Unsatisfied dependency expressed through field 'qdStudentService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'qdStudentService': Unsatisfied dependency expressed through field 'qdStudentMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.zqgc.modules.qd.mapper.QdStudentMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

        错误里面提到了mapper,我就去看了一下别的mapper是怎么写的,别的mapper里面是空的。。。

         这段代码和controller有类似之处,继承了一个BaseMapper,头顶还有一个@MyBatisMapper,我又打开其他的mapper文件,发现几乎都是这样写的,看来我写的mapper可能还是缺了点什么东西。

        我上网查@MyBatisMapper是干嘛的,发现是一个自定义注解。用这个注解标识MyBatis的DAO,方便{@link org.mybatis.spring.mapper.MapperScannerConfigurer}的扫描。

        BaseMapper<>应该类似于上文中的BaseController,对所有的mapper文件共同的功能做一个提取封装起来,这么看来所有的操作都在BaseMapper<>中,所以我看到的mapper都是空的。

        BaseMapper<>的尖括号是什么意思,我们看一下BaseMapper是怎么定义的

         BaseMapper定义的时候是BaseMapper<T>,这个叫泛型类,简单的说就是比普通类多定义了一个T,使用的时候可以定义这个类里面的T是什么类型,图中有一个例子,public T get(String id),定义的get方法,返回类型就是T。

        再看上一张图的代码,public interface QdCaseMapper extends BaseMapper<QdCase>

        所以这里创建的BaseMapper<QdCase>里面的T是QdCase类型

        继承之后可以使用父类的方法,但是我不用父类的方法不继承也行吧。那个@MyBatisMapper可能需要,我就加上试试吧。

        加上之后还是报错,但是错误提示不一样了。这次的错误提示没有提mapper,而是提到了QdStudentController和QdZhController,还说什么There is already 'qdStudentController' bean method(已经有qdStudentController了)Cannot map 'qdZhController' method (不能映射qdZhController)

        懂英语真好。肯定是QdZhController和QdStudentController有问题,而且意思好像是这两个只能有一个。我比较了一下两端代码

 

         那个RequestMapping引起了我的注意,因为我写的QdStudentController是模仿QdZhController写的,当时不清楚这个RequestMapping到底是干嘛的,就纯模仿了。随着知识的积累,我忽然有了一个问题,controller是如何注入springmvc之后,需要处理页面发送的请求,他们是如何将不同的controller和网页配对的?上网一搜,答案就是RequestMapping。

        一个页面对应着一个url,而这个RequestMapping就是识别页面发出的url。当页面发出请求时,中央调度器获取页面的url,然后从使用@Controller注解的类中通过RequestMapping做配对,配对成功之后,则交给这个类处理。

        所以这里的两个controller应该处理两个页面,用同一个RequestMapping是不行的。那我就随便改个名字吧。

        改完之后就没有报错了。(泪目)

        但是在xml文件中我发现我写的resultType的格式和他写的不一样

        它写的是下面这样的

         我写的是下面这样的

         我写的是全限定名称,它写的可能是别名吧,这个需要在MyBatis的配置文件中配置。

        开始写页面吧

        现在我们已经有一个页面了。我想在这个页面中的留言板中加一个超链接,点击可以跳转到自己创建的页面,完成提交信息到数据库。

         需要在找到定义这个页面的jsp文件,加入a标签。但是a标签的href应该怎么写,又成了一个问题。

         简单来说,就是写一个本地jsp文件所在的路径,在网页点击超链接的时候,框架会通过RequestMapping帮你找到对应的Controller,然后通过Controller返回对应的页面,这样的好处就是可以做额外的操作,比如权限问题等。详解可以看我另一篇文章。src怎么写,和href类似iframe的src怎么写,写什么_m0_59834108的博客-CSDN博客

        所以这个herf得和Controller中的RequestMapping对应,我们先去写Controller。

         所以a标签应该写<a href="/zh/student">点击进入提交学生信息界面</a>

        我们下面再来写Controller返回页面的函数。我写的是return是下面这样的

         因为这个项目的结构是这样的

        我应该在zh文件夹下面新建一个student.jsp,但是我在return中写的是student没有写student.jsp是因为我看其他的代码里面也没有写后缀,应该是在某个地方做了配置吧。 

        但是我看其他的代码和我写的还是有点不一样。他们是这样写的:

         我去看了一下lang是什么,在开头就定义了。 

          lang = "zh",和我写的是一个意思,但是将"zh"分离出来应该是有好处的,我也就这样做吧

         现在去zh文件夹下面创建一个student.jsp

         基本的连接做完了,我们来试一下,点击超链接,成功。

         接下来就在student.jsp中写一个提交信息的表单,为了做的好看一点,我决定使用layui,使用layui的具体过程点击进入另一篇文章在Java Web项目中使用layui做一个表单提交_m0_59834108的博客-CSDN博客,效果如下

         然后给立即提交这个按钮绑定一个函数,具体操作可以点击另一篇文章给HTML代码中的按钮绑定一个函数_m0_59834108的博客-CSDN博客

        函数将页面获得的数据发送给controller,controller用@RequestMapping(value="/student/add")来接收,AjaxJson是自定义的类

         接下来我们点击立即提交,结果没反应,失败了。。。。我在上面那个controller中设置断点, 发现这个controller根本没有执行。

         直到请教了别人才知道,我给按钮绑定的函数,不能用click()这个函数名。。。。我换了一个名字click1()就有反应了,但是又报错了,说$ is undefined ,原因就是没有引入jQuery。那我们就引入jQuery,引入文件的路径怎么写,看这篇 HTML文件中引入css或js文件的href和src的路径写法问题_m0_59834108的博客-CSDN博客

        改完函数名之后就没问题了,我们来写个数据提交试一下。报错了

         我们注意看报错的提示,NullPointerException,空指针异常,我才明白,我写的

        QdStudent qdStudent=null;

        qdStudent.setName(name);

        qdStudent.setAge(age);

        这三行代码是有问题的。最初我写的是QdStudent qdStudent; 编译的时候报错说我的qdStudent未初始化,所以我就把它写成null,但是我想调用qdStudent.setName(name);这个方法时必须得有实体才行,这在逻辑上就矛盾了。

        产生这个问题的原因在于我忽略了Java的特点,创建对象时需要用new才能创建实例

        我们修改一个代码   QdStudent qdStudent = new QdStudent();  

        再来试一下

         看一下数据库,成功写入

         但是为什么在网页没有成功提示,我们在controller中写了这个逻辑,如果成功写入,网页应该弹出一个成功的提示才对。我发现在controller上漏写了一个注解@ResponseBody.

        加上这个注解之后,还是没有提示,但是我用断点调试的时候是可以看到这个提示的,我觉得可能是layui的设置,提交完表单之后自动刷新了页面。这个问题不再深究。

        我们再来写一个页面,从数据库中取出数据,显示在页面上。过程可以看另一篇文章后端从数据库获得数据,用Model发送到前端页面_m0_59834108的博客-CSDN博客

        到此,我们的改写计划就结束了。但是有一个问题我没有写,就是权限认证问题。

可以看一下这篇文章<shiro:hasPermission name=“...“>咋用啊_m0_59834108的博客-CSDN博客

         如有错误欢迎指正

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好人不心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值