從零開始學JAVA(09)-使用SpringMVC4 + Mybatis + MySql 例子(注解方式開發)


項目需要,繼續學習springmvc,這里加入Mybatis對數據庫的訪問,並寫下一個簡單的例子便於以后學習,希望對看的人有幫助。上一篇被移出博客主頁,這一篇努力排版整齊,更原創,希望不要再被移出主頁了。

原創文章,后面附上源碼,轉載請注明出處http://www.cnblogs.com/lin557/p/6179618.html  

一、運行環境

  1. Eclipse Neon.1a Release (4.6.1) 官網下載
  2. mysql-5.7.16-winx64(http://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.16-winx64.zip)
  3. mybatis 3.4.1(https://github.com/mybatis/mybatis-3/releases)
  4. springmvc 4.3.4
  5. Tomcat 8.5.8
  6. mysql的連接驅動 mysql-connector-java-5.1.40-bin.jar

  關於mybatis的jar包,需要其他依賴包(如log4、cglib等),使用時一定要把這些依賴包一起加入工程中,不要只加入mybatis-3.4.1,不然是跑不起來的。

  關於jar包的下載,如果找不到,可以在這里查找下載,http://mvnrepository.com/

二、新建工程

  這里用的是Eclipse,為了便於以后可以導入MyEclipse,新建工程時一些路徑需要做下修改,當然,不改也是可以正常運行的(網上老師教的)。

  1. 默認的class輸出目錄:build\classes 修改為 WebRoot\WEB-INF\classes
  2. context目錄:WebContent 修改為 WebRoot

  下面新建工程,新手可以看,高手可以跳過。

  菜單中File-New-Dynamic Web Project,如下圖:

  

  修改Default output folder

  

  修改Context directory 並勾選 Generate web.xml deployment descriptor

  

三、工程目錄結構

  1. 復印制相關的jar包到WebRoot\WEB-INF\lib目錄下
  2. 新建4個包 com.web.controller (存放spring的controller) com.web.service (業務類的接口與實現類) com.web.mapper (存放mybatis的映射類與映射文件) com.web.po (mapper相關的pojo)
  3. 新建db.properties(jdbc連接數據庫的參數),log4j.properties(log4j日志參數),mybatis-config.xml(mybatis配置文件),springmvc-servlet.xml(spring DispatcherServlet的配置文件),放在src文件夾中
  4. WebRoot下新建一個static文件夾,用於存放靜態文件,如.css/.jpg/.json等
  5. WebRoot\WEB-INF\下新建jsp文件夾,用於存入視圖文件(在這里就是jsp文件)

  目錄結構如下圖:

   

 四、mysql數據庫的相關(安裝、建庫、建表等這里就不說了,數據庫默認字符集為utf-8,我用的是navicat這個工具操作mysql的)

  1. 新建庫,庫名為dsp
  2. 新建表,表名為t_user,表結構

  3. 表t_user中的有兩行數據

五、各個文件的代碼如下:

  db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/dsp?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456

  log4j.properties

log4j.rootLogger = debug,stdout

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

  web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
    id="WebApp_ID" 
    version="3.1">
    
    <!-- 名稱隨便 -->
    <display-name>mvc mybatis</display-name>

    <!-- 指定servlet -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>  
                <param-name>contextConfigLocation</param-name>  
                <param-value>classpath*:springmvc-servlet.xml</param-value>
             </init-param>  
        <load-on-startup>1</load-on-startup>
    </servlet>
  
    <!-- 使用restful風格,所以這里用/ -->
    <servlet-mapping>
       <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
            
</web-app>

  springmvc-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 
        http://www.springframework.org/schema/tx  
        http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.0.xsd">
        
    <!-- 指定從配置文件中加載數據庫連接信息 -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>classpath:db.properties</value>
        </property>
        <property name="fileEncoding">
            <value>UTF-8</value>
        </property>
    </bean>
    
    <!-- 配置數據源 也可以用dbcp、c3p0數據庫連接池等,這里使用Spring默認的 -->
    <!--  
                使用連接池可以提高訪問性能,這里可以加入dbcp或c3p0的jar包,並修改class實現
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource.class">
    -->        
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
       
    <!-- 配置sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 加載mybatis-config.xml文件 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
        <!-- 數據源 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean> 
   
    <!-- 掃描包中的mapper類 注意這里使用了sqlSessionFactoryBeanName -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.web.mapper"></property>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>
    
    
    <!-- 對靜態資源文件的訪問  -->    
    <mvc:resources mapping="/static/**" location="/static/" cache-period="31556926"/>
    
    <!-- 啟用最新的注解解析器、映射器  -->
    <!-- Spring默認情況下使用的是一些舊版本注解解析器、映射器、轉換器等 -->
    <mvc:annotation-driven/>    
    
    <!-- 掃描包中所有@Controller注解的類 -->     
    <context:component-scan base-package="com.web.controller" />
    <!-- 掃描包中所有@Service注解的類 -->
    <context:component-scan base-package="com.web.service" />
    
    <!-- 配置視圖解析器 -->
    <!--
        prefix和suffix:查找視圖頁面的前綴和后綴(前綴[邏輯視圖名]后綴),
               比如傳進來的邏輯視圖名為WEB-INF/jsp/hello,則該該jsp視圖頁面應該存放在“WEB-INF/jsp/hello.jsp”; 
    -->          
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/jsp/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
        
</beans>

  mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"   
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>      
    
    <!-- 加載Mapper映射文件 -->
    <mappers>
        <!-- 空着就行,由spring配置加載 -->
    </mappers>
</configuration>

  com.web.controller 包中的 HelloController.java

package com.web.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.web.po.User;
import com.web.service.UserService;

@Controller
public class HelloController {
    
    @Autowired
    private UserService userService;
    
    // 建議方法名與url一樣,方便維護
    @RequestMapping("/hello") 
    public String hello(@RequestParam(value = "id", required = false, defaultValue = "1") int id,                        
                Model model) throws Exception {                  
            
            // 通過客戶端傳送過來的id獲取user數據
            User user = userService.getUserById(id);
            
            if (user == null) {
                user = new User();
                user.setName("查無記錄");
            }
            
            String myhtml = "<div><p>這是html文本。</p><p>紅色字體表明css樣式文件成功加載。</p><p>這說明jsp上的數據可以由后台控制並顯示</P></div><p></P>";
            // 在jsp文件中,可以通過${myhtml}得到myhtml的內容
            model.addAttribute("myhtml", myhtml);
            
            
            model.addAttribute("name", user.getName());            
            
            // 這里去WEB-INF/jsp 中找hello.jsp;因為springmvc-servlet.xml中配置了前綴與后綴,
            // 所以,hello = WEB-INF/jsp/hello.jsp
            return "hello";
    }
}

  com.web.mapper包中的UserMapper.java

package com.web.mapper;

import java.util.List;

import com.web.po.User;
/**
 * 
 * @author Lin
 * user表的數據接口
 * mybatis使用mapper代理方式開發時,需要一個接口文件與一個mapper映射文件,並且兩個文件名稱要相同
 * 這里使用的是UserMapper.java與UserMapper.XML
 */
public interface UserMapper {

    // 獲取整個表的數據
    public List<User> getAll() throws Exception;
    
    // 通過表id獲取表的數據
    public User getUserById(int id) throws Exception;
}

  com.web.mapper包中的UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"   
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
<!--
    id與對應接口的某個對應的方法名一致
    mybatic還有其他標簽(如<inert><delete>等),找本書慢慢學
-->
<mapper namespace="com.web.mapper.UserMapper">

    <select id="getdAll" resultType="com.web.po.User"> 
        select * from t_user
    </select>
    
    <select id="getUserById" parameterType="int" resultType="com.web.po.User"> 
        select * from t_user where id=#{id}
    </select>    

</mapper>

  com.web.po包中的User.java

package com.web.po;

public class User {
    
    private int id;
    private String gid;
    private String name;
    private String pw;
    
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public String getGid() {
        return gid;
    }
    
    public void setGid(String gid) {
        this.gid = gid;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getPw() {
        return pw;
    }
    
    public void setPw(String pw) {
        this.pw = pw;
    }

}

  com.web.service包中的UserService.java

package com.web.service;

import java.util.List;

import com.web.po.User;

public interface UserService {
    
    // 這里類的接口不需要與UserMapper相同,可以根據業務需要自行定義
    
    // 獲取整個表的數據
    public List<User> getAll() throws Exception;
    
    // 通過表id獲取表的數據
    public User getUserById(int id) throws Exception;

}

  com.web.service包中的UserServiceImpl.java   注意@Service是寫在這個類里的

package com.web.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.web.mapper.UserMapper;
import com.web.po.User;

/**
 * 
 * @author Lin
 * @Service 注解 表此類是一個服務,服務一般由一個接口與一個接口實現類組成
 * 非注解方式開發,還需要spring的xml中配置才能使用,此處用的是注解方式,不需要額外配置
 */

@Service
public class UserServiceImpl implements UserService {

    // 注入msbatis數據庫訪問接口
    @Autowired
    private UserMapper userMapper;
    
    @Override
    public List<User> getAll() throws Exception {
        // TODO Auto-generated method stub
        // 這里不寫了 如果想在jsp中顯示list,可以引入jstl標簽進行操作顯示,記得加入jstl的包 jstl-1.2.jar
        return null;
    }

    @Override
    public User getUserById(int id) throws Exception {
        // TODO Auto-generated method stub
        
        // 通過userMapper獲取數據
        User user = userMapper.getUserById(id);        
        return user;
    }

}

  WebRoot下static中的Style.css

body {
    font-size: 36px;
    color: #FF0000;
}

  WebRoot下WEB-INF\jsp中的hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 這里指定css樣式,是為了檢查配置的靜態文件的訪問是否成功 -->
<link rel="Stylesheet" type="text/css" href="static/style.css" />
<title>SpringMVC + Mybatic</title>
</head>
<body>
${myhtml}

hello,${name}
</body>
</html>

以上是整個工程,如果成功運行后,是這樣的,頁面中除了“hello,”外,其它數據都是從后台或數據庫中加載的

 

六、附上源碼 下載地址: http://files.cnblogs.com/files/lin557/mvc_mybatis.zip  空間有限,lib中的jar包就不上傳了,自行下載放到lib中。

 

回復二樓,lib列表如下:

 

 

by lin 2016-12-14

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM