数据库操作之Spring JDBCTemplate(postgresql)
本文总结了两种使用JDBCTemplate进行数据库CRUD操作的例子,我用的是pg,废话不说,直接开始吧。
先贴一张目录结果图吧:
上图中最主要的是配置文件和所需的各种jar包。
一、通过属性文件的.properties的方式
这种方法很简单,也是最基本的,主要是从配置文件读取数据库连接信息,然后设置到数据源中,再将数据源设置到JdbcTemplate中,通过这个对象进行数据库的CRUD操作。
1、配置文件config.properties
用来配置数据库连接信息,我配置的都是一下基本信息
#数据库地址
db.driverClassName = org.postgresql.Driver
db.url = jdbc:postgresql://127.0.0.1:5432/hcs
db.username = postgres
db.password =postgres
db.initialSize=5
db.maxActive=1000
db.maxIdle=200
db.minIdle=100
db.maxWait=100
db.validationQuery = select version()
2、获取属性文件config.properties
/**
* 获取属性配置文件
* @return
*/
public Properties getProp(){
InputStream is = this.getClass().getClassLoader().getResourceAsStream("config.properties");
Properties prop = new Properties();
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
}
return prop;
}
3、创建数据源并获取JdbcTemplate对象
/**
* 创建数据源并获取JdbcTemplate
* @return
*/
BasicDataSource basicDataSource = null;
public JdbcTemplate getTemplate(){
basicDataSource = new BasicDataSource();
Properties pro = getProp();
basicDataSource.setDriverClassName(pro.getProperty("db.driverClassName"));
basicDataSource.setUrl(pro.getProperty("db.url"));
basicDataSource.setUsername(pro.getProperty("db.username"));
basicDataSource.setPassword(pro.getProperty("db.password"));
basicDataSource.setValidationQuery(pro.getProperty("db.validationQuery"));
basicDataSource.setInitialSize(50);
basicDataSource.setMaxActive(100);
basicDataSource.setMaxIdle(50);
basicDataSource.setMinIdle(40);
basicDataSource.setMaxWait(100);
basicDataSource.setRemoveAbandoned(true);
basicDataSource.setRemoveAbandonedTimeout(280);
basicDataSource.setLogAbandoned(true);
basicDataSource.setTestOnBorrow(true);
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(basicDataSource);
return jdbcTemplate;
}
4、增删改查
增加
/**
* 保存数据
* @throws Exception
*/
public int saveData(){
String id = UUID.randomUUID().toString();
String sql = "INSERT INTO sys_user VALUES('"+id+"','111','111','111','111','111','111','111')";
int save = 0;
try {
save = getTemplate().update(sql);
close();
} catch (DataAccessException e) {
e.printStackTrace();
}
return save;
}
修改
/**
* 更新数据
* @return
*/
public int updateData(){
String sql = "UPDATE sys_user SET user_name='hyc',user_login_name = 'hyc' WHERE user_id = ?";
int update = getTemplate().update(sql,"222");
close();
return update;
}
删除
/**
* 删除数据
* @return
*/
public int deleteData(){
String sql = "DELETE FROM sys_user WHERE user_id = ?";
int delete = getTemplate().update(sql,"111");
close();
return delete;
}
查询
/**
* 查询数据
* @return
*/
public long getData(){
String sql = "SELECT COUNT(*) FROM sys_user";
long result = getTemplate().queryForObject(sql, Long.class);
close();
return result;
}
关闭连接方法close()
/**
* 关闭连接
*/
public void close(){
if(null!=basicDataSource){
try {
basicDataSource.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
二、使用xml配置文件
这种方式就是纯Spring方式,需要用到Spring的配置文件,通过IOC和AOP来new对象。
1、Spring配置文件bean.xml(名称自定义,但必须是XML格式)
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- IOC和DI的注解扫描 -->
<context:component-scan base-package="com.hyc" ></context:component-scan> <!-- 打开AOP的注解 -->
<!-- 这里用的是中间的横线而不是下划线 -->
<!-- <aop:aspectj-autoproxy></aop:aspectj-autoproxy> --> <!--第一步:配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
<property name="jdbcUrl" value="jdbc:postgresql://127.0.0.1:5432/hcs"></property>
<property name="driverClass" value="org.postgresql.Driver"></property>
<property name="user" value="postgres"></property>
<property name="password" value="hyc123"></property>
</bean> <!-- 第二步:将数据源设置JdbcTemplate模板中 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 第三步:在dao中注入JdbcTemplate模板 -->
<bean id="sysUserDao" class="com.hyc.dao.SysUserDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean> <!-- 第四步:在service中注入dao -->
<bean id="sysUserService" class="com.hyc.service.SysUserService">
<property name="sysUserDao" ref="sysUserDao"></property>
</bean> </beans>
2、创建dao层,将JdbcTemplate作为其属性,并添加get和set方法,这样就可以在dao层调用模板对象
/**
* DAO层
*
* @createtime 2017年10月31日 下午4:39:44
* @description
*/
public class SysUserDao { private JdbcTemplate jdbcTemplate; /**
* @return the jdbcTemplate
*/
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
} /**
* @param jdbcTemplate
* the jdbcTemplate to set
*/
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}
3、创建service层,并将dao层作为其属性,提供get和set方法,这样就可以在service中调用dao对象及其中的方法了
/***
* service层
* @createtime 2017年10月31日 下午4:39:31
* @description
*/
public class SysUserService { private SysUserDao sysUserDao; /**
* @return the sysUserDao
*/
public SysUserDao getSysUserDao() {
return sysUserDao;
} /**
* @param sysUserDao the sysUserDao to set
*/
public void setSysUserDao(SysUserDao sysUserDao) {
this.sysUserDao = sysUserDao;
} }
4、在DAO中调用JdbcTemplate对象进行数据库的CRUD操作
增加
/**
* 新增用户
* @param sysUser
* @return
*/
public int addUser(SysUser sysUser) {
String sql = "INSERT INTO sys_user VALUES('" + sysUser.getUserId()
+ "','" + sysUser.getUserName() + "','"
+ sysUser.getUserRealName() + "','" + sysUser.getUserCode()
+ "','" + sysUser.getUserLoginName() + "','"
+ sysUser.getUserDeptId() + "','" + sysUser.getIsdepadmin()
+ "','" + sysUser.getFreecapacity() + "')";
int save = 0;
try {
save = jdbcTemplate.update(sql);
} catch (DataAccessException e) {
e.printStackTrace();
}
return save;
}
删除
/**
* 删除用户
* @param userId
* @return
*/
public int delUser(String userId){
String sql = "DELETE FROM sys_user WHERE user_id = ?";
return jdbcTemplate.update(sql, "d83ea6cf-4f78-4fd4-ac4f-bb32ec706af5");
}
修改
/**
* 修改用户信息
* @param sysUser
* @return
*/
public int updateUser(SysUser sysUser){
String sql = "UPDATE sys_user SET user_name=?,user_login_name = ? WHERE user_id = ?";
return jdbcTemplate.update(sql, sysUser.getUserName(),sysUser.getUserLoginName(),sysUser.getUserId()); }
查看
/**
* 查看用户
* @param userId
* @return
*/
public Map<String, Object> viewUser(String userId){
String sql = "SELECT * FROM sys_user WHERE user_id=?";
return jdbcTemplate.queryForMap(sql,userId);
}
5、在service层(业务逻辑层)通过dao对象进行调用数据库操作相关的方法
//增
public int saveUser(SysUser sysUser){
return sysUserDao.addUser(sysUser);
} //删
public int delUser(String userId){
return sysUserDao.delUser(userId);
} //改
public int updateUser(SysUser sysUser){
return sysUserDao.updateUser(sysUser);
} //查
public Map<String, Object> viewUser(String userId){
return sysUserDao.viewUser(userId);
}
6、创建pojo对象,即service中的SysUser,也是数据库表所映射的对象(ORM)
要提供所有属性的get和set方法
package com.hyc.dao; public class SysUser {
private String userId;
private String userName;
private String userRealName;
private String userCode;
private String userLoginName;
private String userDeptId;
private String isdepadmin;
private String freecapacity; /**
* @return the userId
*/
public String getUserId() {
return userId;
} /**
* @param userId
* the userId to set
*/
public void setUserId(String userId) {
this.userId = userId;
} /**
* @return the userName
*/
public String getUserName() {
return userName;
} /**
* @param userName
* the userName to set
*/
public void setUserName(String userName) {
this.userName = userName;
} /**
* @return the userRealName
*/
public String getUserRealName() {
return userRealName;
} /**
* @param userRealName
* the userRealName to set
*/
public void setUserRealName(String userRealName) {
this.userRealName = userRealName;
} /**
* @return the userCode
*/
public String getUserCode() {
return userCode;
} /**
* @param userCode
* the userCode to set
*/
public void setUserCode(String userCode) {
this.userCode = userCode;
} /**
* @return the userLoginName
*/
public String getUserLoginName() {
return userLoginName;
} /**
* @param userLoginName
* the userLoginName to set
*/
public void setUserLoginName(String userLoginName) {
this.userLoginName = userLoginName;
} /**
* @return the userDeptId
*/
public String getUserDeptId() {
return userDeptId;
} /**
* @param userDeptId
* the userDeptId to set
*/
public void setUserDeptId(String userDeptId) {
this.userDeptId = userDeptId;
} /**
* @return the isdepadmin
*/
public String getIsdepadmin() {
return isdepadmin;
} /**
* @param isdepadmin
* the isdepadmin to set
*/
public void setIsdepadmin(String isdepadmin) {
this.isdepadmin = isdepadmin;
} /**
* @return the freecapacity
*/
public String getFreecapacity() {
return freecapacity;
} /**
* @param freecapacity
* the freecapacity to set
*/
public void setFreecapacity(String freecapacity) {
this.freecapacity = freecapacity;
} }
7、编写单元测试用例,测试增删改查
在增删改查之前需要获取service对象,而service对象是通过配置文件注入的,所以要通过配置文件的getBean方法获取,这部分代码数据全局变量,所以可以写在junit的before方法中
获取service对象
ApplicationContext context = null;
SysUserService sysUserService = null;
@Before
public void before(){
context = new ClassPathXmlApplicationContext("bean.xml");
sysUserService = context.getBean("sysUserService",SysUserService.class);
}
测试增删改查
//测试增加操作
@Test
public void testSaveUser(){
SysUser sysUser= new SysUser();
sysUser.setUserId(UUID.randomUUID().toString());
sysUser.setUserName("hyc2");
sysUser.setUserRealName("hyc2");
sysUser.setUserCode("sss");
sysUser.setUserLoginName("hyc2");
sysUser.setUserDeptId("ddd");
sysUser.setIsdepadmin("1");
sysUser.setFreecapacity("20");
int save = sysUserService.saveUser(sysUser);
System.out.println(save==1?"保存成功":"保存失败");
} //测试删除操作
@Test
public void testDelUser(){
int del = sysUserService.delUser("4436b3c2-381f-4bc3-8a4c-0a935b30af68");
System.out.println(del==1?"删除成功":"删除失败");
} //测试修改操作
@Test
public void testUpdateUser(){
SysUser sysUser= new SysUser();
sysUser.setUserId("441c0c98-f150-45f2-84ca-c0be1b944275");
sysUser.setUserName("hyc222");
sysUser.setUserRealName("hyc222");
sysUser.setUserCode("sss22");
sysUser.setUserLoginName("hyc222");
sysUser.setUserDeptId("ddd");
sysUser.setIsdepadmin("1");
sysUser.setFreecapacity("20");
int update = sysUserService.updateUser(sysUser);
System.out.println(update==1?"修改成功":"修改失败");
} //测试查询操作
@Test
public void testViewUser(){
Map<String, Object> sysUser = sysUserService.viewUser("222");
System.out.println("用户名是:"+sysUser.get("user_name"));
}
以上就是所有内容,已经测试,如果按照步骤即可跑起来,但是我的CRUD都是最简单的,主要是介绍这两种方法的框架搭建。
推荐一篇比较好的博客:----->http://www.cnblogs.com/tuhooo/p/6491913.html,作者在对xml配置文件中配置原理部分的描述比较通俗易懂,可借鉴。
数据库操作之Spring JDBCTemplate(postgresql)的更多相关文章
- spring学习之三 数据库操作jdbcTemplate
概念 jdbcTemplate就Spring对数据库持久化技术的实现,通过它可以对数据库进行CRUD等操作. JDBCTemplate和代码实现 public void jdbcadd() { Dri ...
- Spring框架针对dao层的jdbcTemplate操作crud之update修改数据库操作
使用jdbcTemplate 原理是把加载驱动Class.forName("com.mysql.jdbc.Driver"); 和连接数据库Connection conn=Drive ...
- Spring框架针对dao层的jdbcTemplate操作crud之add添加数据库操作
使用jdbcTemplate 原理是把加载驱动Class.forName("com.mysql.jdbc.Driver"); 和连接数据库Connection conn=Drive ...
- 使用JdbcTemplate简化JDBC操作 实现数据库操作
使用Spring JDBC框架方遍简单的完成JDBC操作,满足性能的需求且灵活性高. Spring JDBC框架由4个部分组成,即core.datasource.object.support. org ...
- Spring Boot(二):数据库操作
本文主要讲解如何通过spring boot来访问数据库,本文会演示三种方式来访问数据库,第一种是JdbcTemplate,第二种是JPA,第三种是Mybatis.之前已经提到过,本系列会以一个博客系统 ...
- Spring框架学习10——JDBC Template 实现数据库操作
为了简化持久化操作,Spring在JDBC API之上提供了JDBC Template组件. 1.添加依赖 添加Spring核心依赖,MySQL驱动 <!--Spring核心基础依赖--> ...
- spring boot数据库操作汇总
1 关于orm orm即object relational mapping,对象关系映射,即将数据库中的表映射成对象. 常用的orm有以下: mybatis spring jdbc template ...
- Spring JdbcTemplate操作小结
Spring 提供了JdbcTemplate 来封装数据库jdbc操作细节: 包括: 数据库连接[打开/关闭] ,异常转义 ,SQL执行 ,查询结果的转换 使用模板方式封装 jdbc数据库操作-固定流 ...
- 【Spring】Spring的数据库开发 - 2、Spring JdbcTemplate的常用方法(execute、update、query)
Spring JdbcTemplate的常用方法 文章目录 Spring JdbcTemplate的常用方法 execute() update() query() 简单记录-Java EE企业级应用开 ...
随机推荐
- jmeter做bbs作业时提示404错误
在用jemter做bbs作业时候,注册成功后会跳转到主页,在写主页的脚本的时候,将fiddler抓到的url复制到路径下方“/bbs/forum.php”,但是第一次复制的时候在/bbs/forum. ...
- jmeter参数化遇到的问题
遇到的问题是点击运行后,察看结果树没有任何结果,且右上角的警告日志是: meter.threads.JMeterThread: Test failed! java.lang.IllegalArgume ...
- 跳表上线性dp——1150D 好题!
题目设计的很好,感觉做了这题对dp的状态有了更深的理解 /* 先预处理序列自动机 dp[i][j][k]表示匹配到i,j,k时的最靠前的位置 那么现在A串加入了一个字母,我们要求的就是dp[i+1][ ...
- angular项目中遇到的问题
一.angular项目中如何实现路由缓存 需要实现的效果,对请求的数据进行缓存,比如进入文章详情页之后点击返回,不会再调用后台数据接口:而是加载缓存中的数据,如何数据变动的情况下,可使用下拉刷新刷新页 ...
- 从0开始学习ssh之日志工具与配置log4j
添加slf4j-api-1.6.1,slf4j-log4j12-1.6.1,log4j-1.2.15三个jar包到lib文件夹下就可以使用log4j日志文件.具体配置在log4j.properties ...
- osg::BlendFunc来设置透明度
osg::BlendFunc介绍 混合是什么呢?混合就是把两种颜色混在一起.具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果. 假设我们需要 ...
- LUOGU P2675 《瞿葩的数字游戏》T3-三角圣地
题面 解题思路 手推可以得出,最后每个数字的贡献其实就是第n行杨辉三角数,然后直接卢卡斯直接算(今天才找到lucas定理时间复杂度是log n,log以模数为底).代码略麻烦,不想改了. 代码 #in ...
- js的深复制与浅复制
什么是深复制和浅复制? 深复制和浅复制的概念只存在于对象array和数组obj上. 浅复制是:模糊复制,就是不管对方是字符串类型还是引用类型都通通复制过来.结果两个变量的内容会同时变化. 深复制是:有 ...
- 原声js实现nodejs中qs模块中的parse和stringfiy方法
function stringify(obj, sep, eq) { sep = sep || '&'; eq = eq || '='; let str = ""; for ...
- crontab定时任务语法及应用
https://mp.weixin.qq.com/s/Oi9hppNQMeFiQo9s-ge79A crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows ...