1. 程式人生 > >Spring+SpringMVc+Mybatis實現數據庫查詢

Spring+SpringMVc+Mybatis實現數據庫查詢

java代碼 格式 jdb web.xml配置 set ransac load idle name

大家好,本篇博客小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的代碼:

[email protected],[email protected],forName在這裏就代表著具體的請求,比如待會我們會有一個請求:BookApp/LoginForm,然後formName在這裏就代表著LoginForm,再經過視圖解析器解析,[email protected] 代表拿到路徑中的變量,就是舉的栗子中的LoginForm

@Controller
public class FormController{

    @RequestMapping(value="/{formName}")
     public String loginForm(@PathVariable String formName){
        // 動態跳轉頁面
        return formName;
    }

}
Controller
public class BookController {
    
    @Autowired
    @Qualifier("bookService")   [email protected]
    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") [email protected]
    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);[email protected]

}

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返回的字符串渲染成對應的頁面,其中包含路徑和後綴,指的是具體的格式

<!-- 自動掃描該包,[email protected]的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/1bA4tP0 密碼:fpeu

Spring+SpringMVc+Mybatis實現數據庫查詢