springMVC+springJDBC+Msql註解模式

最近基於Spring4.X以上的版本寫了一個springMVC+springJDBC+Msql註解模式的一個項目,之中也遇到過不少問題 ,爲了防止之後遇到一樣問題現記錄一下知識點以及詳細配置。css

首先我是基於Spring Tool Suite 工具作開發,此工具和Eclipse工具區別不大,只是Sping在Eclipse上作了封裝,更利於作Spring開發。如下是開發工具的圖。java

用什麼工具都同樣,能開發的工具都是好工具,工具下載直通車:https://spring.io/tools/sts/allmysql

首先說一下環境  我這邊用的是JDK1.八、tomcat1.七、mysql5.0以上web

springMVC+springJDBC+Msql 用到的jar:spring

其中和Spring有關的jar直接去官網下載就行了:直通車 https://repo.spring.io/release/org/springframework/spring/sql

其餘相關的jar去相應的官網下載就行了。數據庫

 

1.新建一個動態的Web項目apache

 

 

2.配置web.XML文件(在web.xml文件中配置Spring核心轉換器)spring-mvc

  <!-- spring 核心轉換器 -->
  <servlet>
      <servlet-name>springMVC</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- 讓spring 核心轉換器何時啓動    tomcat啓動一秒後啓動 -->
      <load-on-startup>1</load-on-startup>
  </servlet>
  <!-- 攔截什麼路徑 -->
  <servlet-mapping>
      <servlet-name>springMVC</servlet-name>
      <url-pattern>/</url-pattern>
  </servlet-mapping>

 

 

3.新建springMVC-servlet.xml文件 (此文件中包掃描主要掃描controller層)tomcat

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    
    <!-- 配置包掃描  base-package="com.zx.controller" 指定哪個包-->
    <context:component-scan base-package="com.zx.controller"></context:component-scan>
    
    <!-- Spring MVC不處理靜態資源 -->
    <mvc:default-servlet-handler/>
    
    <!-- 開啓註解模式驅動 -->
    <mvc:annotation-driven conversion-service="conversionService"/>
    <!-- <mvc:annotation-driven/> -->
    
    <!-- 配置靜態資源  Spring MVC就不會作攔截 -->
    <mvc:resources location="/" mapping="**/*.png"/>
    <mvc:resources location="/" mapping="*.jpg"/>
    <mvc:resources location="/" mapping="*.css"/>
    <mvc:resources location="/" mapping="*.js"/>
    <mvc:resources location="/" mapping="*.ico"/>
    <mvc:resources location="/" mapping="*.gif"/> 
    
    <!-- 配置返回視圖的統一解析的先後綴    WEB-INF/jsp/index.jsp-->
    <bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前綴 -->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!-- 後綴 -->
        <property name="suffix" value=".jsp"></property>
    </bean>
    
</beans>

在以上配置文件中須要注意 beans節點中的 xmlns:context、xmlns:mvc、xmlns:aop 必定要有。若是不想手寫可用new的方式生成

以下步驟:右鍵WEB-INF文件夾 new > Other > 找到 spring選擇第一項

點擊下一步 編寫文件名爲springMVC-servlet.xml

點擊下一步選擇相應的節點以及版本號

而後點擊完成 會生成一個已經寫好頭文件的Spring配置文件,總之頗有不少方便之處能夠本身去多多研究,這裏我就很少說了。

 

 

4.以上文件配置好了後咱們還須要配置一個鏈接數據庫的配置文件  我這邊取名叫  bean.xml 而且放在了SRC目錄下

首先咱們須要在web.xml 中配置如下配置,注意此配置最好配置在Spring核心轉換器的後面

  <!-- springJDBC 配置 -->
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:bean.xml</param-value>
  </context-param>
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

配置 bean.xml 文件  (此文件中開啓包掃描主要掃描service和dao的實現層。)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <!-- 開啓註解模式 -->
    <context:annotation-config></context:annotation-config>
    
    <!-- 開啓包掃描 -->
    <context:component-scan base-package="com.zx.service.impl"></context:component-scan>
    <context:component-scan base-package="com.zx.dao.impl"></context:component-scan>

    <!-- 讀取數據庫配置文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    
    <!-- 配置數據源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${driver}"></property>
        <property name="url" value="${url}"></property>
        <property name="username" value="${usernamex}"></property>
        <property name="password" value="${passwordx}"></property>
    </bean>
    
    <!-- 配置事物管理 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    
    <!-- 開啓註解驅動 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

由於須要鏈接數據庫 因此須要數據庫 driver、url、username,password 等 ,根據以上配置咱們能夠看到 這些我都是從jdbc.properties文件中讀取過來的,因此須要在SRC下新建一個jdbc.properties文件。

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
usernamex=root
passwordx=root

至此我全部的配置均已經配置完成。

 

 

5.下面開始編寫java代碼。

首先編寫編寫controller層

package com.zx.controller;

import java.util.List;

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

import com.zx.enity.User;
import com.zx.service.UserService;

@Controller
public class UserController {
    
    @Autowired
    private UserService userService;
    
    
    /**
     * 跳轉添加用戶頁面
     * @return
     */
    @RequestMapping("addUserView")
    public String getAddUserView(Model model) {
        User user = new User("lisi", "123456", 120);
        model.addAttribute("user", user);
        return "addUser";
    }
    
    /**
     * 往數據庫添加user用戶
     * @return
     */
    @RequestMapping("addUser")
    public String addUser(User user,BindingResult bindingResult,Model model) {
        //保存數據
        //int num = userService.saveUser(user);
        
        //插入數據而且獲取主鍵
        int num = userService.saveUserReturnKey(user);
        
        System.out.println(num);
        System.out.println("zxxxxxxxxxxxx");
        
        if(num > 0 ) {
            model.addAttribute("msg","註冊成功,請登陸!!");
        }
        
        List<User> allUser = userService.getAllUser();
        for (User user2 : allUser) {
            System.out.println(user2.getUsername());
        }
        return "login";
    }
    
}

 而後 service層 

