spring boot最新教程(十一):综合案例之整合mybatis

开发环境:jdk1.7    spring boot1.5.2    mybatis3.2.8   mysql5.6

uml类图如下所示:

pom配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.wx</groupId>
	<artifactId>SMMvcBoot</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
	</parent>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<!-- jsp支持,因为spring boot默认不支持jsp -->
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<scope>provided</scope>
		</dependency>
		<!-- Mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.2.8</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.2</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<!-- jstl标签库 -->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
		<!-- 阿里巴巴json解析包 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.1.15</version>
		</dependency>
		<!-- 阿里巴巴druid连接池 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.9</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>${project.artifactId}</finalName>
		<plugins>
			<!-- java编译插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<!-- 添加Spring boot的插件 -->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>

	</build>

</project>

sql脚本

/*
SQLyog Community v11.01 (32 bit)
MySQL - 5.5.23 : Database - schooldb
*********************************************************************
*/

CREATE DATABASE if not exists schooldb DEFAULT CHARACTER SET utf8;

USE schooldb;

DROP TABLE IF EXISTS account;

/*简单模拟银行转帐的帐户表*/
CREATE TABLE account
(
  userId INT PRIMARY KEY,
  userName VARCHAR(20) NOT NULL,
  balance FLOAT
)ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS department;

