项目整合
- 需求分析
- 建立数据库
- 创建Maven项目
- 导入依赖
- 建立基本结构和框架
- 编写前端页面,提供需求
- Controller层拿到需求,解决并返回处理结果
导入依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!-- Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
</dependencies>
<!-- 解决资源过滤-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
建立基本结构
-
实例类
-
mapper接口
-
实现mapper的xml配置文件,编写QL语句
-
Servlce业务逻辑层
-
编写mapper层的配置文件(创建数据源,创建工厂,将mapper注册到spring容器中,编写扫描包-注释支持)
<!-- 关联数据库配置文件--> <context:property-placeholder location="classpath:database.properties"/> <!-- 连接池 dbcp: 半自动化操作,不能自动连接 c3p0: 自动化操作(字动化加载配置文件,并且可以自动设置到对象中!) druid: hikari: --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!-- c3p0连接池的私有属性 --> <property name="maxPoolSize" value="30"/> <property name="minPoolSize" value="10"/> <!-- 关闭连接后不自动commit --> <property name="autoCommitOnClose" value="false"/> <!-- 获取连接超时时间 --> <property name="checkoutTimeout" value="10000"/> <!-- 当获取连接失败重试次数 --> <property name="acquireRetryAttempts" value="2"/> </bean> <!-- SqlSessionFactory--> <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <!-- 配置mapper接口扫描包,动态实现/Mapper接口可以注入到Spring容器中--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 注入sqlSessionFactory--> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <!-- 扫描要扫描的包--> <property name="basePackage" value="com.bdqn.mapper"/> </bean>
-
编写Servlce层得配置文件(设置扫描包,把mapper注入到Serlvce私有对象中,目的:让业务逻辑层有可以调用mapper层的方法权利!还有事务)
<!-- 扫描包--> <context:component-scan base-package="com.bdqn.servlce"/> <!-- 将我们的所有业务类注入到spring 可通过配置和注解--> <bean class="com.bdqn.servlce.BookServlceimpl" id="bookServlceimpl"> <property name="bookMapper" ref="bookMapper"/> </bean> <!-- 声明式事务--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- 给哪些方法配置事务--> <!-- 配置事务的传播特性--> <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!-- AOP横切事务--> <aop:config> <aop:pointcut id="txPointcut" expression="execution(* com.bdqn.mapper.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/> </aop:config>
-
编写Spring-mvc层配置文件(编写扫描包,设置视图解析器)
<mvc:annotation-driven/> <mvc:default-servlet-handler/> <context:component-scan base-package="com.bdqn.controller"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
-
appliactionContext.xml(让三个层的配置文件链接到一起)
<import resource="classpath:spring-dao.xml"/> <import resource="classpath:spring-servlce.xml"/> <import resource="classpath:spring-mvc.xml"/>
-
在WEB-INF包下创建页面提供需求(增删改查)
<title>书籍展示</title> <!-- 引入 Bootstrap --> <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container"> <div class="row clearfix"> <div class="clo.md-12 column"> <div class="page-header"> <h1><small>书籍列表------显示所有书籍</small></h1> </div> </div> <div class="row"> <div class="col-md-4 column"> <a class="btn btn-primary" href="${pageContext.request.contextPath}/book/toAddBook">新增书籍</a> </div> <div class="col-md-8 column" style="float: right;"> <form method="post" action="${pageContext.request.contextPath}/book/selBook" class="form-inline" style="float: right"> <span>${error}</span> <input type="text" name="queryBookName" class="form-control" placeholder="请输入要查询的书籍"> <input type="submit" value="查询" class="btn btn-primary"> </form> </div> </div> </div> <div class="row clearfix"> <div class="col-md-12 column"> <table class="table table-hover table-striped"> <thead> <tr> <th>书籍编号</th> <th>书籍名称</th> <th>书籍数量</th> <th>书籍详情</th> <th>操 作</th> </tr> </thead> <%-- 书籍从数据库中查询出来--%> <tbody> <c:forEach var="book" items="${books}"> <tr> <td>${book.bookID}</td> <td>${book.bookName}</td> <td>${book.bookCounts}</td> <td>${book.detail}</td> <td> <a href="${pageContext.request.contextPath}/book/toUpdBook/${book.bookID}">修改</a> | <a href="${pageContext.request.contextPath}/book/delBook/${book.bookID}" onClick="return confirm('确定提交?');">删除</a> </td> </tr> </c:forEach> </tbody> </table> </div> </div> </div> </body> </html>
-
创建controller层(处理前端的需求,处理后把结果传到Model,创建业务层对象,通过调用业务层,业务层再从mapper层找到相应的SQL语句)
@Autowired @Qualifier("bookServlceimpl") private BookServlce bookServlce; // 查询全部并返回一个数据显示页面 @RequestMapping("/allBook") public String list(Model model){ List<Books> books = bookServlce.queryAllBook(); model.addAttribute("books",books); return "allBook"; }
项目结构图
Bootstrap中文官网:https://v3.bootcss.com/css/#overview
Bootstrap可视化系统:http://www.ibootstrap.cn/
分页查询
-
导入依赖
<!--分页插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.2.0</version> </dependency>
-
配置分页拦截器件
<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="mysql"/> </plugin> </plugins>
-
在Controller中查询全部中使用分页(在)
@RequestMapping("/allBook/{num}/{size}") public String list(@PathVariable int num,@PathVariable int size,Model model){ PageHelper.startPage(num,size); * List<Books> books = bookServlce.queryAllBook(); PageInfo<Books> info = new PageInfo<Books>(books); * model.addAttribute("books",info); return "allBook"; }
-
修改增删改中return的地址,因为路径发生了改变
return "redirect:/book/allBook/1/4";
-
查询一本书功能也需要把查询出来的结果用分页形式展出
// 查询一本书 @RequestMapping("/selBook") public String delBook(Model model,String queryBookName){ // 执行单个查询 Books book = bookServlce.selNameBook(queryBookName); // 设置起始页和行数 PageHelper.startPage(1,4); // 创建集合,把查询出来的结果放到集合中 List<Books> booksList = new ArrayList<Books>(); booksList.add(book); // 判断是否为空,为空代表没有查出结果,则执行查询全部操作 if (book == null){ // 给前端提示信息,没有查询到结果 model.addAttribute("error","未查到"); // 查询全部,返回到集合中 booksList = bookServlce.queryAllBook(); } // 把要用分页展示的集合放入PageInfo中,就会按照之前设置好的页数分割1/4 PageInfo<Books> info = new PageInfo<Books>(booksList); // 将PageInfo对象放到Model中 model.addAttribute("books",info); // 返回allBook页面 return "allBook";
-
在前端设置上下页
<!--books.list 分页集合中调用list类型的集合,--> 当前页面:${books.pageNum} <a href="${pageContext.request.contextPath}/book/allBook/${books.pageNum-1}/4">上一页</a> <a href="${pageContext.request.contextPath}/book/allBook/${books.pageNum+1}/4">下一页</a> 共${books.pages}页