上一篇说的是框架的搭建,现在我们往里加点从数据库取出来的数据,上一个连接[SoOnPerson] SSM框架的搭建(2)
文章很长,也有报错,然后改正,并不是一下出结果的。没耐心就别看了
使用的是mybatis
那就从头开始吧
1.建一个数据库吧
2.建表咯(有的地方偷懒了,都设成varchar了,注意主键自增)
数据库ok了,回到代码。
3.有兴趣的可以去研究一下Mybatis generator 但是在这里没有用
创建book实体
文件位置看package;
package com.soonperson.po; /** * @Author:SoOnPerson * @Date:2018/3/27 14:22 * @version: * @purpose: * @Description: book实体 */ public class Book { private int id ; private String name ; private String type ; private String price ; public int getId() { return id; } public Book setId(int id) { this.id = id; return this; } public String getName() { return name; } public Book setName(String name) { this.name = name; return this; } public String getType() { return type; } public Book setType(String type) { this.type = type; return this; } public String getPrice() { return price; } public Book setPrice(String price) { this.price = price; return this; } }
4.创建dao
package com.soonperson.dao; /** * @Author:SoOnPerson * @Date:2018/3/27 14:29 * @version: * @purpose: * @Description: */ public interface BookMapper { }
5.创建mapper
位置:src/main/resources/mapper/BookMapper.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.soonperson.dao.BookMapper"> </mapper>
后面还是要加东西的。
6.创建service,有两个文件哦!
package com.soonperson.service; import org.springframework.stereotype.Service; /** * @Author:SoOnPerson * @Date:2018/3/27 14:35 * @version: * @purpose: * @Description: */ @Service public interface BookService { }
package com.soonperson.service; /** * @Author:SoOnPerson * @Date:2018/3/27 14:37 * @version: * @purpose: * @Description: */ public class BookServiceImpl implements BookService{ }
7.看一下Controller 算了,再加一个吧
package com.soonperson.controller; import com.soonperson.service.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; /** * @Author:SoOnPerson * @Date:2018/3/27 14:44 * @version: * @purpose: * @Description: */ @Controller public class BookController { @Autowired private BookService bookService; @RequestMapping(value = "/bookList.do") public ModelAndView ShowBooks(ModelAndView modelAndView){ System.out.println("BookController!"); return modelAndView; } }
在用@Autowired的时候,应该会报错
改这里,加这个东西
8.再来建一个bookList.jsp显示一下子。
<%-- User: SoOnPerson Date: 2018/3/27 Time: 14:51 Description: --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> this is bookList.jsp! </body> </html>
9.来测试一下。喔~,不对,去index.jsp文件加一个链接
10.okok,来试试
点点点,第二个连接。。。bookList写错了,见谅。
进来了,okok。没有报错呢!
继续继续更新!
找到上面的BookMapper.xml文件,往里加一个查询语句。
请记住一号的值!!!!
现在去找BookMapper.java文件,在dao包里面
函数名就是刚刚的id,返回类型就是一个book的集合
然后去service里面找到不带impl后缀的bookservice
这个函数名应该没关系的,不过我一般都一样了。
再去找bookserviceimpl
是不是现在报错呢?
按快捷键:alt+insert
记得光标在函数里面闪烁
这个然后选上要实现的接口ok
新建一个类去管理事务
package com.soonperson.tool; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MybaitsGenerator { public static SqlSessionFactory sqlSessionFactory; static { InputStream inputStream = null; try{ inputStream = Resources.getResourceAsStream("orm/mybatis.xml"); }catch (IOException e){ e.printStackTrace(); } sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } public static SqlSessionFactory getSqlSessionFactory() { return sqlSessionFactory; } public static SqlSession getSession(boolean autoCommit){ return sqlSessionFactory.openSession(autoCommit); } public static <T> T getMapper(Class<T> var) { //获取mapper return getSession(true).getMapper(var); } }
回到bookserviceimpl
package com.soonperson.service; import com.soonperson.dao.BookMapper; import com.soonperson.po.Book; import com.soonperson.tool.MybaitsGenerator; import org.apache.ibatis.session.SqlSession; import java.util.List; /** * @Author:SoOnPerson * @Date:2018/3/27 14:37 * @version: * @purpose: * @Description: */ public class BookServiceImpl implements BookService{ public List<Book> getAllBookInfo() { /** * @Author:SoOnPerson * @param * @Date:2018/3/29 * @Time:15:56 * @Description:获取所有图书信息 * @return:java.util.List<com.soonperson.po.Book> * */ SqlSession sqlSession = MybaitsGenerator.getSession(false); BookMapper bookMapper = sqlSession.getMapper(BookMapper.class); List<Book> bookList = bookMapper.getAllBookInfo(); sqlSession.close(); return bookList; } }
到controller里面调用这个就可以了。
去bookcontroller
package com.soonperson.controller; import com.soonperson.po.Book; import com.soonperson.service.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import java.util.List; /** * @Author:SoOnPerson * @Date:2018/3/27 14:44 * @version: * @purpose: * @Description: */ @Controller public class BookController { @Autowired private BookService bookService; @RequestMapping(value = "/bookList.do") public ModelAndView ShowBooks(ModelAndView modelAndView){ /** * @Author:SoOnPerson * @param modelAndView * @Date:2018/3/29 * @Time:16:00 * @Description:获取所有图书信息给bookList.jsp * @return:org.springframework.web.servlet.ModelAndView * */ System.out.println("BookController!"); //获取出来所有的图书信息 List<Book> bookList = bookService.getAllBookInfo(); //传递给前端 modelAndView.addObject("AllBookInfo",bookList); return modelAndView; } }
去到bookList.jsp里面去展示这些信息呀!
用的是jstl 需要在最上面加上
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
然后使用标签库,最后是这样的
<%-- User: SoOnPerson Date: 2018/3/27 Time: 14:51 Description: --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>Title</title> </head> <body> this is bookList.jsp! <table border="1"> <c:forEach items="${requestScope.AllBookInfo}" var="book"> <tr> <td>${book.bookName}</td> <td>${book.bookType}</td> <td>${book.bookPrice}</td> </tr> </c:forEach> </table> </body> </html>
我们运行一下试试。
emmmmmm报错了,看不懂
看一下root cause 说的是错误 建立 sqlsession
这个错误可能存在在mapper/userMapper.xml.,错误解析mapper 配置,不能找到usermapper.xml
好像没有用到这个xml啊。可能复制代码的时候错了,哈哈
那我们去看看呗
这个地方的UserMapper.xml换成BookMapper.xml,尴尬
再来运行一次。
emmmmm,又报错了,解决啊
错误好像是成功发送一个数据给数据库,但是没返回啊,我们看看数据库,发现打不开,emmmm,好像没开服务啊
启动mysql服务
再来试一次
不错不错,进来了,没报错,但是怎么没东西呢
emmmmm数据库好像没数据啊
随便加几条数据,加的时候不要给id,因为是自增的
emmmm,再次运行结果还是和上面一样,看一下控制台
已经查询出来了,但是前提没有展示,看一下jsp
Book类中的变量名字和jsp中的不对应,还是复制错了,改一下book.后面的东西
运行还是有问题,思考一下,是不是因为映射的时候错了。
在controller里打印一下试试
也有获取到数据。。emmmmmm那就是jstl表达式问题了吧,百度一下
<%@ page isELIgnored="false" %>
我的要加这个东西,但是原来那个项目没有要加,这个的意思是是否忽略el表达式,如果是true就会显示标签不显示值,可能我的事默认为true了吧。
<%-- User: SoOnPerson Date: 2018/3/27 Time: 14:51 Description: --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> this is bookList.jsp! <table border="1"> <tr> <td>书名</td> <td>类型</td> <td>价格</td> </tr> <c:forEach items="${requestScope.list}" var="book" > <tr> <td>${book.name}</td> <td>${book.type}</td> <td>${book.price}</td> </tr> </c:forEach> </table> </body> </html>
结果如下
over,还会有后续开发的,,有什么想要的功能也可以和我说的,我看着学习一下