Spring4整合Mybatis3

来源:互联网 发布:mac os 国外软件推荐 编辑:程序博客网 时间:2024/06/05 07:21

作为一个新手,看了Spring+Mybatis企业应用实战感觉讲的很清晰,所以准备把整合的过程都写上来,方便以后复习,和新手看。

开发环境:

jdk8

Eclipse

Tomcat8

MySql5以上

(我自己的是jdk1.7+MyEclipse2013+MySql5.5是正常的可用的) 

准备的包:(ps,我为了省事导入了所有的Spring包0 0)

Spring框架jar包(libs目录下所有模块class文件的jar包)与common-logging的jar包一共21个

Mybatis框架jar包 lib目录下所有jar包公13个

Mybatis整合Spring中间件jar包(因为Spring3中没有对Mybatis的支持,因此需要使用Mybatis社区自己开发的中间件 版本mybatis-spring-1.3.0.jar)

Spring的AOP事务jar包。

aspectj框架包。(aspectjrt.jar、aspectjtools.jar、aspectjweaver.jar和org.aspectj.matcher.jar)4个包

aop联盟jar包(aopalliance.jar)

数据库驱动jar包(mysql-connect-java-5.x.x,,书是5.1.30)

数据源c3p0所需jar包(c3p0-0.9.2.1.jar\hibernate-c3p0-4.3.5.Final.jar和mchange-commons-java-0.2.3.4.jar)3个包

jstl包(javax.servlet.jsp.jstl-1.2.1.jar,javax.servlet.jsp.jstl-api-1.2.1.jar).(以上可能有拼写问题)


1,创建数据库tb_user,tb_book(图形化界面软件navicat for mysql)

没有sql源码,表是自己建的,tb_book


tb_user


插入数据:


偷懒就随便写2条数据意思一下。。。

接下来,新建项目fkbookapp,导入所需要的jar包

db.properties(数据源参数,本来还有log4j的但是我看不懂,就没用,书也没有详细讲,知道的请解释下)

dataSource.driverClass=com.mysql.jdbc.DriverdataSource.jdbcUrl=jdbc:mysql://127.0.0.1:3306/mybatisdataSource.user=rootdataSource.password=rootdataSource.maxPoolSize=20dataSource.maxIdleTime = 1000dataSource.minPoolSize=6dataSource.initialPoolSize=5
Spring与Mybatis配置

applicationContent.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans             http://www.springframework.org/schema/beans/spring-beans-4.2.xsd            http://www.springframework.org/schema/context            http://www.springframework.org/schema/context/spring-context-4.2.xsd            http://www.springframework.org/schema/mvc            http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd            http://www.springframework.org/schema/tx            http://www.springframework.org/schema/tx/spring-tx-4.1.xsd            http://mybatis.org/schema/mybatis-spring             http://mybatis.org/schema/mybatis-spring.xsd ">       <!-- mybatis:scan会将org.fkit.mapper包里的所有接口当作mapper配置,之后可以自动引入mapper类-->      <mybatis:scan base-package="org.fkit.mapper"/>           <!-- 扫描org.fkit包下面的java文件,有Spring的相关注解的类,则把这些类注册为Spring的bean -->    <context:component-scan base-package="org.fkit"/>    <!-- 使用PropertyOverrideConfigurer后处理器加载数据源参数 --><context:property-override location="classpath:db.properties"/><!-- 配置c3p0数据源 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"/><!-- 配置SqlSessionFactory,org.mybatis.spring.SqlSessionFactoryBean是Mybatis社区开发用于整合Spring的bean --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"    p:dataSource-ref="dataSource"/><!-- JDBC事务管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"/><!-- 启用支持annotation注解方式事务管理 --><tx:annotation-driven transaction-manager="transactionManager"/></beans>

springmvc-config.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:mvc="http://www.springframework.org/schema/mvc"    xmlns:context="http://www.springframework.org/schema/context"    xsi:schemaLocation="        http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd        http://www.springframework.org/schema/mvc        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd             http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context-4.2.xsd">            <!-- 自动扫描该包,SpringMVC会将包下用了@controller注解的类注册为Spring的controller -->    <context:component-scan base-package="org.fkit.controller"/>    <!-- 设置默认配置方案 -->    <mvc:annotation-driven/>    <!-- 使用默认的Servlet来响应静态文件 -->    <mvc:default-servlet-handler/>    <!-- 视图解析器  -->     <bean id="viewResolver"          class="org.springframework.web.servlet.view.InternalResourceViewResolver">         <!-- 前缀 -->        <property name="prefix">            <value>/WEB-INF/content/</value>        </property>        <!-- 后缀 -->        <property name="suffix">            <value>.jsp</value>        </property>    </bean>    </beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><!-- 配置spring核心监听器,默认会以 /WEB-INF/applicationContext.xml作为配置文件 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- contextConfigLocation参数用来指定Spring的配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext*.xml</param-value></context-param><!-- 定义Spring MVC的前端控制器 -->  <servlet>    <servlet-name>springmvc</servlet-name>    <servlet-class>        org.springframework.web.servlet.DispatcherServlet    </servlet-class>    <init-param>      <param-name>contextConfigLocation</param-name>      <param-value>/WEB-INF/springmvc-config.xml</param-value>    </init-param>    <load-on-startup>1</load-on-startup>  </servlet>    <!-- 让Spring MVC的前端控制器拦截所有请求 -->  <servlet-mapping>    <servlet-name>springmvc</servlet-name>    <url-pattern>/</url-pattern>  </servlet-mapping>    <!-- 编码过滤器 -->  <filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param> </filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>

