最近基于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核心转换器)
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选择第一项
点击下一步 编写文件名为springMVC-servlet.xml
点击下一步选择相应的节点以及版本号
然后点击完成 会生成一个已经写好头文件的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代码。
首先编写编写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 缺失、单词编写不正确。仔细理清思路就会发现错在哪里。
以上代码如有问题请多多指教。