一,回顾

aop:面向切面编程,就是将一些和主业务流程没有关系的公共代码,提取封装到切面类,通过切入点规则,可以对目标方法进行功能增强;也就是可以再目标方法执行的前后添加一段额外逻辑代码;

二,JdbcTemplate模板类

spring框架对数据库的操作在jdbc基础上做了封装,使用spring依赖注入功能,可以吧DataSource(数据源,链接地址,账号,密码,驱动类)注入给JdbcTemplate模板类中,然后就可以使用JdbcTemplate工具类对数据表进行增删改查操作

1、数据库和表

create table userInfo(
id int not null primary key auto_increment,
no char(4) not null unique,
name varchar(20) not null,
pwd varchar(20) not null,
sex int not null,
age int not null
)
insert into userInfo values(0,'U001','小明','123456',1,20);
insert into userInfo values(0,'U002','小红','123456',0,18);
insert into userInfo values(0,'U003','小方','123456',1,21);

2、添加依赖

<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.0.RELEASE</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.0.RELEASE</version>
</dependency>
<!-- spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.0.RELEASE</version>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>

3、配置数据源DataSource

(1)在src目录中新建jdbc.properties配置文件

jdbc.url=jdbc:mysql://127.0.0.1:3306/spring-test?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

(2)在spring.xml中引用资源配置文件

<!-- 引用配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>

(3)在spring.xml中配置数据源以及使用配置文件中的key

<!-- 数据源配置 :配置连接地址、账号、密码;下面的url、username、password属性来自于DriverManagerDataSource的父类AbstractDriverBasedDataSource-->
<bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>

4、注册JdbcTemlate模板工具类

在spring.xml中配置工具类

<!-- 注册jdbcTemplate工具类实例    dataSource属性就是数据源-->
<bean id="jdbcTemplate1" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource1"></property>
</bean>

5、UserInfo实体类

@Data
public class UserInfo {
private Integer id;
private String no;
private String name;
private String pwd;
private Integer sex;
private Integer age;
}

6、UserInfoDao接口

public interface UserInfoDao {
//添加
void add(UserInfo user);
}

7、UserInfoDaoImpl实现类

@Data
public class UserInfoDaoImpl implements UserInfoDao { //工具类
private JdbcTemplate jdbcTemplate; @Override
public void add(UserInfo user) {
//update()可以执行增删改,后面的参数可以可变类型,依次为SQL语句中的?赋值
String sql = "insert into userInfo values(0,?,?,?,?,?)";
jdbcTemplate.update(sql, user.getNo(),user.getName(),user.getPwd(),user.getSex(),user.getAge());
} }

这里的jdbcTemplate属性,必须有set和get方法,否则spring不能正常给它注入实例

8、注册UserInfoDaoImpl实例

在spring.xml中注册

<bean id="userInfoDaoImpl" class="com.yujun.maven.dao.impl.UserInfoDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate1"></property>
</bean>

注意的是需要给UserInfoDaoImpl类注入jdbcTemlate的实例

9、添加

public class Demo1 {

    public static void main(String[] args) {
//context上下文对象(spring容器)
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserInfoDao dao = context.getBean("userInfoDaoImpl", UserInfoDao.class); UserInfo user = new UserInfo();
user.setAge(20);
user.setName("明明");
user.setNo("U004");
user.setPwd("123456");
user.setSex(0); dao.add(user);
System.out.println("over...");
} }

10、修改

(1)UserInfoDao接口中添加方法

//修改
void update(UserInfo user);

(2)UserInfoDaoImpl实现类中重写方法

@Override
public void update(UserInfo user) {
String sql = "update userinfo set no=?,name=?,pwd=?,sex=?,age=? where id=?";
jdbcTemplate.update(sql, user.getNo(),user.getName(),user.getPwd(),user.getSex(),user.getAge(),user.getId());
}

(3)测试

public static void main(String[] args) {
//context上下文对象(spring容器)
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserInfoDao dao = context.getBean("userInfoDaoImpl", UserInfoDao.class); UserInfo user = new UserInfo();
user.setId(5);
user.setAge(22);
user.setName("明明5");
user.setNo("U005");
user.setPwd("654321");
user.setSex(1); dao.update(user);
System.out.println("over...");
}

11、删除

(1)UserInfoDao接口中添加方法

//删除
void delete(Integer id);