package com.zx.service;

import java.util.List;

import com.zx.enity.User;

public interface UserService {

    /**
     * 保存用戶
     * @param user
     * @return
     */
    public int saveUser(User user);
    
    
    /**
     * 保存用戶信息而且返回這條數據的主鍵
     * @return
     */
    public int saveUserReturnKey(User user) ;
    
    
    /**
     * 拿到全部的用戶
     * @return
     */
    public List<User> getAllUser();
}

service的實現層

package com.zx.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.zx.dao.UserDao;
import com.zx.enity.User;
import com.zx.service.UserService;

@Service
public class UserServiceImpl implements UserService {

    @Resource
    private UserDao userdao;
    
    
    @Transactional //事物管控
    @Override
    public int saveUser(User user) {
        try {
            return userdao.saveUser(user);
        } catch (Exception e) {
            // 拋出異常 用於報錯回滾
            throw new RuntimeException();
        }
    }

    @Transactional
    @Override
    public int saveUserReturnKey(User user) {
        try {
            return userdao.saveUserReturnKey(user);
        } catch (Exception e) {
            // 拋出異常 用於報錯回滾
            throw new RuntimeException();
        }
    }
    

    @Override
    public List<User> getAllUser() {
        // TODO Auto-generated method stub
        return userdao.getAllUser();
    }
    

}

dao層

package com.zx.dao;

import java.util.List;

import com.zx.enity.User;

public interface UserDao {
    
    /**
     * 保存用戶
     * @return
     */
    public int saveUser(User user);
    
    
    /**
     * 保存用戶信息而且返回這條數據的主鍵
     * @return
     */
    public int saveUserReturnKey(User user) ;
    
    
    /**
     * 拿到全部的用戶
     * @return
     */
    public List<User> getAllUser();
}

dao的實現層

package com.zx.dao.impl;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.sql.DataSource;
import javax.swing.plaf.basic.BasicComboBoxUI.KeyHandler;

import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;

import com.zx.dao.UserDao;
import com.zx.enity.User;

@Repository
public class UserDaoImpl extends JdbcDaoSupport implements UserDao  {
    
    /**
     * 獲取數據源
     * @param dataSource 來源於 bean.xml配置文件的dataSource
     */
    @Resource
    public final void setJdbcDaoDataSource(DataSource dataSource) {
        super.setDataSource(dataSource);
    }
    
    @Override
    public int saveUser(User user) {
        int num = this.getJdbcTemplate().update("insert into user (username,password,age,birth) values (?,?,?,?)",
                new Object[] {user.getUsername(),user.getPassword(),user.getAge(),user.getBirth()});
        
        //拋出異常 測試是否回滾
        //int a = 1/0;
        
        return num;
    }

    @Override
    public int saveUserReturnKey(User user) {
        System.out.println(user.toString());
        // 接受插入數據是返回的主鍵值
        KeyHolder key = new GeneratedKeyHolder();
        // 往數據庫插入數據而且返回主鍵值
        this.getJdbcTemplate().update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                // 作數據庫持久化   插入數據
                PreparedStatement prepareStatement = con.prepareStatement("insert into user (username,password,age,birth) values (?,?,?,?)", new String[] {"user_id"});
                //給佔位符賦值  數字表示第幾個佔位符
                prepareStatement.setString(1,user.getUsername() );
                prepareStatement.setString(2,user.getPassword());
                prepareStatement.setInt(3,user.getAge());
                prepareStatement.setDate(4,new Date(999999));
                return prepareStatement;
            }
        },key);
            //返回主鍵   由於KeyHolder key是一個對象  因此須要從中取出 key 並轉爲int類型
        return key.getKey().intValue();
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<User> getAllUser() {
        //新建list集合接受全部的用戶信息
        List<User> userList = new ArrayList<User>();
        // 作數據庫持久化  而且用 userList 接受查詢出來數據
        userList = this.getJdbcTemplate().query("select * from user ", new RowMapper() {
            //  相似循環  全部的數據在ResultSet rs 對象中取,  也能夠根據行數取int rowNum
            @Override
            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                //新建user對象   從數據庫取到的數據保存user的屬性中
                User user = new User();
                //  rs.getString(2)   getString是要取的數據的類型   2是屬性在行的第幾列
                user.setUsername(rs.getString(2));
                user.setPassword(rs.getString(3));
                user.setAge(rs.getInt(4));
                user.setBirth(rs.getDate(5));
                //  返回user對象    SpringJDBC會自動將user   添加到  userList 中
                return user;
            }
        });
        return userList;
    }

}


而後貼上user實體類

package com.zx.enity;

import java.util.Date;

public class User {

    //用戶名
    private String username;
    //用戶密碼
    private String password;
    //年齡
    private int age;
    //生日
    private Date birth;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
    
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public User() {}

    public User(String username, String password, int age) {
        super();
        this.username = username;
        this.password = password;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + ", age=" + age + ", birth=" + birth + "]";
    }
    
}

至此全部的代碼已經完成,如需運行請配置好一個mysql的數據庫 而且須要存在user表以及字段,一下是sql語句

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  `birth` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1011 DEFAULT CHARSET=utf8;

在咱們運行過程當中可能會遇到不少問題 無非就是咱們的 配置不正確、jar 缺失、單詞編寫不正確。仔細理清思路就會發現錯在哪裏。

以上代碼若有問題請多多指教。

相關文章
相關標籤/搜索