目录
- 1. org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.Persiste
- 2. MyBatis注册映射文件(resource、class、package 三者区别)
- 3. spring-dao.xml
- 4. spring-service.xml
- 5. spring-mvc.xml
- 6. web.xml
- 7. BookMapper.java和.xml
- 8. @Qualifier注解
- 9. 修改数据,带值显示
- 10. 传参方法
- 11. 相关配置截图
- 12. json乱码配置问题
- 13. mybatis在mapper.xml中写sql语句不提示数据库及字段
- 14. c3p0的问题
- 15. 引入Bootstrap
- 16. 表单
- 17. 隐藏域
- 18. / 和 /* 的区别:
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.
<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错。