男女生做恶心的网站,wordpress 配置ssl,青岛网站建设与管理, 百度一下总结#xff1a;用起来跟 Spring Data JPA 差不多
什么是 JdbcTemplate#xff1f;#xff08;Template译为模板#xff09; Spring 框架对 JDBC 进行封装#xff0c;使用 JdbcTemplate 方便实现对数据库操作
★ Spring Data JDBC
既不需要JPA、Hibernate这种ORM框架用起来跟 Spring Data JPA 差不多
什么是 JdbcTemplateTemplate译为模板 Spring 框架对 JDBC 进行封装使用 JdbcTemplate 方便实现对数据库操作
★ Spring Data JDBC
既不需要JPA、Hibernate这种ORM框架但Spring Data还是提供了面向对象的封装。——它相当于是一种轻量化的持久化技术用起来比Spring JDBC更方便但又不像Spring Data JPA那么需要大量注解、复杂它相当于是一个折中。★ Spring Data JDBC的功能
大致包括如下几方面功能
- DAO接口只需继承CrudRepository或PagingAndSortingRepositorySpring Data JDBC能为DAO组件生成实现类、类似于Spring Data JPA。
- Spring Data JDBC支持方法名关键字查询、类似于Spring Data JPA
- Spring Data JDBC支持用Query定义查询语句。
- Spring Data JDBC同样支持DAO组件添加自定义的查询方法——————通过添加额外的父接口并为额外的该接口提供实现类Spring Data JDBC就能该实现类中的方法“移植”到DAO组件中。
- 一般不支持样本查询也不支持Specification查询。★ Spring Data JDBC VS Spring Data JPA
Spring Data JDBC相当于“轻量化”的Spring Data JPA。
Spring Data JDBC的功能不如Spring Data JPA强大毕竟它底层没有ORM框架的加持。
Spring Data JDBC也不需要处理复杂的ORM映射、实体对象的生命周期管理等
因此Spring Data JDBC用起来更简单。
——Spring Data JDBC有点类似MyBatis★ Spring Data JDBC映射规则
Spring Data JDBC默认的处理方式是“约定优于配置”的同名映射- 程序操作User对象Spring Data JDBC对应于操作user表。
- 对于id数据列自动被映射到对象的id属性。▲Spring Data JDBC的注解- Table映射自定义的表名。非JPA注解
- Column映射自定义的列名非JPA注解
- Id修饰标识属性非JPA注解
- PersistenceConstructor修饰主构造器。当你的映射类中有多个构造器时你希望Spring Data JDBC用哪个构造器来创建对象就用该注解来修饰该构造器。★ Spring Data JDBC操作数据库方法
A. 全自动方法名关键字查询。B. 半自动Query指定查询语句。C. 全手动自己定义查询方法即可用DataSource也用JdbcTemplate。★ Spring Data JDBC的编程步骤
1定义映射类为Java类添加Table、Column、Id和 PersistenceConstructor2让DAO接口继承CrudRepository或PagingAndSortingRepository。3在DAO接口中定义方法名关键字查询、Query查询、完全自定义查询需要额外的接口和实现类代码演示
其实跟 JPA 差不多
User 类 UserDao接口
根据方法名关键字查询---------全自动不用自己写sql的 也有通过注解 Query 进行查询的 —自己定义查询语句-----半自动可以自己写sql语句
也可以自定义Dao接口用来自己写sql和封装数据
自定义接口和实现类来实现数据的查询 一个基于 DataSource 一个基于 jdbcTemplate UserDaoTest 测试
测试类
application.properties pom.xml
一个是 spring data jdbc 的依赖 一个是 mysql 的依赖 创建项目的时候这个 mysql 的依赖老是不完整所以要记录下
完整代码
User
package cn.ljh.app.domain;import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;/*** author JH*/Data
//此处不能添加JPA注解因为此项目没有用到 JPA
Table(user_inf)
public class User
{Column(value user_id)Idprivate Integer id;private String name;private String password;private int age;/*** PersistenceConstructor* 修饰主构造器。当你的映射类中有多个构造器时* 你希望Spring Data JDBC用哪个构造器来创建对象就用该注解来修饰该构造器*/PersistenceConstructorpublic User(){}public User(Integer id, String name, String password, int age){this.id id;this.name name;this.password password;this.age age;}Overridepublic String toString(){return User{ id id , name name \ , password password \ , age age };}
}
UserDao
package cn.ljh.app.dao;import cn.ljh.app.domain.User;
import org.springframework.data.jdbc.repository.query.Modifying;
import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.data.repository.CrudRepository;import java.util.List;public interface UserDao extends CrudRepositoryUser,Integer,CustomUserDao
{// 继承 CrudRepository 接口后就已经有通用的 CRUD 操作无需自己来书写这些方法//方法名关键字查询---------全自动//根据名字模糊查询ListUser findByNameLike(String namePattern);//根据年龄大小进行范围查询ListUser findByAgeGreaterThan(int startAge);ListUser findByAgeLessThan(int age);//根据年龄区间进行范围查询ListUser findByAgeBetween(int startAge , int endAge);//Query 查询 ---自己定义查询语句-----半自动//rowMapperClass 或 rowMapperRef 是用来做自定义映射查询出来的User对象的数据映射到Student对象的属性上面去都可以因为是自定义的。//根据密码模糊查询Query(select * from user_inf where password like :passwordPattern)ListUser findBySql(String passwordPattern);//根据年龄范围修改名字Query(update user_inf set name :name where age between :startAge and :endAge)Modifying //更改数据库数据需要用到这个注解int updateNameByAge(String name , int startAge , int endAge);}CustomUserDao
package cn.ljh.app.dao;import cn.ljh.app.domain.User;import java.util.List;/*** author JH*/
//自己定义的接口用来实现全手动的查询
public interface CustomUserDao
{//通过名字进行模糊查询使用 dataSourceListUser customQueryUsingConnection(String namePattern);//通过名字进行模糊查询使用 jdbcTemplateListUser customQueryUsingTemplate(String namePattern);
}CustomUserDaoImpl
package cn.ljh.app.dao.impl;import cn.ljh.app.dao.CustomUserDao;
import cn.ljh.app.domain.User;
import lombok.SneakyThrows;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;import javax.sql.DataSource;
import java.sql.Array;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;/*** author JH*/
public class CustomUserDaoImpl implements CustomUserDao
{private DataSource dataSource;private JdbcTemplate jdbcTemplate;//通过有参构造器进行依赖注入public CustomUserDaoImpl(DataSource dataSource, JdbcTemplate jdbcTemplate){this.dataSource dataSource;this.jdbcTemplate jdbcTemplate;}SneakyThrowsOverridepublic ListUser customQueryUsingConnection(String namePattern){//创建数据库连接Connection connection this.dataSource.getConnection();//创建 PreparedStatement 预处理语句PreparedStatement pstmt connection.prepareStatement(select * from user_inf where name like ?);pstmt.setString(1, namePattern);//执行查询ResultSet rs pstmt.executeQuery();ListUser userList new ArrayList();//遍历结果集封装对象while (rs.next()){userList.add(new User(rs.getInt(user_id),rs.getString(name),rs.getString(password),rs.getInt(age)));}return userList;}Overridepublic ListUser customQueryUsingTemplate(String namePattern){//直接执行查询ListUser userList this.jdbcTemplate.query(select user_id as id,name ,password,age from user_inf where name like ?,//把查询的结果封装起来new BeanPropertyRowMapper(User.class),namePattern);return userList;}
}UserDaoTest
package cn.ljh.app;import cn.ljh.app.dao.UserDao;
import cn.ljh.app.domain.User;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.jdbc.repository.query.Modifying;
import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;import java.util.List;
import java.util.Optional;/*** author JH*/
SpringBootTest(webEnvironment SpringBootTest.WebEnvironment.NONE)
public class UserDaoTest
{Autowiredprivate UserDao userDao;// 继承 CrudRepository 接口后就已经有通用的 CRUD 操作无需自己来书写这些方法//添加user对象ParameterizedTestCsvSource({aa,xxx,2, bb,xxx,3})public void testSave(String name, String password, int age){//没有idsave就是添加User user userDao.save(new User(null, name, password, age));System.err.println(user);}//根据id修改对象ParameterizedTestCsvSource({13,aaa,xxxx,22})public void testUpdate(Integer id, String name, String password, int age){//有idsave就是修改User user userDao.save(new User(id, name, password, age));System.err.println(user);}//根据id删除用户对象ParameterizedTestValueSource(ints {14})public void testDelete(Integer id){userDao.deleteById(id);}//根据id查询对象ParameterizedTestValueSource(ints {1})public void testFindById(Integer id){OptionalUser user userDao.findById(id);}//方法名关键字查询---------全自动//根据名字模糊查询ParameterizedTestValueSource(strings {孙%, %精})public void testFindByNameLike(String namePattern){ListUser users userDao.findByNameLike(namePattern);users.forEach(System.err::println);}//根据年龄大小进行范围查询ParameterizedTestValueSource(ints {500, 10})public void testFindByAgeGreaterThan(int startAge){ListUser users userDao.findByAgeGreaterThan(startAge);users.forEach(System.err::println);}//根据年龄大小进行范围查询ParameterizedTestValueSource(ints {20})public void testFindByAgeLessThan(int age){ListUser users userDao.findByAgeLessThan(age);users.forEach(System.err::println);}//根据年龄区间进行范围查询ParameterizedTestCsvSource({15,20, 500,1000})public void testFindByAgeBetween(int startAge, int endAge){ListUser users userDao.findByAgeBetween(startAge, endAge);users.forEach(System.err::println);}//Query 查询 ---自己定义查询语句-----半自动//rowMapperClass 或 rowMapperRef 是用来做自定义映射查询出来的User对象的数据映射到Student对象的属性上面去都可以因为是自定义的。//根据密码模糊查询ParameterizedTestValueSource(strings {niu%, %3})public void testFindBySql(String passwordPattern){ListUser users userDao.findBySql(passwordPattern);users.forEach(System.err::println);}//根据年龄范围修改名字ParameterizedTestCsvSource({牛魔王aa,800,1000})TransactionalRollback(false)public void testUpdateNameByAge(String name, int startAge, int endAge){int i userDao.updateNameByAge(name, startAge, endAge);}//自己定义的接口用来实现全手动的查询//通过名字进行模糊查询使用 dataSourceParameterizedTestValueSource(strings {孙%})public void testCustomQueryUsingConnection(String namePattern){ListUser users userDao.customQueryUsingConnection(namePattern);users.forEach(System.err::println);}//通过名字进行模糊查询使用 jdbcTemplateParameterizedTestValueSource(strings {孙%})public void testCustomQueryUsingTemplate(String namePattern){ListUser users userDao.customQueryUsingTemplate(namePattern);users.forEach(System.err::println);}
}
application.properties
spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver
spring.datasource.urljdbc:mysql://localhost:3306/springboot?serverTimezoneUTC
spring.datasource.usernameroot
spring.datasource.password123456pom.xml
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.4.5/version/parentgroupIdcn.ljh/groupIdartifactIdSpring_Data_JDBC/artifactIdversion1.0.0/versionnameSpring_Data_JDBC/namepropertiesjava.version11/java.version/propertiesdependencies!-- 导入 spring data jdbc --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jdbc/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationexcludesexcludegroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/exclude/excludes/configuration/plugin/plugins/build/project