(2)UserInfoDaoImpl实现类中重写方法

@Override
public void delete(Integer id) {
String sql = "delete from userInfo where id=?";
jdbcTemplate.update(sql, id);
}

(3)测试

public static void main(String[] args) {
//context上下文对象(spring容器)
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserInfoDao dao = context.getBean("userInfoDaoImpl", UserInfoDao.class); dao.delete(5);
System.out.println("over...");
}

三、JdbcTemplate模板类-查询

1、查询单个结果

查询userinfo表中的记录数(count(*))

(1)UserInfoDao接口添加方法

//查询count(*)
int queryCount();

(2)UserInfoDaoImpl实现类重写方法

@Override
public int queryCount() {
String sql = "select count(*) from userInfo";
Integer count = jdbcTemplate.queryForObject(sql, int.class);
return count;
}

(3)测试

public static void main(String[] args) {
//context上下文对象(spring容器)
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserInfoDao dao = context.getBean("userInfoDaoImpl", UserInfoDao.class); int count = dao.queryCount();
System.out.println("总记录数:"+count);
System.out.println("over...");
}

2、查询单一实体对象

根据用户的ID查询出唯一的用户实体数据

(1)UserInfoDao接口添加方法

//根据ID查询唯一数据
UserInfo queryById(Integer id);

(2)UserInfoDaoImpl实现类重写方法

@Override
public UserInfo queryById(Integer id) {
String sql = "select * from userInfo where id=?";
return jdbcTemplate.queryForObject(sql, new RowMapper<UserInfo>() {
//RowMapper是行映射器,需要再mapRow()方法中对每行数据进行映射
@Override
public UserInfo mapRow(ResultSet rs, int rowNum) throws SQLException {
String no = rs.getString("no");
String name = rs.getString("name");
String pwd = rs.getString("pwd");
Integer sex = rs.getInt("sex");
Integer age = rs.getInt("age");
UserInfo user = new UserInfo(id, no, name, pwd, sex, age);
return user;
}
}, id);
}

(3)测试

public static void main(String[] args) {
//context上下文对象(spring容器)
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserInfoDao dao = context.getBean("userInfoDaoImpl", UserInfoDao.class); UserInfo info = dao.queryById(1);
System.out.println(info); System.out.println("over...");
}

3、查询集合对象

(1)UserInfoDao接口添加方法

//根据sex查询数据集合
List<UserInfo> queryBySex(int sex);

(2)UserInfoDaoImpl实现类重写方法

@Override
public List<UserInfo> queryBySex(int sex) {
String sql = "select * from userInfo where sex=?";
return jdbcTemplate.query(sql, new RowMapper<UserInfo>() {
//RowMapper是行映射器,需要再mapRow()方法中对每行数据进行映射
@Override
public UserInfo mapRow(ResultSet rs, int rowNum) throws SQLException {
int id = rs.getInt("id");
String no = rs.getString("no");
String name = rs.getString("name");
String pwd = rs.getString("pwd");
Integer sex = rs.getInt("sex");
Integer age = rs.getInt("age");
UserInfo user = new UserInfo(id, no, name, pwd, sex, age);
return user;
}
}, sex);
}

这里的映射器写法和前面查询单一实体对象一样

(3)测试

public static void main(String[] args) {
//context上下文对象(spring容器)
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserInfoDao dao = context.getBean("userInfoDaoImpl", UserInfoDao.class); List<UserInfo> list = dao.queryBySex(0);
list.forEach(System.out::println); System.out.println("over...");
}

四、补充说明

上面我们使用JdbcTemplate模板工具类完成后简单的增删改查操作,更多详细的操作可以查看官方文档或百度;

在上面的案例中,有2个问题需要被完善:

(1)       数据源没有使用连接池技术

(2)       数据源没有事务的支持

关于上述两个问题,我们会在下次课spring+hibernate中一起完善;

