Spring的数据库开发
Spring JDBC框架操作mysql数据库 |
- Spring中的JDBC为我们省去连接和关闭数据库的代码,我们着重关注对数据库的操作。Spring框架在数据库开发中的应用主要使用的是JDBCTemplate类,该类作为Spring对JDBC支持的核心,提供了所有对数据库操作功能的支持。我们将使用JDBCTemplate类完成对mysql数据库的增、删、改、查等操作。
- Spring框架提供JDBC支持主要由4个包组成,分别是core(核心包)、object(对象包)、dataSource(数据源包)和support(支持包),JdbcTemplate类就在核心包中,该类包含所有数据库操作的基本方法。
- core核心包:包含了JDBC的核心功能,重要的类:JdbcTemplate类、SimpleJdbcInsert类、SimpleJdbcCall类以及NamedParameterJdbcTemplate类;
- dataSource:数据源包,访问数据源的实用工具类,他有多种数据源的实现,可以在JavaEE容器外部测试JDBC代码;
- object:对象包,以面向对象的方式访问数据库,它允许执行查询并返回结果作为业务对象,可以在数据表的列和业务对象的属性之间映射查询结果;
- support支持包:core和object包的支持类,例如,提供异常转换功能的SQLException类。
- 首先介绍一下项目创建前的准备,本地mysql数据库安装完成,且可以用root用户登入,登入密码为123;而且需要额外的一些jar包:
然后在mysql数据库中创建名为User的数据库,此时数据库User中没有任何表项:
然后在Eclipse下新建Java项目,并且在src目录下新建lib文件夹,将jar包复制到lib文件夹下,对jar包配置路径(Build Path),然后在src目录下新建包com.jdbc,在包下新建applicationContext.xml文件,该文件为Spring的JDBC配置文件,文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 数据库驱动 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<!-- 连接数据库的URL 数据库名为已经创建好的User -->
<property name="url" value="jdbc:mysql://localhost/User"/>
<!-- 连接数据库的用户名 -->
<property name="username" value="root"/>
<!-- 连接数据的密码 -->
<property name="password" value="123"/>
</bean>
<!-- 配置JDBC模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 默认必须使用数据源 -->
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
JdbcTemplate提供大量的查询和更新数据库的方法,如下我们分别介绍execute()方法、update()方法、query()方法。
- execute()方法
execute(String sql)方法能够完成执行SQL语句的功能,下面以创建和删除数据库表的SQL语句为例,在如上创建的Java项目的src目录的com.jdbc下创建Client类,调用JdbcTemplate对象的execute()方法,实现对数据库表的创建和删除。代码如下:
public class Client { public static void main(String[] args) {
// TODO Auto-generated method stub
//定义配置文件路径
String path = "com/jdbc/JdbcTemplateBeans.xml";
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(path);
//获取jdbcTemplate实例
JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
String sql = "create table t_user(userID int primary key auto_increment, userName varchar(20), password varchar(32))";
jdbcTemplate.execute(sql);
/*
* //当t_user表创建完成后,下一次执行如下两条语句,该数据库表t_user将会被删除
*
String deltable = "drop table t_user";
jdbcTemplate.execute(deltable);*/
}
}
- update()方法
update()方法可以完成插入、更新和删除操作。在update方法中存在多个重载的方法,具体介绍如下:
- int update(String sql):该方法是最简单的update方法重载形式,可以直接传入SQL语句并返回受影响的行数;
- int update(PreparedStatementCreatorpsc):该方法执行从PreparedStatementCreatorpsc返回的语句,然后返回受影响的行数;
- int update(String sql, PreparedStatementSetterpss):该方法通过PreparedStatementSetterpss设置SQL语句中的参数,并返回受影响的行数;
- int update(String sql, Object...args):该方法使用Object...args设置SQL语句中的参数,要求参数不能为空,并返回受影响的行数。
接下来我们实现对用户信息的插入、修改和删除操作。首次按创建User类和UserFactory工厂类,代码如下:
public class User {
private int userID; //用户ID
private String userName; //用户名
private String passwd; //用户密码
public int getUserID() {
return userID;
}
public void setUserID(int userID) {
this.userID = userID;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
/*
*用户工厂类负责创建User对象
*/
public class UserFactory {
public User createUser(String name, int id, String password){
User user = new User();
user.setUserName(name);
user.setUserID(id);
user.setPasswd(password);
return user;
}
}
接下来创建UserDao接口,负责定义对User数据的操作,实现对User的增加、修改和删除操作,然后定义具体的实现类UserDaoImpl类,代码如下:
/*
*定义对User对象的操作
*/
public interface UserDao {
public int addUser(User user);
public int updateUser(User user);
public int deleteUser(User user);
} /*
* UserDao接口的具体实现类
*/
public class UserDaoImpl implements UserDao{
private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbc){
this.jdbcTemplate = jdbc;
}
@Override
public int addUser(User user) {
// TODO Auto-generated method stub
String sql = "insert into t_user(userid,username,password)values(?,?,?)";
Object[] obj = new Object[]{
user.getUserID(),
user.getUserName(),
user.getPasswd()
};
return this.execute(sql, obj);
} @Override
public int updateUser(User user) {
// TODO Auto-generated method stub
String sql = "update t_user set username=?,password=? where userid=?";
Object[] obj = new Object[]{
user.getUserName(),
user.getPasswd(),
user.getUserID()
};
return this.execute(sql, obj);
} @Override
public int deleteUser(User user) {
// TODO Auto-generated method stub
String sql = "delete from t_user where userid=?";
Object[] obj = new Object[]{
user.getUserID()
};
return this.execute(sql, obj);
}
//负责SQL语句的执行
private int execute(String sql, Object[] obj){
return this.jdbcTemplate.update(sql, obj);
}
}
UserDaoImpl类中有对JdbcTemplate类的引用,因此要在applicationContext.xml文件中实现UserDaoImpl对JdbcTemplate类的依赖注入,则在如上的applicationContext.xml文件的基础上,需要增加如下代码:
<bean id="userDao" class="com.jdbc.UserDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
客户端首先实现对User对象的添加操作,代码如下:
public class Client { public static void main(String[] args) {
// TODO Auto-generated method stub
//定义配置文件路径
String path = "com/jdbc/JdbcTemplateBeans.xml";
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(path);
//获取jdbcTemplate实例
JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
String sql = "create table t_user(userid int primary key auto_increment, username varchar(20), password varchar(32))";
jdbcTemplate.execute(sql); //创建数据库表
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
User user1 = new UserFactory().createUser("张三", 1, "qwer");
User user2 = new UserFactory().createUser("李四", 2, "password");
User user3 = new UserFactory().createUser("王五", 3, "wangwu");
//插入三条数据,输出为1则表示插入成功,否则插入失败
System.out.println(userDao.addUser(user1));
System.out.println(userDao.addUser(user2));
System.out.println(userDao.addUser(user3));
}
}
在数据库端,通过输入select * from t_user; 查询数据库表中的数据,如下图所示:
如上图中,我们看到李四用户的密码不太合理,需要更改其密码值,则Client的代码如下:
public class Client { public static void main(String[] args) {
// TODO Auto-generated method stub
//定义配置文件路径
String path = "com/jdbc/JdbcTemplateBeans.xml";
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(path);
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
User user2 = new UserFactory().createUser("李四", 2, "lisi");
//更新李四用户的密码为lisi
userDao.updateUser(user2);
}
}
查询数据库t_user表可以看到李四用户的密码已经更改为lisi:
最后我们实现对张三用户的删除操作,代码就很简单了,如下:
public class Client { public static void main(String[] args) {
// TODO Auto-generated method stub
//定义配置文件路径
String path = "com/jdbc/JdbcTemplateBeans.xml";
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(path);
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
User user1 = new UserFactory().createUser("张三", 1, "qwer");
System.out.println(userDao.deleteUser(user1));
}
}
最后可以看到张三用户被无情的从数据库表t_user中删除了:
- query()方法
JdbcTemplate对JDBC的流程做了封装,提供了大量的query()方法来处理各种对数据库表的查询操作,常用的query()方法如下:
- List query(String sql, PreparedStatementSetterpss, RowMapper rowMapper):该方法根据String类型参数提供的SQL语句创建PreparedStatement对象,通过RowMapper将结果返回到List中;
- List query(String sql,Object[] args, RowMapper rowMapper):该方法使用Object[]的值来设置SQL中的参数值,采用RowMapper回调方法可以直接返回List类型的数据;
- queryForObject(String sql,Object[]args, RowMapper rowMapper):该方法将args参数绑定到SQL语句中,通过RowMapper返回单行记录,并转换为一个Object类型返回;
- queryForList(String sql, Object[] args, class<T>elementType):该方法可以返回多行数据的结果,但必须是返回列表,elementType参数返回的是List元素类型。
接下来,我们尝试一下从t_user表中查询数据,在UserDao接口中增加按照id查询的方法和查询所有用户的方法,在UserDaoImpl中具体实现两个方法,代码如下:
public interface UserDao {
//在原有代码基础上增加的两个方法
public User findUserByID(int id);
public List<User> findAllUser();
} /*
* UserDao接口的具体实现类
*/
public class UserDaoImpl implements UserDao{
@Override
public User findUserByID(int id) {
// TODO Auto-generated method stub
String sql = "select * from t_user where userid=?";
//将结果集通过Java的反射机制映射到Java对象中
RowMapper<User> rowMapper = new BeanPropertyRowMapper(User.class);
return this.jdbcTemplate.queryForObject(sql, rowMapper, id);
}
@Override
public List<User> findAllUser() {
// TODO Auto-generated method stub
String sql = "select * from t_user";
RowMapper<User> rowMapper = new BeanPropertyRowMapper(User.class);
return this.jdbcTemplate.query(sql, rowMapper);
}
}
然后在Client类中调用者两个方法,实现对t_user表的查询操作:
public class Client { public static void main(String[] args) {
// TODO Auto-generated method stub
//定义配置文件路径
String path = "com/jdbc/JdbcTemplateBeans.xml";
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(path);
User user = userDao.findUserByID(2);
System.out.println(user);
List<User> userList = userDao.findAllUser();
for(User u : userList){
System.out.println(u);
}
}
}
同时呢,User类中应该覆写toString()方法,输出用户ID、用户名和用户密码:
public class User {
//在原有代码基础上覆写toString()方法
@Override
public String toString(){
return "user ID:" + this.getUserID() + " userName:" + this.getUserName() + " user password:" + this.getPassword();
}
}
运行该程序发现在Java反射的过程中password属性的值为null,即没有将数据库中的值映射到User对象中,那么问题出在哪里呢?数据库表t_user中密码字段标签为password,然而Java在反射的过程中,会在User类中找setPassword(String password)方法,而本片博客的User类中设置密码的方法为setPasswd(String passwd),导致在反射过程中无法找到setPassword(String password)方法,最终才会导致查询出来的password字段值为空,解决方法当然是将User类中的setPasswd(String passwd)方法改名为setPassword(String password)即可。
本片博客介绍了JdbcTemplate类对mysql数据库的操作,包括execute()、update()、query()三种方法,并通过案例演示了三种方法的使用。
Spring的数据库开发的更多相关文章
- 【Spring】Spring的数据库开发 - 2、Spring JdbcTemplate的常用方法(execute、update、query)
Spring JdbcTemplate的常用方法 文章目录 Spring JdbcTemplate的常用方法 execute() update() query() 简单记录-Java EE企业级应用开 ...
- 【Spring】Spring的数据库开发 - 1、Spring JDBC的配置和Spring JdbcTemplate的解析
Spring JDBC 文章目录 Spring JDBC Spring JdbcTemplate的解析 Spring JDBC的配置 简单记录-Java EE企业级应用开发教程(Spring+Spri ...
- Spring JDBC数据库开发
针对数据库操作,Spring框架提供了JdbcTemplate类. 1.Spring JDBC的配置 创建配置文件applicationContext.xml,添加如下代码: <!--配置数据源 ...
- 第4章 Spring的数据库开发
4.1 Spring JDBC Spring的JDBC模块负责数据库资源管理和错误处理,化简了开发者对数据库的操作. 4.11 Spring JdbcTemplate的解析 * JdbcTemplat ...
- Spring数据库开发
Spring的数据库开发 #Spring中JDBC模板的作用 JDBC模板负责数据库资源管理和错误处理: #熟悉Spring JDBC的配置 配置数据源和jdbc模板 <?xml versio ...
- Spring - 数据库开发概述
Spring 数据库开发 Spring 的 JDBC 模块负责数据库资源管理和镨误处理,大大简化了开发人员对数据库的操作,使得开发人员可以从繁琐的数据库操作中解脱出来,从而将更多的精力投入到编写业 ...
- 空中网招聘Java架构师、数据库开发等各类人才
爱好网络游戏吗?爱好网站开发技术吗? 有没有想过可以成为史诗级MMO RPG<激战2>运营团队中的一员? 如果下面的职位有合适你的,加入我们吧! http://gw2.kongzhong. ...
- Spring 链接数据库
一.前言 Spring 现在是我们在做 JavaWeb 开发中,用的最主流的框架.以后是不是我们暂时不知道,但现在是.废话不多我就介绍 Spring 中.链接数据库的三种方式: git源码地址 需要的 ...
- SSM 即所谓的 Spring MVC + Spring + MyBatis 整合开发。
SSM 即所谓的 Spring MVC + Spring + MyBatis 整合开发.是目前企业开发比较流行的架构.代替了之前的SSH(Struts + Spring + Hibernate) 计划 ...
随机推荐
- 关于解决python线上问题的几种有效技术
工作后好久没上博客园了,虽然不是很忙,但也没学生时代闲了.今天上博客园,发现好多的文章都是年终总结,想想是不是自己也应该总结下,不过现在还没想好,等想好了再写吧.今天写写自己在工作后用到的技术干货,争 ...
- win7安装时,避免产生100m系统保留分区的办法
在通过光盘或者U盘安装Win7操作系统时,在对新硬盘进行分区时,会自动产生100m的系统保留分区.对于有洁癖的人来说,这个不可见又删不掉的分区是个苦恼.下面介绍通过diskpart消灭保留分区的办法: ...
- Matlab 高斯_拉普拉斯滤波器处理医学图像
前言:本程序是我去年实现论文算法时所做.主要功能为标记切割肝脏区域.时间有点久,很多细节已经模糊加上代码做了很多注释,因此在博客中不再详述. NOTE: 程序分几大段功能模块,仔细阅读,对解决医学图像 ...
- Objective-C中block的底层原理
先出2个考题: 1. 上面打印的是几,captureNum2 出去作用域后是否被销毁?为什么? 同样类型的题目: 问:打印的数字为多少? 有人会回答:mutArray是captureObject方法的 ...
- .NET Core的日志[2]:将日志输出到控制台
对于一个控制台应用,比如采用控制台应用作为宿主的ASP.NET Core应用,我们可以将记录的日志直接输出到控制台上.针对控制台的Logger是一个类型为ConsoleLogger的对象,Consol ...
- zookeeper源码分析之六session机制
zookeeper中session意味着一个物理连接,客户端连接服务器成功之后,会发送一个连接型请求,此时就会有session 产生. session由sessionTracker产生的,sessio ...
- 来吧,HTML5之基础标签(下)
<dialog> 标签 定义对话框或窗口. <dialog> 标签是 HTML 5 的新标签.目前只有 Chrome 和 Safari 6 支持 <dialog> ...
- html5 canvas常用api总结(二)--绘图API
canvas可以绘制出很多奇妙的样式和美丽的效果,通过几个简单的api就可以在画布上呈现出千变万化的效果,还可以制作网页游戏,接下来就总结一下和绘图有关的API. 绘画的时候canvas相当于画布,而 ...
- DDD领域驱动设计 - 设计文档模板
设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ...
- 用Swagger生成接口文档
Swagger简介 在系统设计的时候,各个应用之间往往是通过接口进行交互的.因此接口的定义在整个团队中就变得尤为重要.我们可以把接口的规范用接口描述语言进行描述,然后Swagger可以根据我们定义的接 ...