JdbcTemplate概述:
它是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装。spring框架为我们提供了很多的操作 模板类。例如:操作关系型数据的JdbcTemplate和HibernateTemplate,操作nosql数据库的RedisTemplate,操 作消息队列的JmsTemplate等等。
JdbcTemplate开发步骤:
① 导入spring-jdbc和spring-tx坐标
② 创建数据库表和实体
③ 创建JdbcTemplate对象
④ 执行数据库操作
确保有JDBC 和 内个 C3P0 的gav 下面要用到.
① 导入坐标
<!--导入spring的jdbc坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--导入spring的tx坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
② 创建数据库表和对应的 JavaBean
③ 创建JdbcTemplate对象
④ 执行数据库操作
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import java.beans.PropertyVetoException;
public class TestJdbcTemplate {
//这个是测试Class
@Test
public void Test() throws PropertyVetoException {
//新建一个C3P0的数据源 ,确保导入gav即可
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver"); //抛出一个异常
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc");
dataSource.setUser("root");
dataSource.setPassword("root");
//new一个JdbcTemplate 模板对象
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//设置数据源 这里的数据源我们用C3P0的吧 【数据源就是配置数据库】
jdbcTemplate.setDataSource(dataSource);
//执行语句 支持预编译 然后后面补充即可 和C语言的内个语法相似
jdbcTemplate.update("insert into user values(?,?)","BiHu",18);
}
}
所以 这就是这个SpringMVC的JDBC模板的基本操作(SQL语句)。 上面演示的是Updata ,他可以增删改,查询下面讲
还可以让Spring 帮我们生成 这个JdbcTemplate ,其实也学过,其实就是之前内中Spring配置中注入的,当然这个也可以...感觉好无语 一直学这些..
首先创建一个Spring的配置文件 、
我们可以将JdbcTemplate的创建权交给Spring,将数据源DataSource的创建权也交给Spring,在Spring容器内部将 数据源DataSource注入到JdbcTemplate模版对象中,配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置C3P0-->
<bean id="c3p0" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/jdbc"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</bean>
<!--配置 TestJdbcTemplate -->
<bean id="TestJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="c3p0"></property>
</bean>
</beans>
下面是测试: Test.java:
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import java.beans.PropertyVetoException;
public class TestJdbcTemplate {
//这个是测试Class
@Test
public void Test() throws PropertyVetoException {
ApplicationContext app = new ClassPathXmlApplicationContext("Application.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate)app.getBean("TestJdbcTemplate");
jdbcTemplate.update("insert into user values(?,?)","BIHU",18);
}
}
View Code
当然你也可以自己用内个 parameter 内个文件导入 然后用${jdbc.xx} 这样来读取 你怎么这样的话 解耦更高一点
查
其实这个JDBC模板给我们的查询非常的方便,还可以直接封装到JavaBean 中:
查询是 query 方法,封装是 BeanPropertyRowMapper 这个类 它实现了 RowMapper接口 ,其实翻译就是: 实体类属性行映射
import com.bihu.Bean.User;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.beans.PropertyVetoException;
import java.util.List;
public class TestJdbcTemplate {
//这个是测试Class
@Test
public void Test() throws PropertyVetoException {
//已经通过Spring文件配置好了内个JDBC模板对象
ApplicationContext app = new ClassPathXmlApplicationContext("Application.xml");
JdbcTemplate JdbcTemplate = (JdbcTemplate)app.getBean("TestJdbcTemplate");
//下面进行查询操作: 封装其实是这个类:BeanPropertyRowMapper 你可以去他内部看看,他有个泛型【封装的Bean类型】,参数是Bean类型的Class
List<User> List = JdbcTemplate.query("select * from user", new BeanPropertyRowMapper<User>(User.class));
//然后我们打印一下【由于已经ToString】
for (User item : List){
//你也可以直接: System.out.println(list);
System.out.println(item);
}
}
}
上面那个是实现查询全部的 返回额是 List<T> ,其实也可以预编译,他有很多重载的方法,其中包含了预编译(查询条件语句)你可以去看看 。
下面就有查询单个的: 用法差不多 但是呢 他只能查询一个 查到多个会报错 ,他返回的是一个Bean:
JdbcTemplate方法
这个方法还有很多重载更方便【具体自己百度API即可】,支持 预编译 + 查询 = 查询某个数据然后 封装对象:
import com.bihu.Bean.User;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.beans.PropertyVetoException;
import java.util.List;
public class TestJdbcTemplate {
//这个是测试Class
@Test
public void Test() throws PropertyVetoException {
//已经通过Spring文件配置好了内个JDBC模板对象
ApplicationContext app = new ClassPathXmlApplicationContext("Application.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate)app.getBean("TestJdbcTemplate");
//下面进行查询操作:
//要注意的是 他这个查询的话 他不区分大小写 如果找到两三个的话会报异常 因为这个是单个查询
User user = jdbcTemplate.queryForObject("select * from user where name=?", new BeanPropertyRowMapper<User>(User.class), "bihu");
System.out.println(user.getName());
}
}
你还可用 queryForObject 这个 方法使用聚合函数 下面以 count 为例:
其实吧 你结合起来 ,实战哪里 你会用list.size的.....
但是这个是使用mysql的聚合函数,效率肯定比你查找出某个然后list.size高啊
import com.bihu.Bean.User;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.beans.PropertyVetoException;
import java.util.List;
public class TestJdbcTemplate {
//这个是测试Class
@Test
public void Test() throws PropertyVetoException {
//已经通过Spring文件配置好了内个JDBC模板对象
ApplicationContext app = new ClassPathXmlApplicationContext("Application.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate)app.getBean("TestJdbcTemplate");
//下面进行聚合函数查询操作:下面举例子 count 聚合函数
Long aLong = jdbcTemplate.queryForObject("select count(*) from user", Long.class);
System.out.println(aLong);
}
}
插入操作不用new 那个 行注入映射,一般查询才要
作者:咸瑜