持久层

路径fkbookapp/src/org/fkit/domain


User.java

package org.fkit.domain;import java.io.Serializable;/** * CREATE TABLE tb_user(id INT PRIMARY KEY AUTO_INCREMENT,      #idloginname VARCHAR(50) UNIQUE,#登录名 邮箱PASSWORD VARCHAR(18),#密码username VARCHAR(18),#用户名phone VARCHAR(18),#电话address VARCHAR(255)#地址); * */public class User implements Serializable{/** *  */private static final long serialVersionUID = 1L;private Integer id;// idprivate String loginname;// 登录名private String password;// 密码private String username;// 用户名private String phone;// 电话private String address;// 地址public User() {super();// TODO Auto-generated constructor stub}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getLoginname() {return loginname;}public void setLoginname(String loginname) {this.loginname = loginname;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User [id=" + id + ", loginname=" + loginname + ", password="+ password + ", username=" + username + ", phone=" + phone+ ", address=" + address + "]";}}

Book.java

package org.fkit.domain;import java.io.Serializable;import java.util.Date;/** * CREATE TABLE tb_book (id INT (11) PRIMARY KEY AUTO_INCREMENT,name VARCHAR (54),author VARCHAR (54),publicationdate DATE ,publication VARCHAR (150),price DOUBLE ,image VARCHAR (54),remark VARCHAR (600)); * */public class Book implements Serializable{/** *  */private static final long serialVersionUID = -2879132317915456324L;private Integer id;// idprivate String name;// 书名private String author;// 作者private String publication;// 出版社private Date publicationdate;// 出版日期private Double price;// 价格private String image;// 封面图片private String remark;// 详细描述public Book() {super();// TODO Auto-generated constructor stub}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getPublication() {return publication;}public void setPublication(String publication) {this.publication = publication;}public Date getPublicationdate() {return publicationdate;}public void setPublicationdate(Date publicationdate) {this.publicationdate = publicationdate;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}public String getImage() {return image;}public void setImage(String image) {this.image = image;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}@Overridepublic String toString() {return "Book [id=" + id + ", name=" + name + ", author=" + author+ ", publication=" + publication + ", publicationdate="+ publicationdate + ", price=" + price + ", image=" + image+ ", remark=" + remark + "]";}}

org.fkit.mapper包mapper接口

UserMapper.java

package org.fkit.mapper;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Select;import org.fkit.domain.User;/** * UserMapper接口 * */public interface UserMapper {/** * 根据登录名和密码查询用户 * @param String loginname * @param String password * @return 找到返回User对象,没有找到返回null * */@Select("select * from tb_user where loginname = #{loginname} and password = #{password}")User findWithLoginnameAndPassword(@Param("loginname")String loginname,@Param("password") String password);}
BookMapper.java

package org.fkit.mapper;import java.util.List;import org.apache.ibatis.annotations.Select;import org.fkit.domain.Book;/** * BookMapper接口 * */public interface BookMapper {/** * 查询所有图书 * @return 图书对象集合 * */@Select(" select * from tb_book ")List<Book> findAll();}
持久层包括数据库映射的User和Book两个javabean对象,并使用Mybatis注解映射SQL语句。

服务层功能实现

路径

service包(服务层接口)

UserService.java

package org.fkit.service;import org.fkit.domain.User;/** * User服务层接口 * */public interface UserService {/** * 判断用户登录 * @param String loginname * @param String password * @return 找到返回User对象,没有找到返回null * */User login(String loginname,String password);}

BookService.java

package org.fkit.service;import java.util.List;import org.fkit.domain.Book;/** * Book服务层接口 * */public interface BookService {/** * 查找所有图书 * @return Book对象集合 * */List<Book> getAll();}

服务层实现具体类包------service.Imp

BookServiceImpl.java

package org.fkit.service.impl;import java.util.List;import org.fkit.domain.Book;import org.fkit.mapper.BookMapper;import org.fkit.service.BookService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Isolation;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;/** * Book服务层接口实现类 * @Service("bookService")用于将当前类注释为一个Spring的bean,名为bookService * */@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT)@Service("bookService")public class BookServiceImpl implements BookService {/** * 自动注入BookMapper * */@Autowiredprivate BookMapper bookMapper;/** * BookService接口getAll方法实现 * @see { BookService } * */@Transactional(readOnly=true)@Overridepublic List<Book> getAll() {return bookMapper.findAll();}}
UserServiceImpl.java

package org.fkit.service.impl;import org.fkit.domain.User;import org.fkit.mapper.UserMapper;import org.fkit.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Isolation;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;/** * User服务层接口实现类 * @Service("userService")用于将当前类注释为一个Spring的bean,名为userService * */@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT)@Service("userService")public class UserServiceImpl implements UserService {/** * 自动注入UserMapper * */@Autowiredprivate UserMapper userMapper;/** * UserService接口login方法实现 * @see { UserService } * */@Transactional(readOnly=true)@Overridepublic User login(String loginname, String password) {return userMapper.findWithLoginnameAndPassword(loginname, password);}}

