zoukankan      html  css  js  c++  java
  • Spring+SpringMVc+Mybatis实现数据库查询

    大家好,本篇博客小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 ('1', 'Java编程思想', 'Bruce Eckel', '2008-10-01', '机械工业出版社', '89.8', 'Thinkinjava.jpg', 'java经典著作');
    INSERT INTO `tb_book` VALUES ('2', '锋利的jquery', '单东林', '2012-12-08', '人民邮电出版社', '49', 'Fastjquery.jpg', 'juqery的权威书籍');
    INSERT INTO `tb_book` VALUES ('3', '深入Jvm虚拟机', '周志明', '2014-12-08', '机械工业出版社', '66', 'inTheJvm.jpg', 'Jvm方面的专业书籍');
    INSERT INTO `tb_book` VALUES ('4', '黑客与画家', 'Paul Graham', '2008-12-08', '人民邮电出版社', '49', 'BlackGuestAndPainter.jpg', '有趣并且很好看的一本书');
    INSERT INTO `tb_user` VALUES ('1', 'Yrion', '1234567', '王小贵', '17191182548', '北京市朝阳区');

    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

  • 相关阅读:
    如何获取url访问历史记录
    js跨域总结
    setAttribute的兼容性
    js中原生对象、内置对象和宿主对象(转)
    一道变态的js题
    如何判断js是否加载完全
    深入理解viewport(转)
    webapp之路--理解viewport的使用
    zepto学习之路--源代码提取
    js正则之零宽断言
  • 原文地址:https://www.cnblogs.com/wyq178/p/6815373.html
Copyright © 2011-2022 走看看