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错。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值