/*大学里的系表*/
CREATE TABLE department
(
    deptId SMALLINT PRIMARY KEY,
    departName VARCHAR(20) NOT NULL,
    address VARCHAR(20)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS student;

/*学生表*/
CREATE TABLE student
(
    stuId INT PRIMARY KEY AUTO_INCREMENT,
    stuName VARCHAR(20) NOT NULL,
    gender VARCHAR(2),
    age SMALLINT,
    address VARCHAR(200) DEFAULT '学生宿舍',
    deptIdd SMALLINT,
    FOREIGN KEY(deptIdd) REFERENCES department(deptId)
)AUTO_INCREMENT=100 ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS user;

/*用户表*/
CREATE TABLE USER
(
   userId INT PRIMARY KEY AUTO_INCREMENT,
   userName VARCHAR(20) NOT NULL,
   PASSWORD VARCHAR(20) NOT NULL,
   email VARCHAR(20)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;



/*插入测试数据*/
INSERT INTO account VALUES(100,'麻子',2000);
INSERT INTO account VALUES(101,'小丽',2000);

--
INSERT INTO USER(userName,PASSWORD,email) VALUES('jack','123','jack@qq.com');
INSERT INTO USER(userName,PASSWORD,email) VALUES('mike','123','mike@qq.com');
INSERT INTO USER(userName,PASSWORD,email) VALUES('麻子','123','mazi@qq.com');
INSERT INTO USER(userName,PASSWORD,email) VALUES('张三','123','zhangsna@qq.com');
INSERT INTO USER(userName,PASSWORD,email) VALUES('xiaoli','123','xiaoli@qq.com');
INSERT INTO USER(userName,PASSWORD,email) VALUES('songshu','123','songshu@qq.com');
INSERT INTO USER(userName,PASSWORD,email) VALUES('ggg','123','ggg@qq.com');

--
INSERT INTO department VALUES (10,'计算机系','计算机楼302');
INSERT INTO department VALUES (11,'艺术系','艺术楼211');
INSERT INTO department VALUES (12,'经管系','商学院911');
INSERT INTO department VALUES (13,'工程系','工程楼301');
INSERT INTO department VALUES (14,'土木系','建筑楼355');
--
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('王燕','女',18,DEFAULT,10);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('张栋','男',21,DEFAULT,10);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('李波','男',21,DEFAULT,11);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('陈建','男',19,DEFAULT,11);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('王江洪','男',25,DEFAULT,12);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('潘将','男',24,DEFAULT,13);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('张斌','男',22,DEFAULT,14);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('张斌','女',20,DEFAULT,10);
--
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('刘大海','男',28,DEFAULT,10);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('刘德华','男',31,DEFAULT,10);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('周润发','男',41,DEFAULT,11);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('张学友','男',37,DEFAULT,11);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('周星驰','男',42,DEFAULT,12);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('刘亦菲','女',24,DEFAULT,13);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('胡歌','男',32,DEFAULT,14);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('范冰冰','女',20,DEFAULT,10);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('杨幂','女',26,DEFAULT,14);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('刘涛','女',27,DEFAULT,13);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('周迅','女',21,DEFAULT,13);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('古力娜扎','女',19,DEFAULT,10);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('黑山老妖','妖',99,DEFAULT,12);

全局配置文件application.properties

server.port=8088
server.servlet-path=*.php
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp

#调整所有日志级别
logging.level.root=INFO
#调整spring日志级别
#logging.level.org.springframework=INFO

#配置ContextPath
server.context-path=/BOOTSM
#jsp,servlet修改后无需重新发布
server.jsp-servlet.init-parameters.development=true

启动类SmmvcApp

package com.wx.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@SpringBootApplication
public class SmmvcApp {
	public static void main(String[] args) {
        SpringApplication.run(SmmvcApp.class, args);
    }
}

整合mybatis

package com.wx.boot;

import java.io.IOException;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

@Configuration
@AutoConfigureAfter(DataSourceConfig.class)
public class MyBatisConfig {
	@Bean
    @ConditionalOnMissingBean //当容器里没有指定的Bean的情况下创建该对象
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        // 设置数据源
        sqlSessionFactoryBean.setDataSource(dataSource);
        // 设置mybatis的主配置文件
        ResourcePatternResolver resolver = 
        		new PathMatchingResourcePatternResolver();
        Resource mybatisConfigXml = resolver.getResource("classpath:configs/mybatis-config.xml");
        sqlSessionFactoryBean.setConfigLocation(mybatisConfigXml);
        //扫描mapper文件
        Resource[] resoures = null;
        try {
			resoures=resolver.getResources("classpath:com/wx/entitys/*.xml");
		} catch (IOException e) {
			e.printStackTrace();
		}
        //Resource[] resoures=new Resource[]{mybatisMapperXml};
        sqlSessionFactoryBean.setMapperLocations(resoures);
        return sqlSessionFactoryBean;
    }
	
	@Bean
	@ConditionalOnMissingBean
	public SqlSessionTemplate sqlTemplate(SqlSessionFactory sqlSessionFactory){
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

过滤器

package com.wx.boot;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebFilter(filterName="loginFilter",urlPatterns="/*"
   ,initParams={@WebInitParam(name="exclusions",
   value="BOOTSM/,.js,.gif,.jpg,.jpeg,.png,.css,.ico,Err404.html,Err500.html"
         +",Login.jsp,Login.php,Register.jsp,register.php,CheckUser.php,"
         +"ShowOneUser.jsp,ShowResult.jsp,Trans.php,ShowOneUser.php,quit.php")
        })
public class LoginFilter implements Filter{
	private String[] reqUrls;
	public void init(FilterConfig filterConfig) throws ServletException {
		String urlsStr=filterConfig.getInitParameter("exclusions");
		reqUrls=urlsStr.split(",");
	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request=(HttpServletRequest)arg0;
		HttpServletResponse response=(HttpServletResponse)arg1;
		HttpSession session=request.getSession();
		String url=request.getRequestURI();
		if(!url.startsWith("/BOOTSM")){
			url=url.substring(url.lastIndexOf("/")+1);
		}
		System.out.println("url==>"+url);
		boolean flag=false;
		for(int i=0;i<reqUrls.length;i++){
			url=url.toLowerCase();
			reqUrls[i]=reqUrls[i].toLowerCase();
			reqUrls[i]=reqUrls[i].trim();
			if(url.endsWith(reqUrls[i])){
				System.out.println("约定不拦截的请求直接放行==>"+url);
				flag=true;
				break;
			}
		}
		if(flag){
			chain.doFilter(arg0, arg1);//约定不拦截的请求直接放行
		}else{
			String userName=(String)session.getAttribute("userStr");
			if(userName!=null){
				chain.doFilter(arg0, arg1);//已经登录的请求放行
			}else{
				session.setAttribute("loginFlag", "no");
				response.sendRedirect("Login.jsp");
			}
		}
	}

	
	public void destroy() {
		System.out.println("过滤器销毁了...");
	}
}

配置扫描,配置页码错误处理

package com.wx.boot;

import java.nio.charset.Charset;

import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.web.servlet.ErrorPage;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.StringHttpMessageConverter;

@Configuration
@AutoConfigureAfter(MyBatisConfig.class)
@ComponentScan(basePackages = "com.wx.dao.*,com.wx.biz,com.wx.controler.*")
//默认扫面当前包,以支持过滤器,监听器,servlet
@ServletComponentScan
public class SpringConfig {
    //统一的编码配置,默认是utf-8,不配置也可以
	@Bean
	public StringHttpMessageConverter stringHttpMessageConverter() {
		StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
		return converter;
	}

	//统一页码处理配置
	@Bean
	public EmbeddedServletContainerCustomizer containerCustomizer() {
	    return new EmbeddedServletContainerCustomizer() {
	        @Override
	        public void customize(ConfigurableEmbeddedServletContainer container) {
	            ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/Err404.html");
	            ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/Err500.html");
	            container.addErrorPages( error404Page, error500Page);
	        }
	    };
	}
}

关键代码BaseDaoImpl.java

package com.wx.dao;

import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * 集合持久层的公用的增,删,改,查的父类
 * <T> 表示传入实体类
 * @author 汪祥
 * 2015-09-11
 */
public class BaseDaoImpl<T> implements IBaseDao<T> {
	
	@Autowired
	protected SqlSessionTemplate sqlTemplate;
	
	/**
	 * 获取传过来的泛型类名称
	 * @return String 泛型类名称的小写形式
	 */
	@SuppressWarnings("unchecked")
	public String getClassName() {
		// 在父类中得到子类声明的父类的泛型信息
		ParameterizedType pt = (ParameterizedType) this.getClass()
				.getGenericSuperclass();
		Class<T> clazz = (Class) pt.getActualTypeArguments()[0];
		// 这里是获取实体类的简单名称,再把类名转为小写
		String className=clazz.getSimpleName().toString().toLowerCase();
		System.out.println("className:"+className);
		return className;
	}

	/**
	 * 添加一条数据
	 * @param t 实体类的对象
	 * @return 添加的记录条数
	 */
	public Integer add(T t) {
		return sqlTemplate.insert(this.getClassName() + ".add", t);
	}

	/**
	 * 根据id删除记录
	 * @param id 对象编号
	 * @return 被删除的记录条数
	 */
	public Integer deleteById(String id) {
		return sqlTemplate.delete(this.getClassName() + ".deleteById", id);
	}

	/**
	 * 根据id查询一条记录
	 * @param id 对象编号
	 * @return 被修改的记录条数
	 */
	@SuppressWarnings("unchecked")
	public T getById(String id) {
		return (T)sqlTemplate.selectOne(this.getClassName() + ".getById", id);
	}

	/**
	 * 修改数据
	 * @param t 实体类的对象
	 * @return 被修改的记录条数
	 */
	public Integer modify(T t) {
		return sqlTemplate.update(this.getClassName() + ".update", t);
	}

	/**
	 * 查询多条记录
	 * @param t 实体类的对象
	 * @return 对象列表
	 */
	public List<T> queryMany(T t) {
		return sqlTemplate.selectList(this.getClassName() + ".queryMany", t);
	}
}

UserDaoImpl.java

package com.wx.dao.user;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.wx.dao.BaseDaoImpl;
import com.wx.entitys.UserEntity;

@Repository("userDao")
public class UserDaoImpl extends BaseDaoImpl<UserEntity> implements IUserDao {
	
	public boolean isLogin(UserEntity paramUser) {
		boolean flag=false;
		UserEntity theUser=sqlTemplate.selectOne("userentity.selectForLogin", paramUser);
		if(theUser!=null){
			flag=true;
		}
		return flag;
	}
	
	public boolean isUserExist(String userName) {
		boolean flag=false;
		List<UserEntity> userList=sqlTemplate.selectList("userentity.selectByName", userName);
		if(userList!=null && userList.size()>=1){
			flag=true;
		}
		return flag;
	}
}

关键代码之UserControl

package com.wx.controler.user;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.wx.biz.UserBiz;
import com.wx.entitys.UserEntity;

@Controller
public class UserControl{
	@Autowired
	private UserBiz userBiz;
	
	@RequestMapping(value="/Login.php",method=RequestMethod.POST)
	public ModelAndView login(HttpServletRequest request,HttpServletResponse response){
		HttpSession session=request.getSession();
		session.setMaxInactiveInterval(5*60);  //5分钟后session失效
		String userName=request.getParameter("userName");
		String passWord=request.getParameter("pwd");
		UserEntity user=new UserEntity(userName, passWord);
		ModelAndView mov=null;
		if(userBiz.isLogin(user)){
			session.setAttribute("userStr",userName);
			mov=new ModelAndView("redirect:QueryStu.php");
		}else{
			session.setAttribute("msg", "用户名或密码错误");
			mov=new ModelAndView("redirect:Login.jsp");
		}
		return mov;
	}
	@RequestMapping(value="/Register.php",method=RequestMethod.POST)
	public ModelAndView register(HttpServletRequest request,
			HttpServletResponse response,UserEntity user){
		ModelAndView mov=new ModelAndView("index");
		userBiz.save(user);
		return mov;
	}
	@RequestMapping(value="/Quit.php")
	public ModelAndView quit(HttpServletRequest request,HttpServletResponse response){
		HttpSession session=request.getSession();
		session.invalidate();
		ModelAndView mov=new ModelAndView("redirect:Login.jsp");
		return mov;
	}
	@RequestMapping(value="/ShowOneUser.php")
	public ModelAndView showOne(HttpServletRequest request,HttpServletResponse response){
		String userId=request.getParameter("userId");
		UserEntity user=userBiz.getById(userId);
		request.setAttribute("oneUser", user);
		ModelAndView mov=new ModelAndView("ShowOneUser");
		return mov;
	}
	@RequestMapping(value="/CheckUser.php")
	public void isUserExist(HttpServletRequest request,
			HttpServletResponse response) throws IOException{
		String userName=request.getParameter("userName");
		PrintWriter out=response.getWriter();
		String returnStr="err";
		if(!userBiz.isUserExist(userName)){
			returnStr="ok";
		}
		out.println(returnStr);
		out.flush();
		out.close();
	}
}

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御前两把刀刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值