springmvc mysql jdbc_springMVC+springJDBC+Msql注解模式

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

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

68f05949468b8bf01ecf797200302e86.png

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

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

springMVC+springJDBC+Msql 用到的jar:

29135b5a5c8d26480ce3c466c97aef5d.png

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

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

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

54b7bf9ae6e74106be8c55ecbef13c36.png

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

springMVC

org.springframework.web.servlet.DispatcherServlet

1

springMVC

/

3.新建springMVC-servlet.xml文件 (此文件中包扫描主要扫描controller层)

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">

在以上配置文件中需要注意 beans节点中的 xmlns:context、xmlns:mvc、xmlns:aop一定要有。如果不想手写可用new的方式生成

如下步骤:右键WEB-INF文件夹 new > Other > 找到 spring选择第一项

81c6951954f5d2d57a1bbe7ebe398a1f.png

点击下一步 编写文件名为springMVC-servlet.xml

7cbc5f86e3452717160da36bec2c1e04.png

点击下一步选择相应的节点以及版本号

c08eb010a55648b512cffc82f01ba31e.png

然后点击完成 会生成一个已经写好头文件的Spring配置文件,总之很有很多方便之处可以自己去多多研究,这里我就不多说了。

4.以上文件配置好了后我们还需要配置一个连接数据库的配置文件  我这边取名叫  bean.xml 并且放在了SRC目录下

首先我们需要在web.xml 中配置以下配置,注意此配置最好配置在Spring核心转换器的后面

contextConfigLocation

classpath:bean.xml

org.springframework.web.context.ContextLoaderListener

配置 bean.xml文件  (此文件中开启包扫描主要扫描service和dao的实现层。)

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">

因为需要连接数据库 所以需要数据库 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代码。

d4a5796290ed37c77f233de63bb5add1.png

首先编写编写controller层

packagecom.zx.controller;importjava.util.List;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.ui.Model;importorg.springframework.validation.BindingResult;importorg.springframework.web.bind.annotation.RequestMapping;importcom.zx.enity.User;importcom.zx.service.UserService;

@Controllerpublic classUserController {

@AutowiredprivateUserService userService;/*** 跳转添加用户页面

*@return

*/@RequestMapping("addUserView")publicString getAddUserView(Model model) {

User user= new User("lisi", "123456", 120);

model.addAttribute("user", user);return "addUser";

}/*** 往数据库添加user用户

*@return

*/@RequestMapping("addUser")publicString 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 allUser =userService.getAllUser();for(User user2 : allUser) {

System.out.println(user2.getUsername());

}return "login";

}

}

然后 service层

packagecom.zx.service;importjava.util.List;importcom.zx.enity.User;public interfaceUserService {/*** 保存用户

*@paramuser

*@return

*/

public intsaveUser(User user);/*** 保存用户信息并且返回这条数据的主键

*@return

*/

public intsaveUserReturnKey(User user) ;/*** 拿到所有的用户

*@return

*/

public ListgetAllUser();

}

service的实现层

packagecom.zx.service.impl;importjava.util.List;importjavax.annotation.Resource;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;importcom.zx.dao.UserDao;importcom.zx.enity.User;importcom.zx.service.UserService;

@Servicepublic class UserServiceImpl implementsUserService {

@ResourceprivateUserDao userdao;

@Transactional//事物管控

@Overridepublic intsaveUser(User user) {try{returnuserdao.saveUser(user);

}catch(Exception e) {//抛出异常 用于报错回滚

throw newRuntimeException();

}

}

@Transactional

@Overridepublic intsaveUserReturnKey(User user) {try{returnuserdao.saveUserReturnKey(user);

}catch(Exception e) {//抛出异常 用于报错回滚

throw newRuntimeException();

}

}

@Overridepublic ListgetAllUser() {//TODO Auto-generated method stub

returnuserdao.getAllUser();

}

}

dao层

packagecom.zx.dao;importjava.util.List;importcom.zx.enity.User;public interfaceUserDao {/*** 保存用户

*@return

*/

public intsaveUser(User user);/*** 保存用户信息并且返回这条数据的主键

*@return

*/

public intsaveUserReturnKey(User user) ;/*** 拿到所有的用户

*@return

*/

public ListgetAllUser();

}

dao的实现层

packagecom.zx.dao.impl;importjava.sql.Connection;importjava.sql.Date;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.List;importjavax.annotation.Resource;importjavax.sql.DataSource;importjavax.swing.plaf.basic.BasicComboBoxUI.KeyHandler;importorg.springframework.jdbc.core.PreparedStatementCreator;importorg.springframework.jdbc.core.RowMapper;importorg.springframework.jdbc.core.support.JdbcDaoSupport;importorg.springframework.jdbc.support.GeneratedKeyHolder;importorg.springframework.jdbc.support.KeyHolder;importorg.springframework.stereotype.Repository;importcom.zx.dao.UserDao;importcom.zx.enity.User;

@Repositorypublic class UserDaoImpl extends JdbcDaoSupport implementsUserDao {/*** 获取数据源

*@paramdataSource 来源于 bean.xml配置文件的dataSource*/@Resourcepublic final voidsetJdbcDaoDataSource(DataSource dataSource) {super.setDataSource(dataSource);

}

@Overridepublic intsaveUser(User user) {int num = this.getJdbcTemplate().update("insert into user (username,password,age,birth) values (?,?,?,?)",newObject[] {user.getUsername(),user.getPassword(),user.getAge(),user.getBirth()});//抛出异常 测试是否回滚//int a = 1/0;

returnnum;

}

@Overridepublic intsaveUserReturnKey(User user) {

System.out.println(user.toString());//接受插入数据是返回的主键值

KeyHolder key = newGeneratedKeyHolder();//往数据库插入数据并且返回主键值

this.getJdbcTemplate().update(newPreparedStatementCreator() {

@Overridepublic PreparedStatement createPreparedStatement(Connection con) throwsSQLException {//做数据库持久化 插入数据

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));returnprepareStatement;

}

},key);//返回主键 因为KeyHolder key是一个对象 所以需要从中取出 key 并转为int类型

returnkey.getKey().intValue();

}

@SuppressWarnings("unchecked")

@Overridepublic ListgetAllUser() {//新建list集合接受所有的用户信息

List userList = new ArrayList();//做数据库持久化 并且用 userList 接受查询出来数据

userList = this.getJdbcTemplate().query("select * from user ", newRowMapper() {//类似循环 所有的数据在ResultSet rs 对象中取, 也可以根据行数取int rowNum

@Overridepublic Object mapRow(ResultSet rs, int rowNum) throwsSQLException {//新建user对象 从数据库取到的数据保存user的属性中

User user = newUser();//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 中

returnuser;

}

});returnuserList;

}

}

然后贴上user实体类

packagecom.zx.enity;importjava.util.Date;public classUser {//用户名

privateString username;//用户密码

privateString password;//年龄

private intage;//生日

privateDate birth;publicString getUsername() {returnusername;

}public voidsetUsername(String username) {this.username =username;

}publicString getPassword() {returnpassword;

}public voidsetPassword(String password) {this.password =password;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}publicDate getBirth() {returnbirth;

}public voidsetBirth(Date birth) {this.birth =birth;

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

}

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值