大家好,本篇博客小Y将会给大家带来一篇SSM框架实现数据查询的Demo,使用的数据库是Mysql,Server是TomCat.现在的SSM整合非常流行,因为springmvc的高效和mybatis的灵活、高效,给企业开发带来了很大的好处,大大节省了开发成本。好了,啰嗦了这么多,其实就想告诉大家ssm框架的优秀之处,那么开门见山,让我们开始本次的博客吧。

本篇博客的目录

1:SSM框架搭建环境

2:编写数据库sql,创建表

3:连接数据库

4:写java代码,分层

5:  写jsp页面

6:Spring的配置文件

7:springmvc的配置文件

8:web.xml配置

9:部署,实施

10:总结

一:SSM框架的环境搭建

1:所谓SSM,就是Spring、SpringMVC、mybatis.首先我们在myeclipse中创建一个java Web项目,然后在webRoot目录下的lib目录上添加上我们需要的jar包,其中很容易看出我们的ssm,ps:小Y当初找jar包也是使出洪荒之力,博客的尾部会奉上本次jar包的链接地址。

2:接下来我们就要创建数据库表了,打开我们的mysql,创建一个数据库works,然后写两张表,一张就是我们的user表,另一个是我们的book表,也就是我们需要在页面上展示的数据内容。如图,大概是这样一个目录结构(ps:我用的Navicat数据库工具),然后插入必要的数据