spring-第三章-jdbc的更多相关文章

  1. spring第三章

    第三章 实现AOP AOP:面向方面编程,AOP能够使您将所有模块共有的特性与应用程序的主要业务逻辑隔离开 一.AOP介绍 横切关注点:在Web应用程序中,有一些服务(如登录.安全和事务管理)不是应用 ...

  2. spring boot 笔记--第三章

    spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...

  3. 一起来学Spring Cloud | 第三章:服务消费者 (负载均衡Ribbon)

    一.负载均衡的简介: 负载均衡是高可用架构的一个关键组件,主要用来提高性能和可用性,通过负载均衡将流量分发到多个服务器,多服务器能够消除单个服务器的故障,减轻单个服务器的访问压力. 1.服务端负载均衡 ...

  4. Spring 学习指南 第三章 bean的配置 (未完结)

    第三章 bean 的配置 ​ 在本章中,我们将介绍以下内容: bean 定义的继承: 如何解决 bean 类的构造函数的参数: 如何配置原始类型 (如 int .float 等) .集合类型(如 ja ...

  5. 《精通Spring4.x企业应用开发实战》第三章

    这一章节主要介绍SpringBoot的使用,也是学习的重点内容,之后就打算用SpringBoot来写后台,所以提前看一下还是很有必要的. 3.SpringBoot概况 3.1.1SpringBoot发 ...

  6. Spring第三天

    Spring第三天 整体课程安排(3天+2天): 第一天:Spring框架入门.IoC控制反转的配置管理.Spring Web集成.Spring Junit集成. 第二天:Spring AOP面向切面 ...

  7. 第六章 JDBC

    第一章 JDBC 一.JDBC的简介 1.什么是JDBC JDBC是java数据库连接(java database connectivity)技术的简称,它充当了java应用程序与各个不同数据库之间进 ...

  8. 第三章Hibernate关联映射

    第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...

  9. 一起来学Spring Cloud | 第二章:服务注册和发现组件 (Eureka)

    本篇文章,很浅显的一步步讲解如何搭建一个能运行的springcloud项目(带所有操作截图).相信!看完本篇之后,你会觉得springcloud搭建如此简单~~~~ 一. Eureka简介: 1.1  ...

随机推荐

  1. PAT (Advanced Level) Practice 1001 A+B Format (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1001 A+B Format (20 分) 凌宸1642 题目描述: Calculate a+b and output the sum i ...

  2. Kubernetes中利用Kubectl set 让Deployment更新镜像

    问题描述 我的deployment有单个pod,我的自定义docker镜像如下: containers: - name: mycontainer image: myimage:latest 在开发过程 ...

  3. BUAA_OO_2020_第四单元与课程总结

    BUAA_OO_2020_第四单元与课程总结 第四单元架构 第一次 架构设计 第一次作业要求实现UML类图解析器. 我才用自顶向下依次解析的方法,首先将类图中涉及的所有元素分成三层: 第一层 第二层 ...

  4. 两种纯CSS方式实现hover图片pop-out弹出效果

    实现原理 主要图形的组成元素由背景和前景图两个元素,以下示例代码中,背景元素使用伪元素 figure::before 表示, 前景元素使用 figure img 表示,当鼠标 hover 悬浮至 fi ...

  5. kestrel Server的源码分析

    今天这一篇博客讲的是.net core 自带的kestrel server,当你开发微服务k8s部署在linux环境下,一般默认开启这个高性能服务,如果大家之前看过我的owin katana的博客,会 ...

  6. Spring(四)Spring JdbcTemplate&声明式事务

    JdbcTemplate基本使用 01-JdbcTemplate基本使用-概述(了解) JdbcTemplate是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装.spr ...

  7. matlab通用命令

    常用命令 命令 命令说明 cd 显示或改变当前文件夹 dir 显示当前文件夹或指定目录下的文件 clc 清除工作窗中的所有显示内容 home 将光标移至命令行窗口的最左上角 clf 清除图形窗口 ty ...

  8. vue项目打包本地后通过nginx解决跨域

    前言 有时候我们打包好vue项目让后端人员部署项目时可能会有小插曲,为了不麻烦后端人员和避免尴尬,最好的办法就是在本地自己先测一下,而在本地运行打包后的项目会遇到接口跨域的问题.我平时经常用的方法就是 ...

  9. DDD实践反思

    某大型互联网公司于2019年开始在XX中台财务域进行DDD实践.事后回顾,整体并没有达到预期的效果,个人也做了很多的反思和总结,形成此文. 1. 背景 为什么当时要实践DDD?其中的缘由比较复杂,可以 ...

  10. PHP laravel系列之Blade模版

    一.什么是Blade模版? Blade 是 Laravel 提供的一个既简单又强大的模板引擎. 和其他流行的 PHP 模板引擎不一样,Blade 并不限制你在视图中使用原生 PHP 代码.所有 Bla ...