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

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)錯誤登入的情況

  • 總結

整個專案執行步驟的流程圖。