spring jdbc
Spring JDBC是Spring框架中用于处理关系型数据库的一个模块,它主要目的是降低JDBC API的使用难度,以一种更直接、更简洁的方式使用JDBC API。Spring JDBC对JDBC API进行了封装,提供了JdbcTemplate等核心类,极大地简化了数据库操作的开发工作量。
1. 环境搭建
spring-beans
spring-context
spring-core
spring-experssion
spring-jcl
druid
mysql-connector-java
spring-jdbc
spring-aop 间接依赖
spring-tx 事务管理
XXXXTemplate:其他架构模板—操作其他架构的模板
2. JdbcTemplate
用于操作jdbc的模板
import javax.sql.DataSource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.alibaba.druid.pool.DruidDataSource;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class Test01 {
@Autowired
JdbcTemplate jdbcTemplate;
@Test
public void test01() {
// JdbcTemplate template =new JdbcTemplate();
// 操作的数据库是什么??身份认证怎么做
// 连接池---
DruidDataSource ds=new DruidDataSource();
// 设置驱动、url、用户名、密码、连接池的设置(初始化连接数、最大连接数、超时时间)
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql:///java2201q");
ds.setUsername("root");
ds.setPassword("123456");
// 详细的连接池设置
ds.setInitialSize(2);
JdbcTemplate template = new JdbcTemplate(ds);
String sql="select count(*) from b_user";
Integer num = template.queryForObject(sql, Integer.class);
System.out.println(num);
}
@Test
public void test012() {
String sql="select count(*) from b_user";
Integer num = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(num);
}
@Test
public void test02() {
DruidDataSource ds=new DruidDataSource();
// 设置驱动、url、用户名、密码、连接池的设置(初始化连接数、最大连接数、超时时间)
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql:///java2201q");
ds.setUsername("root");
ds.setPassword("123456");
// 详细的连接池设置
ds.setInitialSize(2);
JdbcTemplate template = new JdbcTemplate();
template.setDataSource(ds);
String sql="select count(*) from b_user";
Integer num = template.queryForObject(sql, Integer.class);
System.out.println(num);
}
}
package com.sofwin.test;
import javax.sql.DataSource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.alibaba.druid.pool.DruidDataSource;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class Test01 {
@Autowired
JdbcTemplate jdbcTemplate;
@Test
public void test01() {
// JdbcTemplate template =new JdbcTemplate();
// 操作的数据库是什么??身份认证怎么做
// 连接池---
DruidDataSource ds=new DruidDataSource();
// 设置驱动、url、用户名、密码、连接池的设置(初始化连接数、最大连接数、超时时间)
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql:///db1");
ds.setUsername("root");
ds.setPassword("123456");
// 详细的连接池设置
ds.setInitialSize(2);
JdbcTemplate template = new JdbcTemplate(ds);
String sql="select count(*) from b_user";
Integer num = template.queryForObject(sql, Integer.class);
System.out.println(num);
}
@Test
public void test012() {
String sql="select count(*) from b_user";
Integer num = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(num);
}
@Test
public void test02() {
DruidDataSource ds=new DruidDataSource();
// 设置驱动、url、用户名、密码、连接池的设置(初始化连接数、最大连接数、超时时间)
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql:///java2201q");
ds.setUsername("root");
ds.setPassword("123456");
// 详细的连接池设置
ds.setInitialSize(2);
JdbcTemplate template = new JdbcTemplate();
template.setDataSource(ds);
String sql="select count(*) from b_user";
Integer num = template.queryForObject(sql, Integer.class);
System.out.println(num);
}
}
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql:///java2201q"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
<property name="initialSize" value="2"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- <constructor-arg index="0" ref="dataSource"></constructor-arg>
-->
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
方法名 | 返回结果 | 描述 |
---|---|---|
update(String sql) | 影响行数 | insert,delete,update,执行静态sql |
update(String sql,Object…args) | insert,delete,update动态sql,可变参数为动态sql赋值 | |
batchUpdate(String…sql) | 数组 | 执行批处理程序 |
queryForObject(String sql, Class requiredType) | T | 查询结果的条数<=1,类对象(简单类型的类对象) 执行静态sql |
queryForObject(String sql, Class requiredType, @Nullable Object… args) | T | 查询结果的条数<=1,类对象(简单类型的类对象) 执行动态sql |
queryForObject(String sql, RowMapper rowMapper) | T | 查询结果的条数<=1,自定义类型的结果的映射 RowMapper定义映射规则==ResultMap 静态sql |
queryForObject(String sql, RowMapper rowMapper, @Nullable Object… args) | 查询结果的条数<=1,自定义类型的结果的映射 RowMapper定义映射规则==ResultMap 动态SQL | |
queryForMap(String sql) | Map<String[key],Object> | 将查询结果封装为map |
queryForList(String sql) | List<Map<String, Object>> | 集合中map的key列名,value为值 |
queryForList(String sql, Class elementType) | List | 参数2为简单类型的类对象,查询结果的泛型也是简单类型,查询结果的列数只能是一条 |
query(String sql, RowMapper rowMapper) | List | 泛型为自定义类型,参数2结果映射规则 |
execute(String sql) | 执行create |
3. JdbcDaoSupport
所有的dao继承JdbDaoSupport,包含有jdbcTemplate ,setDataSource,在dao中注入dataSource,super.jdbcTemplate来获取JdbcTemplate
import static org.junit.Assert.assertEquals;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.alibaba.druid.pool.DruidDataSource;
import com.sofwin.dao.UserDao;
import com.sofwin.pojo.User;
import com.sofwin.pojo.UserMapper;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class Test01 {
// @Autowired
JdbcTemplate jdbcTemplate;
@Autowired
UserDao dao;
@Test
public void test01() {
// JdbcTemplate template =new JdbcTemplate();
// 操作的数据库是什么??身份认证怎么做
// 连接池---
DruidDataSource ds=new DruidDataSource();
// 设置驱动、url、用户名、密码、连接池的设置(初始化连接数、最大连接数、超时时间)
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql:///java2201q");
ds.setUsername("root");
ds.setPassword("123456");
// 详细的连接池设置
ds.setInitialSize(2);
JdbcTemplate template = new JdbcTemplate(ds);
String sql="select count(*) from b_user";
Integer num = template.queryForObject(sql, Integer.class);
System.out.println(num);
}
@Test
public void test012() {
String sql="select count(*) from b_user";
Integer num = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(num);
}
@Test
public void test02() {
DruidDataSource ds=new DruidDataSource();
// 设置驱动、url、用户名、密码、连接池的设置(初始化连接数、最大连接数、超时时间)
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://db1");
ds.setUsername("root");
ds.setPassword("123456");
// 详细的连接池设置
ds.setInitialSize(2);
JdbcTemplate template = new JdbcTemplate();
template.setDataSource(ds);
String sql="select count(*) from b_user";
Integer num = template.queryForObject(sql, Integer.class);
System.out.println(num);
}
@Test
public void testInsert() {
String sql="insert into b_user(login_name,pwd) values('sofwin11211','sofwin12121')";
int flag = jdbcTemplate.update(sql);
assertEquals(1, flag);
}
@Test
public void testInsertBatch() {
String sql="insert into b_user(login_name,pwd) values('sofwin11211','sofwin12121')";
String sql2="insert into b_user(login_name,pwd) values('sofwin11211a','sofwin12121a')";
int[] flag = jdbcTemplate.batchUpdate(sql,sql2);
assertEquals(2, flag.length);
}
@Test
public void testUpdate() {
String sql="update b_user set login_name=? where id=?";
int flag = jdbcTemplate.update(sql, "中国",17);
assertEquals(1, flag);
}
@Test
public void testDelete() {
String sql ="delete from b_user where id=?";
int flag = jdbcTemplate.update(sql, 17);
assertEquals(1, flag);
}
@Test
public void testQueryForObject01() {
String sql ="select count(*) from b_user where id>?";
Integer flag = jdbcTemplate.queryForObject(sql, Integer.class,10);
System.out.println(flag);
}
@Test
public void testQueryById() {
String sql="select * from b_user where id=2";
User user = jdbcTemplate.queryForObject(sql, new UserMapper());
System.out.println(user);
}
@Test
public void testQueryById2() {
String sql="select * from b_user where id=?";
User user = jdbcTemplate.queryForObject(sql, new UserMapper(), 2);
}
@Test
public void testQueryForMap() {
String sql ="select * from b_user where id=2";
Map<String, Object> map = jdbcTemplate.queryForMap(sql);
System.out.println(map);
}
@Test
public void testQueryForList() {
String sql ="select * from b_user where id>?";
List<Map<String, Object>> users = jdbcTemplate.queryForList(sql,0);
for (Map<String, Object> user : users) {
System.out.println(user);
}
}
@Test
public void testQueryForList2() {
String sql="select id from b_user where id>?";
// 集合中泛型的类型
List<Integer> ids = jdbcTemplate.queryForList(sql, Integer.class,1);
for (Integer id : ids) {
System.out.println(id);
}
}
@Test
public void testQueryForList3() {
String sql="select * from b_user";
List<User> users = jdbcTemplate.query(sql,new UserMapper());
for (User user : users) {
System.out.println(user.getLastLoginDate());
}
}
@Test
public void testQueryForList4() {
String sql = "select * from b_user";
List<User> users = new ArrayList();
jdbcTemplate.query(sql, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
users.add(user);
}
});
}
@Test
public void testExecute() {
JdbcDaoSupport a;
String sql ="create table b_test(id int not null primary key,name varchar(20))";
jdbcTemplate.execute(sql);
}
@Test
public void testDao() {
List<User> uses = dao.selectUsers();
}
}
Spring JDBC的优势
简化开发:通过封装JDBC API,简化了数据库操作的开发工作量。
事务管理:在事务管理方面更占优势,能够方便地管理数据库事务。
性能:在某些情况下,处理速度比某些其他框架(如MyBatis)快一点。
Spring JDBC是Spring框架中用于处理关系型数据库的一个强大模块,它通过提供JdbcTemplate等核心类,极大地简化了数据库操作的开发工作量,并具备事务管理、性能优化等优势。