Spring+SpringMVc+Mybatis实现数据库查询

用SSM框架实现数据查询的一个Demo,使用的数据库是Mysql,Server是TomCat

  • SSM框架搭建环境

因为个人使用的是idea的,不同于该博主使用的myeclipse,导入jar包部分就省略了。(有需要的可以在文末找到原帖链接)

  • 创建数据库表

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

1、创建book表

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;

2、创建user表

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;

3、插入必要的数据

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', '有趣并且很好看的一本书');

4、操作完成后表的样式

  •  连接数据库

编写数据库的配置文件,即properties文件,添加连接数据库的属性,然后让Spring去帮我们连接数据库,其中一定要注意大小写,如果大小写不对Spring就无法创建数据源。

properties文件内容

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
  • 编写java代码(注意分层)

采用Springmvc的规范,就是控制层、业务层、数据库层、数据层。这样做的好处就是逻辑清楚,类之间分离。写代码按照这样的逻辑出来,条理会很清楚,万一出了错误也很容易排错,包的命名方式也按照这种方式。为了程序之间的解耦,采用的是面向接口编程,从不以继承的方式去实现代码的复用,因为这样的耦合性太高,不利于扩展。

大概的结构图如下:

1、首先讲com.wyq.Bean层,这个是Bean层,也就是数据传输层,是具体的java对象,用来映射数据库的字段的,所以其也是很简单的Pojo。其中,映射字段必需和数据库中的属性值相同,否则映射不了。

(1)book表的映射字段

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方法需要自己添加
}

(2)User表映射字段

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方法需要自己添加
}

2、接下来是控制层,所谓控制层就是用来控制作用的,就相当于Servlet,或者Struts2中的Action,控制层起名为Controller层。

举个例子:

@Controller
public class FormController{

    @RequestMapping(value="/{formName}")
     public String loginForm(@PathVariable String formName){
        // 动态跳转页面
        return formName;
    }

}

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

(1)BookController

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";        
    }

}

(2)UserController

@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; //返回视图
    }
    
}

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

(1)BookMapper

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

}

(2)UserMapper

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、接下来讲解service层,也就是业务层,主要包含一个Dao层对象,定义一个业务方法,然后通过DB层去数据库查询,这里先定义一个接口。

(1)BookService

public interface BookService {

    List<Book> getAll();
}

(2)UserService

public interface UserService {
    
    User login(String Loginname,String password);

}

继续定义实现业务层的接口实现类。

(1)BookServiceImpl

@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();
    }
    
}

(2)UserServiceImpl

@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层方法
        
    }
    
}
  • 编写JSP页面

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>

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>
  • 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>
  • 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>
  • 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>
  • 部署和实施

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

(1)正确登录的情况

(2)错误登录的情况

  • 总结

整个项目运行步骤的流程图。


转载自博客园: Spring+SpringMVc+Mybatis实现数据库查询 

猜你喜欢

转载自blog.csdn.net/Steriles_/article/details/81358553
今日推荐