springMVC+springJDBC+Msql注解模式

最近基于Spring4.X以上的版本写了一个springMVC+springJDBC+Msql注解模式的一个项目,之中也遇到过很多问题 ,为了防止以后遇到同样问题现记录一下知识点以及详细配置。

首先我是基于Spring Tool Suite 工具做开发,此工具和Eclipse工具区别不大,只是Sping在Eclipse上做了封装,更利于做Spring开发。以下是开发工具的图。

用什么工具都一样,能开发的工具都是好工具,工具下载直通车:https://spring.io/tools/sts/all

首先说一下环境  我这边用的是JDK1.8、tomcat1.7、mysql5.0以上

springMVC+springJDBC+Msql 用到的jar:

其中和Spring有关的jar直接去官网下载就好了:直通车 https://repo.spring.io/release/org/springframework/spring/

其他相关的jar去相应的官网下载就好了。

1.新建一个动态的Web项目

2.配置web.XML文件(在web.xml文件中配置Spring核心转换器)

  <!-- 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层)

<?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 缺失、单词编写不正确。仔细理清思路就会发现错在哪里。

以上代码如有问题请多多指教。

  

原文地址:https://www.cnblogs.com/Faith-zhang/p/7656421.html