Spring DAO(2):Spring JDBC 访问数据库
配置使用 Spring JDBC 的基本过程
配置 Spring JDBC
<?xml version="1.0" encoding="UTF-8"?>
<beans ... >
<!--配置数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://127.0.0.1:3306/iogames"
p:username="root"
p:password="mysql1994assad" />
<!--配置JDBC模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dataSource" />
<!--配置事务管理器,略-->
<!--配置事务增强,略-->
<!--扫描 DAO bean-->
<context:component-scan base-package="site.assad.dao" />
</beans>
建立 Domain 领域对象
package site.assad.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable{
private int id;
private String name;
private String password;
private Date createDate ;
//省略 getter setter
}
建立 DAO 对象
package site.assad.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.stereotype.Repository;
import site.assad.domain.User;
import java.sql.ResultSet;
import java.sql.SQLException;
//将 UserDao 标注为一个 DAO Bean
@Repository
public class UserDao {
//自动注入 JdbcTemplate bean 对象
@Autowired
private JdbcTemplate jdbcTemplate;
//演示查询操作:通过 userName 入参查找数据库中的相应 User 对象
public User findUserByUserName(final String userName){
//sql 模板
String sqlStr = "SELECT user_id,user_name,user_password,create_date " +
"FROM users where user_name = ?";
//创建接受结果的 domain 对象
final User user = new User();
//通过 jbdcTemplate 执行 sql 查询语句,参数1:sql 模板语句,参数2:sql 模板语句中占位符的实参,参数3:对于查询结果的回调逻辑
jdbcTemplate.query(sqlStr, new Object[]{userName}, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
user.setId(rs.getInt("user_id"));
user.setName(rs.getString("user_name"));
user.setPassword(rs.getString("user_password"));
user.setCreateDate(rs.getDate("create_date"));
}
});
return user;
}
}
通过DAO对象获取领域对象
User user = userDao.findUserByUserName("Al-assad");
System.out.println(user);
package site.assad.dao;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
@ContextConfiguration(locations = {"classpath:site/assad/applicationContext.xml"}) //通过注解指定配置文件路径
public class UserDaoTest {
@Autowired //自动注入 UserDao
private UserDao userDao;
@Test
......
}
对于 Spring 配置文件的加载
<web-app .... >
<!--加载 Spring 配置,进行 bean 的初始化-->
<!--指定配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:site/assad/applicationContext.xml</param-value>
</context-param>
<!--声明 web 容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
Application ctx = new ClassPathXmlApplicationContext("site/assad/applicationContext.xml");
UserDao userDao = ctx.getBean("userDao",UserDao.class);
User user = userDao.findUserByUserName("Al-assad");
System.out.println(user);
基本的数据操作
更改数据
1)基本操作
public void addUser (final User user){
//创建 sql 模板
String sqlStr = "INSERT INTO users(user_name,user_password,create_date,user_icon) " +
" VALUES(?,PASSWORD(?),?,?)";
//通过 jdbcTempalte 模板更新数据
jdbcTemplate.update(sqlStr,new Object[]{user.getName(),user.getPassword(),user.getCreateDate(),user.getIcon()});
}
2)批量操作
public void addUsers(final List<User> userList){
final String sql = "INSERT INTO users(user_name,user_password,create_date,user_icon) " +
"VALUES (?,PASSWORD(?),?,?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override //指定该批次的记录数
public int getBatchSize() {
return userList.size();
}
@Override //绑定插入的参数
public void setValues(PreparedStatement ps, int i) throws SQLException {
User user = userList.get(i);
ps.setString(1,user.getName());
ps.setString(2,user.getPassword());
ps.setDate(3, new java.sql.Date(user.getCreateDate().getTime()));
ps.setString(4,user.getIcon());
}
});
}
查询数据
1)处理单值查询数据
<T> queryForObject(String sql, [Object[] args ,] Class<T> requiredType)
<T> queryForObject(String sql, [Object[] args ,] RowMapper<T> RowMapper)
//演示单值查询
//返回int值的查询
public int getUserCount(){
final String sql = "SELECT COUNT(*) FROM users";
return jdbcTemplate.queryForObject(sql,Integer.class);
}
//返回User类型的查询
public User findUserByName(final String username){
final String sqlStr = "SELECT user_id,user_name,user_password,create_date " +
"FROM users where user_name = ?";
return jdbcTemplate.queryForObject(sqlStr,new Object[]{username},User.class);
}
2)处理单行结果
//演示查询操作(使用 RowCallbackHandler 处理结果集,单结果返回)
public User findUserByUserName(final String userName){
final String sqlStr = "SELECT user_id,user_name,user_password,create_date " +
"FROM users where user_name = ?"; //sql 模板
final User user = new User(); //创建接受结果的 domain 对象
//通过 jbdcTemplate 执行 sql 查询语句
jdbcTemplate.query(sqlStr, new Object[]{userName}, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
user.setId(rs.getInt("user_id"));
user.setName(rs.getString("user_name"));
user.setPassword(rs.getString("user_password"));
user.setCreateDate(rs.getDate("create_date"));
}
});
return user;
}
3)处理多行结果
//演示查询操作(使用 RowMapper<T> 处理结果集,多结果)
public List<User> findUserByIconV2(final String icon){
final String sql = "SELECT user_id,user_name,create_date,user_icon " +
"FROM users " +
"WHERE user_icon = ?";
return jdbcTemplate.query(sql, new Object[]{icon}, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getInt("user_id"));
user.setName(rs.getString("user_name"));
user.setCreateDate(rs.getDate("create_date"));
user.setIcon(rs.getString("user_icon"));
return user;
}
});
}
//演示查询操作(使用 RowCallbackHandler 处理结果集,多结果返回)
public List<User> findUserByIcon(final String icon){
final String sql = "SELECT user_id,user_name,create_date,user_icon " +
"FROM users " +
"WHERE user_icon = ?";
final List<User> usersList = new ArrayList<>(); //记录结果集
jdbcTemplate.query(sql, new Object[]{icon}, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getInt("user_id"));
user.setName(rs.getString("user_name"));
user.setCreateDate(rs.getDate("create_date"));
user.setIcon(rs.getString("user_icon"));
usersList.add(user);
}
});
return usersList;
}
调用储存过程
<T>T execute(String callString,CallableStatmentCallback<T> action)
<T>T execute(CallableStatementCreator csc,CallableStatmentCallback<T> action)
delimeter //
CREATE PROCESS get_user_count(IN in_user_age INT, OUT out_num INT)
BEGIN
SELECT COUNT(*) INTO out_num FROM users WHERE user_age = in_user_age;
END
delimeter ;
public int getUserCountWithAge(int age){
String sql = "{call get_user_count(?,?)}";
Integer num = jdbcTemplate.execute(sql, new CallableStatementCallback<Integer>() {
@Override
public Integer doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
cs.setInt(1,age);
cs.registerOutParameter(2, Types.INTEGER);
cs.execute();
return cs.getInt(2);
}
});
return num;
}
处理特殊类型的数据
处理Date,DateTime型数据
//将java.util.Date 转换为 java.sql.Date
java.sql.Date sqlDate = new java.util.Date().getTime();
//将特定日期的 java.util.Date 转换为 java.sql.Date
String dateStr = "2017-12-14";
java.util.Date date = new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
处理LOB(BLOB/CLOB)型数据
<!--用于操作 LOB 对象的配置-->
<!--配置本地JDBC对象抽取器-->
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"
lazy-init="true" />
<!--使用本地jdbc对象抽取-->
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"
lazy-init="true" />
C3P0 数据源 | org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor |
DBCP 数据源 | org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor |
JBoss 3.2.4 + 的数据源 | org.springframework.jdbc.support.nativejdbc.JBossNativeJdbcExtractor |
WebLogic 8.1+ 的数据源 | org.springframework.jdbc.support.nativejdbc.WebLogicNativeJdbcExtractor |
WebSphere 5.1+ 的数据源 | org.springframework.jdbc.support.nativejdbc.WebSphereNativeJdbcExtractor |
ObjectWeb 的 XAPool 数据源 | org.springframework.jdbc.support.nativejdbc.XaPoolNativeJdbcExtractor |
插入 LOB 类型数据
//演示对于 LOB 类型数据的插入
public void addGame(final Game game){
final String sql = "INSERT INTO games(game_name,game_description,game_thumbnail) " +
"VALUES(?,?,?)";
jdbcTemplate.execute(sql,new AbstractLobCreatingPreparedStatementCallback(this.lobHandler) {
@Override
protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException, DataAccessException {
ps.setString(1,game.getName());
lobCreator.setClobAsString(ps,2,game.getDescription()); //设置 CLOB 字段
lobCreator.setBlobAsBytes(ps,3,game.getThumbnail()); //设置 BLOB 字段
}
});
}
@Test
public void testAddGame() throws Exception{
Resource imgRes = new ClassPathResource("tmp.jpg");
byte[] mockImg = FileCopyUtils.copyToByteArray(imgRes.getFile());
Game game = new Game();
game.setName("test.io");
game.setDescription("this is test clob text");
game.setThumbnail(mockImg);
gameDao.addGame(game);
}
读取 LOB 类型数据
//以块数据方式读取 LOB
public Game getGameByName(final String gamename){
final String sql = "SELECT game_id,game_name,game_description,game_thumbnail " +
"FROM games " +
"WHERE game_name = ?";
Game game = new Game();
jdbcTemplate.query(sql, new Object[]{gamename}, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
game.setId(rs.getInt("game_id"));
String description = lobHandler.getClobAsString(rs,3); //读取CLOB类型数据
byte[] thumbnail = lobHandler.getBlobAsBytes(rs,4); //读取BLOB类型数据
game.setDescription(description);
game.setThumbnail(thumbnail);
}
});
return game;
}
//以流数据方式读取 LOB
public void getGameThumbnailByName(final String gamename,final OutputStream out){
final String sql = "SELECT game_thumbnail " +
"FROM games " +
"WHERE game_name = ?";
Game game = new Game();
jdbcTemplate.query(sql, new Object[]{gamename},
new AbstractLobStreamingResultSetExtractor<Game>() {
@Override
protected void streamData(ResultSet rs) throws SQLException, IOException, DataAccessException {
InputStream in = lobHandler.getBlobAsBinaryStream(rs,1);
if(in != null)
FileCopyUtils.copy(in,out);
}
});
}
@Test
public void testGetThumbnailByName() throws FileNotFoundException {
FileOutputStream fileOut = new FileOutputStream("./temp.jpg");
gameDao.getGameThumbnailByName("test.io",fileOut);
}
)处理单值数据
<T> queryForObject(String sql, [Object[] args ,] RowMapper<T> RowMapper)
Spring DAO(2):Spring JDBC 访问数据库相关推荐
- Java程序员从笨鸟到菜鸟之(七十八)细谈Spring(七)spring之JDBC访问数据库及配置详解
利用spring访问数据库是我们ssh程序中必不可少的步骤,在没有hibernate之前,我们一般都用jdbc访问数据库,所以用jdbc访问数据库必不可少的要进行一些配置,spring中为我们提供了访 ...
- jsp学习 jdbc访问数据库
因为我目前在学校有一门课程叫做javaweb,其中涉及到JavaScript中进行数据库访问的测试,经过学习发现与我们之前通过配置数据源结合spring提供的模板以及mybatis提供的方法进行数据库 ...
- JDBC访问数据库的基本程序
2019独角兽企业重金招聘Python工程师标准>>> 以下是jdbc访问数据库的基本程序,今后有时间再完善下. //属性配置文件 db.properties driver = co ...
- android web 访问数据库,Web下的JDBC访问数据库的基本步骤
Web下的JDBC访问数据库的基本步骤 (2012-06-02 12:09:33) 在Java程序中连接数据库的一般步骤分为一下几部分,我摘录出来,跟大家分享. (1)将数据库的JABC驱动加载到cl ...
- java web中Jdbc访问数据库步骤通俗解释(吃饭),与MVC的通俗解释(做饭)
一.Jdbc访问数据库步骤通俗解释(吃饭) 1)加载驱动 Class.forName("com.microsoft.jdbc.sqlserver.SQLServer"); 2) 与 ...
- JDBC访问数据库步骤
最近开始复习JAVASE,下面就看看一些之前忘记的点. JDBC访问数据库是之前自己比较迷糊的,现在正好来复习一下.数据库连接首先要有一个JDBC驱动程序,还要有一个数据库,这里两者不属于JAVA的知 ...
- Spring JDBC-使用Spring JDBC访问数据库
概述 使用Spring JDBC 基本的数据操作 更改数据 返回数据库表的自增主键值 批量更改数据 查询数据 使用RowCallbackHandler处理结果集 使用RowMapperT处理结果集 R ...
- Spring实战6-利用Spring和JDBC访问数据库
主要内容 定义Spring的数据访问支持 配置数据库资源 使用Spring提供的JDBC模板 写在前面:经过上一篇文章的学习,我们掌握了如何写web应用的控制器层,不过由于只定义了SpitterRep ...
- Spring Boot中使用JdbcTemplate访问数据库
本文介绍在Spring Boot基础下配置数据源和通过JdbcTemplate编写数据访问的示例. 数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式. ...
- python通过jdbc访问数据库
python通过jdbc连接数据库 python要访问sybase或oracle数据库,尝试通过odbc以及pyodbc等方式去访问数据库,一直没有成功,通过JayDeBeApi模块调用 java j ...
最新文章
- SO做了Booked之后,一直处理于“已延交”,发运事务处理的活动区变灰
- 【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档(转
- 收藏吧!产品再要求实现这个功能,就把这篇转给他!
- linux mint(Ubuntu、Debian) 18修改环境变量
- MM 常用table
- 人人都可以创造自己的AI:深度学习的6大应用及3大成熟领域
- php sql查看本月记录,SQL Server 获取本周,本月,本年等时间内记录
- 如何调整html中音乐播放器的大小,html5实现在线响应式音乐播放器
- strtof linux内核,Qt for Android使用grpc探索
- 透明色的rgb值是多少_一文掌握PPT主题色原理及使用技巧
- java future 设计模式_转多线程设计模式 - Future模式之JAVA原生实现
- 初探 Linux操作系统 (一):站在巨人的肩膀上
- 2022.02.17学习总结(最小生成树)
- 一文了解各大图数据库查询语言(Gremlin vs Cypher vs nGQL)| 操作入门篇
- 郭彦甫Matlab第五节笔记——进阶绘图
- API_Application
- 文化中国 系列二:纪连海读历史品人物
- MySQL ---允许所有ip远程连接数据库
- 机器学习 基本概念/术语
- 电路知识经典汇总(邱关源)
热门文章
- Nginx Oracle反向代理与负载均衡配置
- SQL Server 数据库之事务
- 爬虫被锁IP,报“很抱歉,由于您访问的URL有可能对网站造成安全威胁,您的访问被阻断。 您的请求ID是······“
- C语言实现简单的Web服务器
- java在线玩具租赁系统
- ThinkPHP漏洞利用
- Spring 如何解决循环依赖问题
- 江西医院的智康护智慧医疗解决方案
- MySQL表记录检索
- Android中测试多国语言漏翻的情况(一)