jdbcTemplate实现添加数据功能:
spring框架对jdbc框架进行封装,使用jdbcTemplate方便实现对数据库的操作
Java准备工作:
导入依赖:
<dependencies>
<!-- 实现IOC容器-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<!-- 对象映射:将spring中实现持久化操作-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.1</version>
</dependency>
<!--spring的测试功能:spring整合Junit-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
JdbcTemplate实际上就是Springjdbc框架提供的一个类,而该类的作用能够实现数据的增删改查操作,既然它是一个对象,那么我们就可将其交给IOC容器管理
在XML中配置JdbcTemplate:
在之前的学习中,我们了解到将对象交给IOC容器管理配置方式有两种,我们可以通过注解加扫描的方式,也可以通过在XML文件中配置的方式,由于JdbcTemplate是第三方jar包提供的,因此我们需要在XML文件中进行配置
第一步在XML文件中配置JdbcTemplate类所对应的bean对象:
<bean class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="datasource"></property>
</bean>
既然是想使用JdbcTemplate对数据库进行操作,那么必须先通过数据源连接数据库,因此第二步:创建数据源:
我们既可以直接将连接数据库的属性值写在property标签中,也可以通过引入外部配置文件的方式,一般情况下,我们选择后者,是因为其方灵活性和可配置性较好,如下所示
<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driver" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="name" value="${name}"></property>
<property name="password" value="${password}"></property>
</bean>
将连接数据库的部分写在外部的jdbc.poperties文件中
:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/ssm
name=root
password=root
上述我们在数据源中的使用的属性值在外部的property文件中,那么如何将XML文件和property文件建立联系呢?第三步:通过context约束引入
<context:property-placeholder location=" classpath:jdbc.properties"></context:property-placeholder>
此时我们的配置工作就完成啦!
数据库准备工作:
在已有数据库中创建新的表:
create table t_user (id int,username varchar(20),password varchar(20),age int,gender char(2),email varchar(20));
插入数据:
insert into t_user values(1,"张三","12345",19,"男","2.com");
在Java中进行测试:
spring-test依赖是Spring整合Junit ,那么它如何进行整合的呢?它可以让spring的测试类在spring的环境中进行,这样一来,我们不需要每一次都获取IOC容器,我们可以直接通过依赖注入的方式获取IOC容器中的某个bean
,具体做法:
1:在JdbcTemplate的测试类上加上@RunWith注解
用来设置当前测试类的运行环境,并且将该注解的值设置为
SpringJUnit4ClassRunner.class
,此时就可以直接通过注入的方式获取IOC容器中的bean
2:那么通过这种注入的方式如何获取IOC容器?通过@ContextConfiguration
注解:设置Spring测试环境的配置文件,其注解值为XML文件名
3:通过自动装配的方式
为jdbcTemplate属性赋值,以实现对数据库的操作
代码如下所示:
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;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-transaction.xml")
public class jdbcTemplateTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void TestInsert(){
String sql="insert into t_user (id,username,password,age,gender,email) values (?,?,?,?,?,?)";
jdbcTemplate.update(sql,1,"root","root",23,"女","5.@qq.com");
}
}
控制台输出并无任何报错:
数据库中查询我们创建的表,如下所示:
数据被成功插入!
jdbcTemplate实现查询数据功能:
创建实体类:
package pojo;
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String gender;
private String email;
public User() {
}
public User(Integer id,String username,String password,Integer age, String gender,String email) {
this.id = id;
this.username=username;
this.password=password;
this.age=age;
this.gender=gender;
this.email=email;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", email='" + email + '\'' +
'}';
}
}
查询单条数据:
在测试类中新建TestSelect方法用来查询数据:
@Test
public void selectTest(){
String sql="select * from t_user where id=?";
BeanPropertyRowMapper:用于将ResultSet的单行数据映射到Java对象,使用Java反射来将ResultSet的列与目标Java对象的属性进行匹配和设置值
User user = jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<>(User.class),1);
System.out.println(user);
}
输出如下:
id为1的数据成功被查询
查询多条数据:
@Test
public void TestSelect() {
String sql = "select * from t_user";//查询当前表中的所有数据
List<User> user = jdbcTemplate.query(sql, new BeanPropertyRowMapper(User.class));
System.out.println(user);
}
输出如下所示:
查询单行/单列数据:
@Test
public void TestSelect() {
String sql="select count(*) from t_user";//查询当前表中的记录数
Integer count=jdbcTemplate.queryForObject(sql,Integer.class);
System.out.println(count);
}
显示如下: