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

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

  

springMVC+springJDBC+Msql注解模式的更多相关文章

  1. SpringMVC+SpringJdbc+SQLServer+EasyUI增删改查

    前言 前天用SpringJdbc连接了一把SQLServer,早上起来用SpringMVC+SpringJdbc+EasUI写了个增删改查的demo,主要是熟悉下SpringMVC相关知识点,如vie ...

  2. JAVA-SpringMVC基于注解模式第一个应用

    项目文件结构 1. web.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <web-app x ...

  3. Spring SpringMVC SpringBoot SpringCloud 注解整理大全

    Spring SpringMVC SpringBoot SpringCloud 注解整理 才开的博客所以放了一篇以前整理的文档,如果有需要添加修改的地方欢迎指正,我会修改的φ(๑˃∀˂๑)♪ Spri ...

  4. SpringMVC自动扫描@Controller注解的bean

    若要对@Controller注解标注的bean进行自动扫描,必须将<context:component-scan base-package="包路径.controller"/ ...

  5. 关于spring-mvc的InitBinder注解的参数

    关于spring-mvc的InitBinder注解的参数 通过Spring-mvc的@InitBinder注释的方法可以对WebDataBinder做一些初始化操作.比如设置Validator. 我一 ...

  6. spring的配置模式与注解模式基础

    “依赖注入”是spring的核心特征,在Web服务器(如Tomcat)加载时,它会根据Spring的配置文件中配置的bean或者是通过注解模式而扫描并装载的bean实例自动注入到Application ...

  7. SpringMVC使用@ResponseBody注解返回中文字符串乱码的问题

    先说一下我的经历,以及解决问题的而过程. 在使用SpringMVC的时候,最开始的时候在配置文件中使用<mvc:annotation-driven />去自动注册DefaultAnnota ...

  8. SSM-SpringMVC-14:SpringMVC中大话注解式开发基础--呕心沥血版

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 注解的基础我不再多啰嗦,百度一搜很多,很详细啊,我就讲一下SpringMVC中的注解入门 通过注解的方式定义 ...

  9. [转载]SpringBoot系列: SpringMVC 参数绑定注解解析

    本文转载自 https://www.cnblogs.com/morethink/p/8028664.html, 作者写得非常好, 致谢! SpringMVC 参数绑定注解解析   本文介绍了用于参数绑 ...

随机推荐

  1. 杂项:LDAP

    ylbtech-杂项:LDAP 1.返回顶部 1. LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.它是基于X. ...

  2. JSP-Runoob:JSP 文件上传

    ylbtech-JSP-Runoob:JSP 文件上传 1.返回顶部 1. JSP 文件上传 JSP 可以与 HTML form 标签一起使用,来允许用户上传文件到服务器.上传的文件可以是文本文件或图 ...

  3. bzoj3550

    费用流+线性规划 搞了很长时间... 我们可以设立式子,a[1]+a[2]+a[3]+...+a[n]<=k , ... , a[2 * n + 1]+ ... +a[3*n]<=k a是 ...

  4. [Swift通天遁地]四、网络和线程-(6)检测网络连接状态

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. Akka源码分析-深入ActorRef&ActorPath

    上一节我们深入讨论了ActorRef等相关的概念及其关系,但ActorRef和ActorPath的关系还需要再加以分析说明.其实还是官网说的比较清楚. “A path in an actor syst ...

  6. MVC系列学习(四)-初识Asp.NetMVC框架

    注:本文章从伯乐那盗了两张图,和一些文字: 1.MVC设计模式 与 Asp.Net Mvc框架 a.MVC设计模式 MVC设计模式 是一种 软件设计模式,将业务逻辑 与 界面显示 分离,并通过某种方式 ...

  7. 阿里云虚拟主机针对恶意频繁攻击式访问造成CPU爆满的解决方法

    最近网站CPU经常爆满,到阿里云提交了工单,工程师给我的处理意见:   您好,虚拟主机CPU占用比较高通常这种情况有两种可能:   一是网站应用程序代码逻辑较复杂,或业务架构效率比较低,在请求了某个网 ...

  8. web流行工具

    中小型公司: Node.js:现代工业化前端的基础: RequireJS:AMD规范, 即将过时的 JavaScript 模块化方案: Bower:前端模块源: npm:前端工具源,另一个潜在的前端模 ...

  9. css图片高清适配

    同一张图片,在普通屏显示正常,但高清屏出现模糊.原因是原来一个像素的点分成的四个像素的点进行了显示. 解决方案:在高清屏中把图片变成二倍图,前提是二倍的高清图已经存在. .icon{ backgrou ...

  10. 【技术累积】【点】【java】【30】代理模式

    基础 代理模式是Java常见的设计模式之一.所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象. 什么是代理 参考现实生活中的代理 比如某个品牌的某个省的代理商,作 ...