服务层使用Spring的@Autowired注解自动注入持久层的Mapper对象,并且使用@Service注解将类注解成为Spring的Bean.

控制层实现

子包controller

UserController.java

package org.fkit.controller;import javax.servlet.http.HttpSession;import org.fkit.domain.User;import org.fkit.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.view.RedirectView;/** * 处理用户请求控制器 * */@Controllerpublic class UserController {/** * 自动注入UserService * */@Autowired@Qualifier("userService")private UserService userService;/** * 处理/login请求 * */@RequestMapping(value="/login") public ModelAndView login( String loginname,String password, ModelAndView mv, HttpSession session){// 根据登录名和密码查找用户,判断用户登录User user = userService.login(loginname, password);if(user != null){// 登录成功,将user对象设置到HttpSession作用范围域session.setAttribute("user", user);// 转发到main请求mv.setView(new RedirectView("/fkbookapp/main"));}else{// 登录失败,设置失败提示信息,并跳转到登录页面mv.addObject("message", "登录名或密码错误,请重新输入!");mv.setViewName("loginForm");}return mv;}}

FormController.java(动态页面跳转控制器)

package org.fkit.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;/**    * @Description:  * <br>网站:<a href="http://www.fkit.org">疯狂Java</a>  * @author 肖文吉36750064@qq.com    * @version V1.0    *//** * 动态页面跳转控制器 * */@Controllerpublic class FormController{@RequestMapping(value="/{formName}") public String loginForm(@PathVariable String formName){// 动态跳转页面return formName;}}

BookController.java


package org.fkit.controller;import java.util.List;import org.fkit.domain.Book;import org.fkit.service.BookService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;/** * 处理图书请求控制器 * */@Controllerpublic class BookController {/** * 自动注入BookService * */@Autowired@Qualifier("bookService")private BookService bookService;/** * 处理/main请求 * */@RequestMapping(value="/main") public String main(Model model){// 获得所有图书集合List<Book> book_list = bookService.getAll();// 将图书集合添加到model当中model.addAttribute("book_list", book_list);// 跳转到main页面return "main";}}

@Qualifier注解用于指明需要注入的具体类型

jsp页面

路径

WEB—INF/content/loginForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>登录页面</title></head><body><h3>登录页面</h3><form action="login" method="post"><font color="red">${requestScope.message }</font>     <table>         <tr>         <td><label>登录名: </label></td>             <td><input type="text" id="loginname" name="loginname" ></td>         </tr>         <tr>         <td><label>密码: </label></td>             <td><input type="password" id="password" name="password" ></td>         </tr>         <tr>             <td><input type="submit" value="登录"></td>         </tr>     </table></form></body></html>

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>首页</title><style type="text/css">table{border-collapse:collapse;border-spacing:0;border-left:1px solid #888;border-top:1px solid #888;background:#efefef;}th,td{border-right:1px solid #888;border-bottom:1px solid #888;padding:5px 15px;}th{font-weight:bold;background:#ccc;}</style></head><body>欢迎[${sessionScope.user.username }]访问<br><table border="1"><tr><th>封面</th><th>书名</th><th>作者</th><th>价格</th></tr><c:forEach items="${requestScope.book_list }" var="book"><tr><td><img src="images/${book.image }" height="60"></td><td>${book.name }</td><td>${book.author }</td><td>${book.price }</td></tr></c:forEach></table></body></html>

loginFom.jsp是一个登陆表单,输入jack 密码123456 点击登陆 UserController获得请求,验证成功,请求将被转发到BookController的main方法,然后跳转到main.jsp


浏览器输入:localhost/fkbookapp/loginForm(本机的tomcat端口改为80)









以上仅作为自己熟悉流程的一个记录。

不知道怎么放文件,不过基本源码都有了,sql本来就没有。。