IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SSM整合注意事项 -> 正文阅读

[Java知识库]SSM整合注意事项

1. org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.Persiste

这个是JDBC命名冲突的问题;这个不能写成driver,会冲突!!!

在这里插入图片描述

2. MyBatis注册映射文件(resource、class、package 三者区别)

resource加载

mybatis原始开发mapper.xml文件与接口文件不在同一路径下,仅能用resource加载映射文件

<mapper resource="com/whirl/dao/BookMapper.xml"/>

class加载

接口文件与映射文件在同一路径下,且接口名与映射文件名相同

<mapper class="com.whirl.dao.BookMapper"/>

包加载

接口文件与映射文件在同一路径下,且接口名与映射文件名相同,并且映射文件命名为接口全类名

<package name="com.whirl.dao"/>

3. spring-dao.xml

关联数据库文件

注意这句代码,要加classpath,不然之后会报错找不到database.properties的

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

配置SqlSessionFactory对象

配置MyBaties全局配置文件:mybatis-config.xml ,也是classpath,主要是路径,就要写这个东西

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

配置扫描Dao接口包,动态实现Dao接口注入到spring容器中

注意这里是basepackage,扫描包有的是用 <context:component-scan base-package=“com.whirl.service” />

<property name="basePackage" value="com.whirl.dao"/>

4. spring-service.xml

扫描service相关的bean

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

BookServiceImpl注入到IOC容器中,这里只有当在BookServiceImpl中写了set注入,这里的ref才可以,依赖注入,采用的是set方法

在这里插入图片描述

<bean id="BookServiceImpl" class="com.whirl.service.BookServiceImpl">
    <property name="bookMapper" ref="bookMapper"/>
</bean>

5. spring-mvc.xml

扫描包也是和service的那个一样,也是用component-scan

<!-- 配置SpringMVC -->
<!-- 1.开启SpringMVC注解驱动 -->
<mvc:annotation-driven />
<!-- 2.静态资源默认servlet配置-->
<mvc:default-servlet-handler/>

6. web.xml

 <!--DispatcherServlet-->
<!--encodingFilter-->
 <!--DispatcherServlet-->

7. BookMapper.java和.xml

注意这里的带参数,加一个@Param,然后后面的xml里就可以直接用这个bookID

注意xml里的那些resultType=“Books” 和 parameterType=“String”

这个参数类型是Books是因为这个是整合了的,都在applicationContext.xml里面

int deleteBookByID(@Param("bookID") int id);

8. @Qualifier注解

使用 @Autowired 注解是 Spring 依赖注入的绝好方法。

但是有些场景下仅仅靠这个注解不足以让Spring知道到底要注入哪个 bean。

默认情况下,@Autowired 按类型装配 Spring Bean。如果容器中有多个相同类型的 bean,则框架将抛出 NoUniqueBeanDefinitionException, 以提示有多个满足条件的 bean 进行自动装配。

9. 修改数据,带值显示

后端把数据放在Model里面,带到前端,通过Querybook拿出来,

注意那个bookID要用隐藏域写出来,不然不能绑定修改哪一个id的数据。

 //跳转到修改书籍的页面
    @RequestMapping("/toUpdateBook")
    public String toUpdatePaper(Model model,int id){
        Books books = bookService.queryBookByID(id);
        model.addAttribute("Querybook",books);
        return "updateBook";
    }

    //提交一个修改书籍的请求
    @RequestMapping("/updateBook")
    public String updateBook(Books book,Model model){
        System.out.println(book);
        bookService.updateBook(book);
        return "redirect:/book/allBook";
    }
<form action="${pageContext.request.contextPath}/book/updateBook" method="post">
    <input type="hidden" name="bookID" value="${Querybook.getBookID()}"/>
    书籍名称:<input type="text" name="bookName" value="${Querybook.getBookName()}"/>
    书籍数量:<input type="text" name="bookCounts" value="${Querybook.getBookCounts()}"/>
    书籍详情:<input type="text" name="detail" value="${Querybook.getDetail() }"/>
    <input type="submit" value="提交"/>
</form>

10. 传参方法

//跳转到修改书籍的页面
    @RequestMapping("/toUpdateBook")
    public String toUpdatePaper(Model model,int id){
        Books books = bookService.queryBookByID(id);
        model.addAttribute("Querybook",books);
        return "updateBook";
    }

    //根据ID删除书籍
    @RequestMapping("/del/{bookId}")
    public String deleteBook(@PathVariable("bookId") int id) {   //对比上面的更改,一个是普通传参,一个是restful风格,去看allBook.jsp页面
        bookService.deleteBookByID(id);
        return "redirect:/book/allBook";
    }
<td>
    <a href="${pageContext.request.contextPath}/book/toUpdateBook?id=${book.getBookID()}">更改</a> |
    <a href="${pageContext.request.contextPath}/book/del/${book.getBookID()}">删除</a>
</td>

11. 相关配置截图

在这里插入图片描述

12. json乱码配置问题

<!-- JSON乱码问题配置 -->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

13. mybatis在mapper.xml中写sql语句不提示数据库及字段

在这里插入图片描述

注意path是项目路径,并不是某个xml路径

14. c3p0的问题

AbstractMethodError: Method com/mchange/v2/c3p0/impl/NewProxyResultSet.isClosed()Z is abstract

在这里插入图片描述

问题分析: 出现该问题是因为 c3p0 的版本偏低,只适用与 Mysql 5.x 版本。我用的是 Mysql 8.x版本,所以治理需要更改 c3p0 的版本到与 mysql 8.x 适配的版本。
在 MAVEN 的 Pom.xml 中更改 c3p0 的依赖信息

<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
</dependency>

15. 引入Bootstrap

参考链接Bootstrap国内cdn库_于大博-CSDN博客_bootstrap cdn

<!-- 引入 Bootstrap -->
<link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

16. 表单

Example block-level help text here.

Submit
<form action="${pageContext.request.contextPath}/book/addBook" method="post">
        书籍名称:<input type="text" name="bookName"><br><br><br>
        书籍数量:<input type="text" name="bookCounts"><br><br><br>
        书籍详情:<input type="text" name="detail"><br><br><br>
        <input type="submit" value="添加">
    </form>

17. 隐藏域

提交了修改的请求但没有成功,以为是事务的问题,其实是sql执行失败,是因为没有传id

<input type="hidden" name="bookID" value="${Querybook.getBookID()}"/>

在这里插入图片描述

排错思路

一个是添加事务,aop横切进来,但此处不是这个原因,因为开始写的新增都可以执行

二个是可以在controller里面显示输出影响的行数,如果是0,那就说明SQL出现了问题,要去检查SQL的传值

三个是可以添加mybatis的日志

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

18. / 和 /* 的区别:

< url-pattern > / </ url-pattern > 不会匹配到.jsp, 只针对我们编写的请求;即:.jsp 不会进入spring的 DispatcherServlet类 。

< url-pattern > /* </ url-pattern > 会匹配 *.jsp,会出现返回 jsp视图 时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:09:53  更:2022-04-09 18:11:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:58:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码