CREATE TABLE `tb_book` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(54) default NULL,
`author` varchar(54) default NULL,
`publicationdate` varchar(150) default NULL,
`publication` varchar(54) default NULL,
`price` double default NULL,
`image` varchar(54) default NULL,
`remark` varchar(600) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `tb_user` (
`id` int(11) NOT NULL auto_increment,
`loginname` varchar(50) default NULL,
`PASSWORD` varchar(18) default NULL,
`username` varchar(18) default NULL,
`phone` varchar(18) default NULL,
`address` varchar(255) default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `loginname` (`loginname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tb_book` VALUES ('', 'Java编程思想', 'Bruce Eckel', '2008-10-01', '机械工业出版社', '89.8', 'Thinkinjava.jpg', 'java经典著作');
INSERT INTO `tb_book` VALUES ('', '锋利的jquery', '单东林', '2012-12-08', '人民邮电出版社', '', 'Fastjquery.jpg', 'juqery的权威书籍');
INSERT INTO `tb_book` VALUES ('', '深入Jvm虚拟机', '周志明', '2014-12-08', '机械工业出版社', '', 'inTheJvm.jpg', 'Jvm方面的专业书籍');
INSERT INTO `tb_book` VALUES ('', '黑客与画家', 'Paul Graham', '2008-12-08', '人民邮电出版社', '', 'BlackGuestAndPainter.jpg', '有趣并且很好看的一本书');
INSERT INTO `tb_user` VALUES ('', 'Yrion', '', '王小贵', '', '北京市朝阳区');

3:创建好了数据库,接下来我们就需要写数据库配置文件了,proerties文件,写上我们连接数据库的属性,然后就可以把它托管给Spring去帮我们连接DB了,其中一定要注意大小写,如果大小写不对Spring就无法创建数据源,所以一定要注意大小写x3遍!

dataSource.driverClass=com.mysql.jdbc.Driver
dataSource.jdbcUrl=jdbc:mysql://127.0.0.1:3306/works
dataSource.user=root
dataSource.password=195631
dataSource.maxPoolSize=20
dataSource.maxIdleTime=1000
dataSource.minPoolSize=6
dataSource.initialPoolSize=5

4:写java文件,这里我们采用的是Springmvc的规范,就是控制层、业务层、数据库层、数据层,这样做的好处就是逻辑清楚,类之间分离,我们写代码也按照这样的逻辑出来的条理很清楚,万一出了错误也很容易排错,包的命名方式也按照这种方式。注意一点,我们为了程序之间的解耦,采用的是面向接口编程,从不以继承的方式去实现代码的复用,因为这样的耦合性太高,不利于扩展。大概的结构图如下:(ps:com.wyq是我本人的一个命名习惯,千万不要纠结这个),下面我们就来分析一下,各个层的代码:

4.1:首先我们来讲com.wyq.Bean层,这个是Bean层,也就是数据传输层,是具体的java对象,用来映射数据库的字段的,所以其也是很简单的Pojo

package com.wyq.Bean;

import java.util.Date;

public class Book {

    private int id;
private String name;
private String author;
private Date publicationDate;
private String publication;
private Double price;
private String image;
private String remark;
// 省略getter和setter方法
}

package com.wyq.Bean;

public class User{

private int id;
  private String loginname;
  private String password;
  private String username;
  private String phone;
  private String address;

//省略getter和setter方法
}

4.2:接下来看我们的控制层,所谓控制层就是用来控制作用的,就相当于Servlet,或者Struts2中的Action.控制层我们起名为Controller层,我们来一探Controller的代码:

首先使用@Controller注解表明这个类用来处理请求,然后@RequestMapping中的value属性映射具体的请求,forName在这里就代表着具体的请求,比如待会我们会有一个请求:BookApp/LoginForm,然后formName在这里就代表着LoginForm,再经过视图解析器解析,就会渲染成LoginForm.jsp文件。@PathVariable 代表拿到路径中的变量,就是举的栗子中的LoginForm

@Controller
public class FormController{ @RequestMapping(value="/{formName}")
public String loginForm(@PathVariable String formName){
// 动态跳转页面
return formName;
} }
Controller
public class BookController { @Autowired
@Qualifier("bookService") //这里使用@ualifier注解注入bookService业务层
private BookService bookService; @RequestMapping("/main") //处理main请求
public String main(Model model){ List<Book> books = bookService.getAll(); //调用业务层方法 model.addAttribute("books",books);//把从数据库取到的数据放入到model中 return "main";
} }
@Controller
public class UserController { //用户控制器 @Autowired
@Qualifier("userService")
private UserService userService; //注意业务层 @RequestMapping("/login") //处理login请求
public ModelAndView login(String loginname,String password,ModelAndView mv,HttpSession session){ User user = userService.login(loginname, password); //调用业务层方法返回一个实例对象 if (user!=null) { //判断查到的数据是否为空
//如果用户不为空,设在Session域中
session.setAttribute("user", user); mv.setView(new RedirectView("/BookApp/main")); //重定向到main页面中 }else { mv.addObject("message","登录名或者密码错误,请重新输入"); mv.setViewName("loginForm"); //重新设置view视图页面 } return mv; //返回视图
} }

4.3:接下里就是我们的Dao层了,也就是面向数据库的那一层,我们使用的持久层框架是mybatis,那么我们完全可以采用注解的方式,把sql以注解的方式写在代码上

public interface BookMapper {

    @Select("select * from tb_book") //用@Select注解sql语句
List<Book> findAll(); }
public interface UserMapper {

    @Select("select * from tb_user where loginname=#{loginname} and password=#{password}") //以#{}的方式表示sql中的参数
User finwithLoginnameAndPassword(@Param("loginname")String loginname,@Param("password")String password);//@param表示上面sql中的参数 }

4.4:接下来讲解我们的service层,也就是业务层,主要包含一个Dao层对象,定义一个业务方法,然后通过DB层去数据库查询,这里我们先定义一个接口

public interface BookService {

    List<Book> getAll();
}
public interface UserService {

    User login(String Loginname,String password);

}

4.4.1:定义实现业务层的接口实现类

@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT)  //表示数据库隔离级别为如果当前有就使用当前,如果没有就创建新的事务,
隔离级别为:读已提交,也就是数据在写入的时候是无法被读的,只有提交后才能让其他事务读取,防止数据库发生脏读 @Service("bookService") //表示service层
public class BookServiceImpl implements BookService{ @Autowired
private BookMapper bookMapper; //用AutoWired注入DB层 @Transactional(readOnly=true) //数据库的读取方式为:只读
@Override
public List<Book> getAll() { return bookMapper.findAll();
} }
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT)
@Service("userService")
public class UserServiceImpl implements UserService{ //表示service层 @Autowired
private UserMapper usermapper; @Transactional(readOnly=true)
public User login(String loginname, String password) { return usermapper.finwithLoginnameAndPassword(loginname, password);//调用DB层方法 } }

5:写jsp页面,也就是我们需要展示的数据:

5.1:loginForm.jsp页面,很简单的一个form表单,注意Action设置为login

<body>
<form action="login" method="post">
<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>
<font color="red">${requestScope.message}</font>
</form>
</body>

5.2:main.jsp页面,主要用了一c:foreach进行数据库数据的遍历,注意这里是从requestScope中取得数据的

欢迎${sessionScope.user.username}访问:
<br>
<table border="1">
<tr>
<th>封面</th>
<th>书名</th>
<th>作者</th>
<th>价格</th>
</tr>
<c:forEach items="${requestScope.books}" 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>

6:spring配置文件,之所以要写Spring配置文件,是因为我们要把组件交给Spring去管理,这其中组件包括数据库次c3po连接池、事务管理器等等

 <!-- mybatis:scan会将org.fkit.mapper包里的所有接口当作mapper配置,之后可以自动引入mapper类-->
<mybatis:scan base-package="com.wyq.Mapper" /> <!-- 扫描com.wyq包下面的java文件,有Spring的相关注解的类,则把这些类注册为Spring的bean -->
<context:component-scan base-package="com.wyq" /> <!-- 使用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>

7:Springmvc配置文件,这里主要配置的是视图解析器,主要的含义是我们刚才写的代码中的Controller返回的字符串渲染成对应的页面,其中包含路径和后缀,指的是具体的格式

<!-- 自动扫描该包,SpringMVC会将包下用了@controller注解的类注册为Spring的controller -->
<context:component-scan base-package="com.wyq.Controller" />
<!-- 设置默认配置方案 -->
<mvc:annotation-driven />
<!-- 使用默认的Servlet来响应静态文件比如css、html、js等文件 -->
<mvc:default-servlet-handler />
<!-- 视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix">
<value>/WEB-INF/pages/</value>
</property>
<!-- 后缀 -->
<property name="suffix">
<value>.jsp</value>
</property>
</bean>

8:配置web.xml文件,这其中包含监听器、servlet、过滤器等

<!-- 配置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>

9:部署在Tomcat服务器上,启动Tomcat,我们在浏览器上输入:http://localhost:8080/loginForm

我们再来试一下输入错误的登录名和密码,看看会出现什么情况:

10:总结,小Y把本篇博文就讲述到这里,为了清晰表达程序的运行步骤,索性我画了个图,这样展示会更加方便。

附本demo的下载地址:http://pan.baidu.com/s/1slPloML密码:px8i

Spring+SpringMVc+Mybatis实现数据库查询的更多相关文章

  1. Spring+SpringMVC+MyBatis+easyUI整合基础篇(八)mysql中文查询bug修复

    写在前面的话 在测试搜索时出现的问题,mysql通过中文查询条件搜索不出数据,但是英文和数字可以搜索到记录,中文无返回记录.本文就是写一下发现问题的过程及解决方法.此bug在第一个项目中点这里还存在, ...

  2. Spring+SpringMVC+MyBatis深入学习及搭建(六)——MyBatis关联查询

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6923464.html 前面有将到:Spring+SpringMVC+MyBatis深入学习及搭建(五)--动 ...

  3. Spring+SpringMVC+MyBatis深入学习及搭建(八)——MyBatis查询缓存

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6956206.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(七)——My ...

  4. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二)(代码篇)

    这篇是上一篇的延续: 用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 源代码在github上可以下载,地址:https://github.com/guoxia ...

  5. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一)

    梳理下使用spring+springMVC+mybatis 整合后的一个简单实例:输入用户的 ID,之后显示用户的信息(此次由于篇幅问题,会分几次进行说明,此次是工程的创建,逆向生成文件以及这个简单查 ...

  6. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(七)一次线上Mysql数据库崩溃事故的记录

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 文章简介 工作这几年,技术栈在不断更新,项目管理心得也增加了不少,写 ...

  7. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(八)线上Mysql数据库崩溃事故的原因和处理

    前文提要 承接前文<一次线上Mysql数据库崩溃事故的记录>,在文章中讲到了一次线上数据库崩溃的事件记录,建议两篇文章结合在一起看,不至于摸不着头脑. 由于时间原因,其中只讲了当时的一些经 ...

  8. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(三)(错误整理篇)

    使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二) 以上两篇已经把流 ...

  9. 基于Spring+SpringMVC+Mybatis的Web系统搭建

    系统搭建的配置大同小异,本文在前人的基础上做了些许的改动,重写数据库,增加依据权限的动态菜单的实现,也增加了后台返回json格式数据的配置,详细参见完整源码. 主要的后端架构:Spring+Sprin ...

随机推荐

  1. sublime-text-3设置输入中文方法

    sublime-text-3 编辑器性感而敏捷,却让人感慨有其长必有其短. 有些缺点都可以通过插件解决.但是要解决输入中文问题却很复杂,不能输入中文实在是太痛苦了. 我在做一个有很多文字的html页面 ...

  2. js中将yyyy-MM-dd格式的日期转换

    1.转换为yyyy年MM月dd日 var str = "2017-02-16"; var reg =/(\d{4})\-(\d{2})\-(\d{2})/; var date = ...

  3. 《C++之那些年踩过的坑(附录一)》

    C++之那些年踩过的坑(附录一) 作者:刘俊延(Alinshans) 本系列文章针对我在写C++代码的过程中,尤其是做自己的项目时,踩过的各种坑.以此作为给自己的警惕. [版权声明]转载请注明原文来自 ...

  4. Android -- 贝塞尔实现水波纹动画(划重点!!)

    1,昨天看到了一个挺好的ui效果,是使用贝塞尔曲线实现的,就和大家来分享分享,还有,在写博客的时候我经常会把自己在做某种效果时的一些问题给写出来,而不是像很多文章直接就给出了解决方法,这里给大家解释一 ...

  5. [转]Installing Memcached on Windows

    Installing Memcached on Windows 原文链接https://commaster.net/content/installing-memcached-windows   Sub ...

  6. Angular回到顶部按钮指令

    之前的分页代码指令化在线下测试没有问题,到服务器上就不运行了,所以那个先放一放. 今天来把"回到顶部"按钮指令化.首先是页面html: <!--回弹按钮--> < ...

  7. 基于swift MKMapkit 开发的地图定位导航

    //  DTOneViewController.swift //  Mapper-JSON // //  Created by kcl on 16/8/8. //  Copyright © 2016年 ...

  8. Python 基础之socket编程(二)

    Python 基础之socket编程(二) 昨天只是对socket编程做了简单的介绍,只是把socket通信的框架搭建起来,要对其中的功能进行进一步的扩充,就来看看今天的料哈! 一.基于tcp的套接字 ...

  9. poj1125 Stockbroker Grapevine Floyd

    题目链接:http://poj.org/problem?id=1125 主要是读懂题意 然后就很简单了 floyd算法的应用 代码: #include<iostream> #include ...

  10. Facade模式——设计模式学习(转载)

    Facade模式 一 意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二 动机 将一个系统划分成为若干个子系统有利于降低系统的复 ...