最近基于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. bzoj2125 最短路——仙人掌两点间距离

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2125 仙人掌!模仿 lyd 的代码写的,也算是努力理解了: 主要分成 lca 在环上和不在环 ...

  2. JSP-Runoob:JSP 调试

    ylbtech-JSP-Runoob:JSP 调试 1.返回顶部 1. JSP 调试 要测试/调试一个JSP或servlet程序总是那么的难.JSP和Servlets程序趋向于牵涉到大量客户端/服务器 ...

  3. PCB genesis孔符制作实现方法

    一.先看genesis原始孔符 孔符的作用:用于表示孔径的大小的一种代号, 当孔径检测时,可以按分孔图中的孔符对应的孔径尺寸对孔径检测. 在实际PCB行业通常不使用原始(图形)孔符,而使用字母孔符(如 ...

  4. PCB SQL Server 触发器应用实例

    这里以实际例子对触发器的应用对触发器的理解与应用来得更实际 一.更新触发器(Update) 临时表:inserted表有数据(新数据)     Deleted表有数据(旧数据) 实例说明:当表更新时, ...

  5. Gym - 102059D 2018-2019 XIX Open Cup, Grand Prix of Korea D. Dumae 贪心+堆

    题面 题意:有3e5个人排成一列,然后Li,Ri表示每个人可以站在[Li,Ri]中的一个,然后M(1e6)个限制条件,某个人一定要在某个人前面,求一种合法方案,无解输出-1 题解:首先可以想到对于限制 ...

  6. [Swift通天遁地]七、数据与安全-(3)Cocopods的安装和开源类库对JSON的解析

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

  7. 如何查看jdk的版本

    (1)WINDOWS环境下 实验环境:WIN7 64bit 操作指令:cmd命令下输入“java -version” 参考如下:JDK1.7 (2).LINUX环境下 实验环境:CentOS 5.6 ...

  8. Maven密码加密

    第1步执行shell: mvn --encrypt-master-password  "SomeMadeUpMasterPassword" {nDpn1bE1vX4HABCDEFG ...

  9. 警告视图及操作表单在xcode7.0中的使用

    警告视图(alert)及操作表单(action sheet)都用于向用户提供反馈.(模态视图) 操作表单:要求用户在两个以上选项之间做出选择.操作表单从屏幕底部出现,显示一系列按钮供用户选择.用户必须 ...

  10. 如何调用com组件中包含IntPtr类型参数的函数

    背景 公司的支付平台最近对接了西安移动的支付接口,接口中签名的方法是对方提供了一个com组件,组件中包含了一个签名的方法和一个验签的方法,注册了签名之后,在vs中进行了引用,引用之后,查看组件的定义如 ...