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的代碼:
[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實現數據庫查詢