当前位置: 首页 > news >正文

Java经典框架之SpringDataJPA

SpringDataJPA

Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。
  

课程内容的介绍

1. Spring整合Hibernate
2. Spring整合HibernateJPA
3. SpringDataJPA介绍
4. SpringBoot整合SpringDataJPA
  
Spring Data JPA:Spring Data JPA 是 Spring Data 项目下的一个模块。提供了一套基于 JPA标准操作数据库的简化方案。底层默认的是依赖 Hibernate JPA 来实现的。
Spring Data JPA 的技术特点:我们只需要定义接口并集成 Spring Data JPA 中所提供的接口就可以了。不需要编写接口实现类。
  

一、Spring整合Hibernate

1. 创建项目
创建一个普通的Maven项目即可。

   
2.添加相关的依赖
    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>5.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.6.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.8</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.11</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.0.7.Final</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.1.6.RELEASE</version></dependency></dependencies>
   
3. 添加相关的配置文件
添加数据库的配置文件和Spring的配置文件。
<?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:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd
"><!-- 引入db.properties文件 --><context:property-placeholder location="classpath:db.properties" /><!-- 创建druid 的数据源 --><bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource"><property name="url" value="${jdbc.url}" /><property name="driverClassName" value="${jdbc.driver}" /><property name="username" value="${jdbc.username}" /><property name="password"  value="${jdbc.password}" /></bean><!-- 配置Hibernate的SessionFactory对象 --><bean class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" id="sessionFactory"><!-- 关联数据源 --><property name="dataSource" ref="dataSource"/><!-- 配置Hibernate的属性信息 --><property name="hibernateProperties"><props><prop key="show_sql">true</prop><prop key="hibernate.hbm2ddl.auto">update</prop></props></property><!-- 扫描路径 --><property name="packagesToScan"><list><value>com.bobo.pojo</value></list></property></bean><!-- 配置HibernateTemplate对象 --><bean class="org.springframework.orm.hibernate5.HibernateTemplate" id="hibernateTemplate"><property name="sessionFactory" ref="sessionFactory"/></bean><!--  配置事务管理--><bean class="org.springframework.orm.hibernate5.HibernateTransactionManager" id="transactionManager"><property name="sessionFactory" ref="sessionFactory" /></bean><!-- 配置开启事务注解 --><tx:annotation-driven transaction-manager="transactionManager" /><!-- 配置扫描路径 --><context:component-scan base-package="com.bobo" />
</beans>
     
4. 创建POJO
和表结构中的t_user表对应即可。
package com.bobo.pojo;import javax.persistence.*;
import java.io.Serializable;@Entity
@Table(name="t_user")
public class Users implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name="user_id")private Integer userId;@Column(name="user_name")private String userName;@Column(name="real_name")private String realName;public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getRealName() {return realName;}public void setRealName(String realName) {this.realName = realName;}}
   
5. 创建持久层
定义持久层接口,定义要实现的相关的方法。
package com.bobo.dao;import com.bobo.pojo.Users;import java.util.List;public interface IUserDao {void insertUsers(Users users);void updateUsers(Users users);void deleteUsers(Users users);Users selectUsersById(Integer userId);List<Users> selectUsersByName(String userName);List<Users> selectUsersByNameUseSQL(String userName);List<Users> selectUsersByNameUseCriteria(String userName);
}
package com.bobo.dao.impl;import com.bobo.dao.IUserDao;
import com.bobo.pojo.Users;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public class UserDaoImpl implements IUserDao {@Autowiredprivate HibernateTemplate template;@Overridepublic void insertUsers(Users users) {this.template.save(users);}@Overridepublic void updateUsers(Users users) {this.template.update(users);}@Overridepublic void deleteUsers(Users users) {this.template.delete(users);}@Overridepublic Users selectUsersById(Integer userId) {return this.template.get(Users.class,userId);}@Overridepublic List<Users> selectUsersByName(String userName) {// 我们要执行特殊的查询操作 我们需要获取对应的Session对象Session session = this.template.getSessionFactory().getCurrentSession();// 通过Session对象创建Query对象 HQL 语句Query query = session.createQuery(" from Users where userName = :abc");Query queryTemp = query.setString("abc", userName);return queryTemp.list();}@Overridepublic List<Users> selectUsersByNameUseSQL(String userName) {// 我们要执行特殊的查询操作 我们需要获取对应的Session对象Session session = this.template.getSessionFactory().getCurrentSession();// 通过Session对象创建Query对象 SQL 语句Query query = session.createSQLQuery("select * from t_user where user_name = ?").addEntity(Users.class).setString(0, userName);return query.list();}@Overridepublic List<Users> selectUsersByNameUseCriteria(String userName) {Session session = this.template.getSessionFactory().getCurrentSession();Criteria criteria = session.createCriteria(Users.class);criteria.add(Restrictions.eq("userName",userName));return criteria.list();}
}
     
6. 单元测试
package com.bobo.test;import com.bobo.dao.IUserDao;
import com.bobo.pojo.Users;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test1 {@Autowiredprivate IUserDao dao;@Test@Transactional@Rollback(false)public void testInsertUser(){Users user = new Users();user.setUserName("Tom");user.setRealName("张三丰");dao.insertUsers(user);}@Test@Transactionalpublic void testQuery1(){Users users = this.dao.selectUsersById(22);System.out.println(users);}@Test@Transactionalpublic void testQuery2(){List<Users> list = this.dao.selectUsersByNameUseSQL("Tom");for (Users users : list) {System.out.println(users);}}}
  

  

  

二、Spring整合HibernateJPA

现如今的ORM框架还是比较多的比如Hibernate,TopLink以及OpenJPA等等,为了简化ORM框架的使用,JPA随之产生。
JPA是Java Persistence API的简称,中文名Java持久层API,由 Sun 公司提供了一对对于持久层操作的标准(接口+文档),说白了就是在各种ORM框架之上封装了一套API实现统一操作。同时又依赖各种ORM框架去实现。hibernate3.2版本后提供了对JPA的实现。
  
1. 创建项目
创建一个普通的Maven项目即可。

    
2. 添加相关的依赖
    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>5.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.6.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.8</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.11</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>5.0.7.Final</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.1.6.RELEASE</version></dependency></dependencies>
   
3. 添加相关的配置文件
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/logistics?characterEncoding=utf-8&serverTimezone=UTC
jdbc.username=root
jdbc.password=123456
     
Spring的配置文件
<?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:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd
"><!-- 引入db.properties文件 --><context:property-placeholder location="classpath:db.properties" /><!-- 创建druid 的数据源 --><bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource"><property name="url" value="${jdbc.url}" /><property name="driverClassName" value="${jdbc.driver}" /><property name="username" value="${jdbc.username}" /><property name="password"  value="${jdbc.password}" /></bean><!-- 配置Hibernate的SessionFactory对象 --><bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="sessionFactory"><!-- 关联数据源 --><property name="dataSource" ref="dataSource"/><!-- 配置Hibernate的属性信息 --><property name="jpaVendorAdapter"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"><property name="database" value="MYSQL"/><property name="generateDdl" value="true"/><property name="showSql" value="true"/></bean><!--<props><prop key="show_sql">true</prop><prop key="hibernate.hbm2ddl.auto">update</prop></props>--></property><!-- 扫描路径 --><property name="packagesToScan"><list><value>com.bobo.pojo</value></list></property></bean><!--  配置事务管理--><bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"><property name="entityManagerFactory" ref="sessionFactory" /></bean><!-- 配置开启事务注解 --><tx:annotation-driven transaction-manager="transactionManager" /><!-- 配置扫描路径 --><context:component-scan base-package="com.bobo" />
</beans>
  
4. 创建POJO
package com.bobo.pojo;import javax.persistence.*;
import java.io.Serializable;@Entity
@Table(name="t_user")
public class Users implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name="user_id")private Integer userId;@Column(name="user_name")private String userName;@Column(name="real_name")private String realName;public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getRealName() {return realName;}public void setRealName(String realName) {this.realName = realName;}@Overridepublic String toString() {return "Users{" +"userId=" + userId +", userName='" + userName + '\'' +", realName='" + realName + '\'' +'}';}
}
  
5. 创建持久层
package com.bobo.dao;import com.bobo.pojo.Users;import java.util.List;public interface IUserDao {void insertUsers(Users users);void updateUsers(Users users);void deleteUsers(Users users);Users selectUsersById(Integer userId);List<Users> selectUsersByName(String userName);List<Users> selectUsersByNameUseSQL(String userName);List<Users> selectUsersByNameUseCriteria(String userName);
}
    
实现类
package com.bobo.dao.impl;import com.bobo.dao.IUserDao;
import com.bobo.pojo.Users;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Repository;import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.List;@Repository
public class UserDaoImpl implements IUserDao {@PersistenceContext(name = "entityManagerFactory")private EntityManager manager;@Overridepublic void insertUsers(Users users) {manager.persist(users);}@Overridepublic void updateUsers(Users users) {manager.merge(users);}@Overridepublic void deleteUsers(Users users) {users = this.selectUsersById(users.getUserId());manager.remove(users);}@Overridepublic Users selectUsersById(Integer userId) {return manager.find(Users.class,userId);}@Overridepublic List<Users> selectUsersByName(String userName) {return manager.createQuery(" from Users where userName = :abc").setParameter("abc",userName).getResultList();}@Overridepublic List<Users> selectUsersByNameUseSQL(String userName) {return manager.createNativeQuery("select * from t_user where user_name = ?",Users.class).setParameter(1,userName).getResultList();}@Overridepublic List<Users> selectUsersByNameUseCriteria(String userName) {CriteriaBuilder builder = manager.getCriteriaBuilder();CriteriaQuery<Users> query = builder.createQuery(Users.class);Root<Users> root = query.from(Users.class);Predicate cate = builder.equal(root.get("userName"), userName);query.where(cate);TypedQuery<Users> typedQuery = manager.createQuery(query);return typedQuery.getResultList();}
}
    
6. 单元测试
package com.bobo.test;import com.bobo.dao.IUserDao;
import com.bobo.pojo.Users;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test1 {@Autowiredprivate IUserDao dao;@Test@Transactional@Rollback(false)public void testInsertUser(){Users user = new Users();user.setUserName("Mic");user.setRealName("李逵");dao.insertUsers(user);}@Test@Transactionalpublic void testQuery1(){Users users = this.dao.selectUsersById(22);System.out.println(users);}@Test@Transactionalpublic void testQuery2(){List<Users> list = this.dao.selectUsersByNameUseSQL("Tom");for (Users users : list) {System.out.println(users);}}}
  

  

  

三、SpringDataJPA介绍

1. 入门案例
1.1 创建项目
创建一个普通的Maven项目。
  
1.2 添加相关的依赖
    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>5.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.6.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.8</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.11</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>5.0.7.Final</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId><version>1.9.0.RELEASE</version></dependency></dependencies>
  
1.3 添加配置文件
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/logistics?characterEncoding=utf-8&serverTimezone=UTC
jdbc.username=root
jdbc.password=123456
     
Spring的配置文件
<?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:tx="http://www.springframework.org/schema/tx"xmlns:jpa="http://www.springframework.org/schema/data/jpa"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/data/jpahttp://www.springframework.org/schema/data/jpa/spring-jpa.xsd
"><!-- 引入db.properties文件 --><context:property-placeholder location="classpath:db.properties" /><!-- 创建druid 的数据源 --><bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource"><property name="url" value="${jdbc.url}" /><property name="driverClassName" value="${jdbc.driver}" /><property name="username" value="${jdbc.username}" /><property name="password"  value="${jdbc.password}" /></bean><!-- 配置Hibernate的SessionFactory对象 id必须得是 : entityManagerFactory --><bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"id="entityManagerFactory"><!-- 关联数据源 --><property name="dataSource" ref="dataSource"/><!-- 配置Hibernate的属性信息 --><property name="jpaVendorAdapter"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"><property name="database" value="MYSQL"/><property name="generateDdl" value="true"/><property name="showSql" value="true"/></bean><!--<props><prop key="show_sql">true</prop><prop key="hibernate.hbm2ddl.auto">update</prop></props>--></property><!-- 扫描路径 --><property name="packagesToScan"><list><value>com.bobo.pojo</value></list></property></bean><!--  配置事务管理--><bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"><property name="entityManagerFactory" ref="entityManagerFactory" /></bean><!-- 配置开启事务注解 --><tx:annotation-driven transaction-manager="transactionManager" /><!-- 配置扫描路径 --><context:component-scan base-package="com.bobo" /><!--  Spring Data Jpa 配置--><!-- 配置Dao的扫描 --><jpa:repositories base-package="com.bobo.dao" />
</beans>
  
1.4 创建POJO对象
package com.bobo.pojo;import javax.persistence.*;
import java.io.Serializable;@Entity
@Table(name="t_user")
public class Users implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name="user_id")private Integer userId;@Column(name="user_name")private String userName;@Column(name="real_name")private String realName;public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getRealName() {return realName;}public void setRealName(String realName) {this.realName = realName;}@Overridepublic String toString() {return "Users{" +"userId=" + userId +", userName='" + userName + '\'' +", realName='" + realName + '\'' +'}';}
}
  
1.5 创建持久层
package com.bobo.dao;import com.bobo.pojo.Users;
import org.springframework.data.jpa.repository.JpaRepository;public interface UserDao extends JpaRepository<Users,Integer> {}
     
1.6 单元测试
package com.bobo.test;import com.bobo.dao.UserDao;
import com.bobo.pojo.Users;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test1 {@Autowiredprivate UserDao dao;@Test@Transactional@Rollback(false)public void test1(){Users user = new Users();user.setUserName("admin-jpa");user.setRealName("测试");dao.save(user);}
}
  

  

  
2. Repository接口
public interface Repository<T, ID extends Serializable> {
}
    
Repository 接口是 Spring Data JPA 中为我我们提供的所有接口中的顶层接口,而且是个标志接口,Repository 提供了两种查询方式的支持。
1)基于方法名称命名规则查询
2)基于@Query 注解查询
    
2.1 基于方法名称命名规则查询

      
package com.bobo.dao;import com.bobo.pojo.Users;
import org.springframework.data.repository.Repository;import javax.persistence.criteria.CriteriaBuilder;
import java.util.List;/*** Repository接口的使用*/
public interface UserDaoRepository extends Repository<Users, Integer> {List<Users> findByUserNameIs(String string);List<Users> findByUserNameLike(String username);List<Users> findByUserNameAndRealNameIs(String name,String realName);
}
    
测试代码
package com.bobo.test;import com.bobo.dao.UserDaoRepository;
import com.bobo.pojo.Users;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test2 {@Autowiredprivate UserDaoRepository dao;@Test@Transactional@Rollback(false)public void query1(){List<Users> list = this.dao.findByUserNameIs("Tom");for (Users users : list) {System.out.println(users);}}@Test@Transactional@Rollback(false)public void query2(){List<Users> list = this.dao.findByUserNameLike("Tom");for (Users users : list) {System.out.println(users);}}@Test@Transactional@Rollback(false)public void query3(){List<Users> list = this.dao.findByUserNameAndRealNameIs("Tom","张三丰");for (Users users : list) {System.out.println(users);}}
}
  

   
2.2 基于@Query 注解查询
通过上面的命令的方式使用的情况,如果查询条件比较复杂的情况下,那么方法的名称会很长,不是很方便而且容易出错,这时我们可以通过@Query注解来实现。
  
2.2.1 JPQL语句
JPQL:是通过Hibernate的HQL语句演变而来的,他和HQL语句很相似。
package com.bobo.dao;import com.bobo.pojo.Users;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;import java.util.List;/*** Repository接口的使用* @Query*    JPQL语句*    SQL语句*    更新操作*/
public interface UserDaoRepository2 extends Repository<Users, Integer> {@Query(value = " from Users where userName =?")List<Users> queryUsersByNameUseJPQL(String name);@Query(value = " from Users where userName like ?")List<Users> queryUserLikeNameUseJPQL(String name);@Query(value = " from Users where userName= ? and realName = ?")List<Users> queryUserByNameAndRealName(String userName,String realName);}
     
单元测试
package com.bobo.test;import com.bobo.dao.UserDaoRepository;
import com.bobo.dao.UserDaoRepository2;
import com.bobo.pojo.Users;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test3 {@Autowiredprivate UserDaoRepository2 dao;@Test@Transactional@Rollback(false)public void query1(){List<Users> list = this.dao.queryUsersByNameUseJPQL("Tom");for (Users users : list) {System.out.println(users);}}@Test@Transactional@Rollback(false)public void query2(){List<Users> list = this.dao.queryUserLikeNameUseJPQL("Tom");for (Users users : list) {System.out.println(users);}}@Test@Transactional@Rollback(false)public void query3(){List<Users> list = this.dao.queryUserByNameAndRealName("Tom","张三丰");for (Users users : list) {System.out.println(users);}}
}
  
2.2.2 SQL语句
声明接口
package com.bobo.dao;import com.bobo.pojo.Users;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;import java.util.List;/*** Repository接口的使用* @Query*    JPQL语句*    SQL语句*    更新操作*/
public interface UserDaoRepository3 extends Repository<Users, Integer> {// 在使用@Query注解 查询SQL语句的时候 nativeQuery默认是false,我们需要设置为true@Query(value = "select * from t_user where user_name=?",nativeQuery = true)List<Users> queryUsersByNameUseSQL(String name);@Query(value = "select * from t_user where user_name like ?" ,nativeQuery = true)List<Users> queryUserLikeNameUseSQL(String name);@Query(value = "select * from t_user where user_name = ? and real_name = ?" , nativeQuery = true)List<Users> queryUserByNameAndRealName(String userName,String realName);}
    
单元测试
package com.bobo.test;import com.bobo.dao.UserDaoRepository2;
import com.bobo.dao.UserDaoRepository3;
import com.bobo.pojo.Users;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test4 {@Autowiredprivate UserDaoRepository3 dao;@Test@Transactional@Rollback(false)public void query1(){List<Users> list = this.dao.queryUsersByNameUseSQL("Tom");for (Users users : list) {System.out.println(users);}}@Test@Transactional@Rollback(false)public void query2(){List<Users> list = this.dao.queryUserLikeNameUseSQL("Tom");for (Users users : list) {System.out.println(users);}}@Test@Transactional@Rollback(false)public void query3(){List<Users> list = this.dao.queryUserByNameAndRealName("Tom","张三丰");for (Users users : list) {System.out.println(users);}}
}
  

   
2.2.3 完成更新数据
@Query注解可以完成数据更新操作,但是不能实现数据的添加和删除操作。
@Query(value = "update Users set userName = ? where userId=?")
@Modifying// 被@Modifying修饰的方法是一个更新操作
void updateUserNameById(String userName,Integer userId);
  
测试
@Test
@Transactional
@Rollback(false)
public void updateTest(){this.dao.updateUserNameById("Tommm",25);
}
  

  
3. CrudRepository接口
CrudRepository接口继承自Repository接口,所以Repository接口具有的功能CrudRepository接口都具有,而且又扩展了CRUD相关的功能。
@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {<S extends T> S save(S var1);<S extends T> Iterable<S> save(Iterable<S> var1);T findOne(ID var1);boolean exists(ID var1);Iterable<T> findAll();Iterable<T> findAll(Iterable<ID> var1);long count();void delete(ID var1);void delete(T var1);void delete(Iterable<? extends T> var1);void deleteAll();
}
    
应用声明接口
/**
* CrudRepository接口的使用
*/
public interface UserDaoCrudRepository extends CrudRepository<Users,Integer> {
}
     
单元测试
package com.bobo.test;import com.bobo.dao.UserDaoCrudRepository;
import com.bobo.dao.UserDaoRepository3;
import com.bobo.pojo.Users;
import org.junit.Test;
import org.junit.experimental.theories.suppliers.TestedOn;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.support.CustomSQLErrorCodesTranslation;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test5 {@Autowiredprivate UserDaoCrudRepository dao;/*** 添加数据*/@Testpublic void test1(){Users user = new Users();user.setRealName("成龙");user.setUserName("chengnong");dao.save(user);}/*** 批量添加数据*/@Testpublic void test2(){List<Users> list = new ArrayList<>();for (int i = 0; i < 10; i++) {Users user = new Users();user.setRealName("成龙"+i);user.setUserName("chengnong"+i);list.add(user);}dao.save(list);}/*** 查询单条数据*/@Testpublic void test3(){Users user = dao.findOne(25);System.out.println(user);}/*** 查询所有的数据*/@Testpublic void test4(){Iterable<Users> list = dao.findAll();Iterator<Users> iterator = list.iterator();while(iterator.hasNext()){Users user = iterator.next();System.out.println(user);}}/*** 删除数据*/@Testpublic void delete1(){dao.delete(32);}/*** 更新数据*/@Testpublic void update1(){// 根据save方法来实现 如果Users对象的userId属性不为空则updateUsers user = dao.findOne(34);user.setUserName("hahahaha");dao.save(user);}/*** 更新数据 方式二*/@Test@Transactional@Rollback(false)public void update2(){Users user = dao.findOne(34);user.setUserName("aaaa"); // User 是一个持久化的状态}
}
  
4.PagingAndSortingRepository接口
PagingAndSortingRepository继承自CrudRepository接口,那么显然PagingAndSortingRepository就具备了CrudRepository接口的相关的功能,同时也扩展了分页和排序的功能。
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {// 排序的支持Iterable<T> findAll(Sort var1);// 分页的支持Page<T> findAll(Pageable var1);
}
  
创建接口文件
package com.bobo.dao;import com.bobo.pojo.Users;
import org.springframework.data.repository.PagingAndSortingRepository;/*** PagingAndSortingRepository接口的使用*    新增的功能是*       分页*       排序*    注意本接口不支持条件查询*/
public interface UserDaoPageAndSortRepository extends PagingAndSortingRepository<Users,Integer> {
}
  
分页测试
package com.bobo.test;import com.bobo.dao.UserDaoCrudRepository;
import com.bobo.dao.UserDaoPageAndSortRepository;
import com.bobo.pojo.Users;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test6 {@Autowiredprivate UserDaoPageAndSortRepository dao;/*** 分页查询*/@Testpublic void test1(){int page = 1; // page:当前分页的索引  从0开始int size = 5; // size:每页显示的条数PageRequest pageable = new PageRequest(page,size);Page<Users> pages = dao.findAll(pageable);System.out.println("总的条数:" + pages.getTotalElements());System.out.println("总的页数:" + pages.getTotalPages());List<Users> list = pages.getContent();for (Users user : list) {System.out.println(user);}}
}
  

  
排序功能
    /*** 排序*/@Testpublic void test2(){// Sort.Direction.DESC 降序 ASC 升序Sort sort = new Sort(Sort.Direction.DESC,"userId");List<Users> list = (List<Users>) this.dao.findAll(sort);for (Users users : list) {System.out.println(users);}}
    

  
多条件排序
    /*** 多条件排序*/@Testpublic void test3(){Sort.Order order1 = new Sort.Order(Sort.Direction.DESC,"realName");Sort.Order order2 = new Sort.Order(Sort.Direction.ASC,"userId");Sort sort = new Sort(order1,order2);List<Users> list = (List<Users>) this.dao.findAll(sort);for (Users users : list) {System.out.println(users);}}
  

  
5. JpaRepository接口
JpaRepository接口是我们开发时使用最多接口,其特点是可以帮助我们将其他接口的方法的返回值做适配处理,可以使我们在开发的时候更方便的使用这些方法。
@NoRepositoryBean
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {List<T> findAll();List<T> findAll(Sort var1);List<T> findAll(Iterable<ID> var1);<S extends T> List<S> save(Iterable<S> var1);void flush();<S extends T> S saveAndFlush(S var1);void deleteInBatch(Iterable<T> var1);void deleteAllInBatch();T getOne(ID var1);
}
  
6. JpaSpecificationExecutor
提供的有多条件查询,并支持分页和排序功能,此接口不能单独使用,需要和其他的接口一块使用。
/**
* JpaSpecificationExecutor的使用
* JpaSpecificationExecutor 是不能够单独使用的。需要配置JPA中的其他的接口一块来使用
*/
public interface UserDaoSpecfication extends JpaRepository<Users,Integer>, JpaSpecificationExecutor {
}
     
6.1 单条件查询
package com.bobo.test;import com.bobo.dao.UserDaoSpecfication;
import com.bobo.pojo.Users;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test7 {@Autowiredprivate UserDaoSpecfication dao;@Testpublic void test1(){Specification<Users> speci = new Specification<Users>() {/*** 定义查询条件* @param root 根对象  封装查询条件的对象* @param criteriaQuery 基本的查询* @param criteriaBuilder 创建查询条件* @return*/@Overridepublic Predicate toPredicate(Root<Users> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {Predicate pre = criteriaBuilder.equal(root.get("userName"),"Tommm");return pre;}};List<Users> list = dao.findAll(speci);for (Users users : list) {System.out.println(users);}}
}
  

  
6.2 多条件
    /*** 多条件查询*/@Testpublic void test2(){Specification<Users> spec = new Specification<Users>() {/*** 指定查询的条件* @param root* @param criteriaQuery* @param criteriaBuilder* @return*/@Overridepublic Predicate toPredicate(Root<Users> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {List<Predicate> list = new ArrayList<>();list.add(criteriaBuilder.equal(root.get("userName"),"Tommm"));list.add(criteriaBuilder.equal(root.get("realName"),"张三丰"));Predicate[] arr = new Predicate[list.size()];return criteriaBuilder.and(list.toArray(arr));}};List<Users> list = dao.findAll(spec);for (Users users : list) {System.out.println(users);}}
  

  
6.3 分页
    /*** 单条件+分页*/@Testpublic void test3(){Specification<Users> speci = new Specification<Users>() {/*** 定义查询条件* @param root 根对象  封装查询条件的对象* @param criteriaQuery 基本的查询* @param criteriaBuilder 创建查询条件* @return*/@Overridepublic Predicate toPredicate(Root<Users> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {Predicate pre = criteriaBuilder.equal(root.get("userName"),"Tommm");return pre;}};Pageable pagealbe = (Pageable) new PageRequest(0,3);Page page = dao.findAll(speci, pagealbe);System.out.println(page.getTotalElements());System.out.println(page.getTotalPages());List content = page.getContent();System.out.println(content);}
  

  
6.4 排序
    /*** 单条件+排序*/@Testpublic void test4(){Specification<Users> speci = new Specification<Users>() {/*** 定义查询条件* @param root 根对象  封装查询条件的对象* @param criteriaQuery 基本的查询* @param criteriaBuilder 创建查询条件* @return*/@Overridepublic Predicate toPredicate(Root<Users> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {Predicate pre = criteriaBuilder.equal(root.get("userName"),"Tommm");return pre;}};Sort sort = new Sort(Sort.Direction.DESC,"userId");List<Users> list = dao.findAll(speci, sort);System.out.println(list);}
  

  
6.5 分页和排序
    /*** 单条件+分页 + 排序*/@Testpublic void test5(){Specification<Users> speci = new Specification<Users>() {/*** 定义查询条件* @param root 根对象  封装查询条件的对象* @param criteriaQuery 基本的查询* @param criteriaBuilder 创建查询条件* @return*/@Overridepublic Predicate toPredicate(Root<Users> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {Predicate pre = criteriaBuilder.equal(root.get("userName"),"Tommm");return pre;}};Sort sort = new Sort(Sort.Direction.DESC,"userId");// 封装分页对象的时候我们可以直接指定 排序的规则Pageable pagealbe = (Pageable) new PageRequest(0,3,sort);Page page = dao.findAll(speci, pagealbe);System.out.println(page.getTotalElements());System.out.println(page.getTotalPages());List content = page.getContent();System.out.println(content);}
  

  

四、SpringBoot整合SpringDataJPA

1. 添加依赖

  
2. 添加配置文件
# jdbc 的相关信息
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/logistics?
characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456# 配置连接池信息
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource# 配置jpa的相关参数
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
    
3. 创建POJO
package com.bobo.pojo;import javax.persistence.*;
import java.io.Serializable;@Table(name = "t_user")
@Entity
public class Users implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name="user_id")private Integer userId;@Column(name="user_name")private String usreName;@Column(name="real_name")private String realName;public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}public String getUsreName() {return usreName;}public void setUsreName(String usreName) {this.usreName = usreName;}public String getRealName() {return realName;}public void setRealName(String realName) {this.realName = realName;}
}
  
4. 创建接口
package com.bobo.dao;import com.bobo.pojo.Users;
import org.springframework.data.jpa.repository.JpaRepository;public interface UsersRepository extends JpaRepository<Users,Integer> {
}
  
5. 测试
package com.bobo;import com.bobo.dao.UsersRepository;
import com.bobo.pojo.Users;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class SpringdatajpaSpringbootApplicationTests {@Autowiredprivate UsersRepository dao;@Testvoid contextLoads() {Users users = new Users();users.setUsreName("test1");users.setRealName("测试数据");dao.save(users);}}
  

相关文章:

Java经典框架之SpringDataJPA

SpringDataJPA Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Spring整合Hibernate 2…...

向爬虫而生---Redis 基石篇3 <拓展List>

前言: 继上一篇向爬虫而生---Redis 基石篇2 &#xff1c;拓展Hash&#xff1e;-CSDN博客​​​​​​.往下继续---挖一挖list 正文: 在Redis中&#xff0c;列表&#xff08;List&#xff09;是一个常用的数据结构&#xff0c;尤其在爬虫应用中。例如&#xff0c;可以用列表实现…...

CSS渲染性能优化

✨ 专栏介绍 HTML/CSS专栏合集是一个涵盖HTML和CSS两个方面的栏目。HTML是一种标记语言&#xff0c;用于创建网页的结构和内容&#xff0c;而CSS是一种样式表语言&#xff0c;用于控制网页的外观和布局。 在HTML/CSS专栏合集中&#xff0c;我们将深入探讨HTML和CSS的基础知识…...

【C++入门】类和对象(完)

前言 在谈论C时&#xff0c;常常会涉及到一些高级特性和概念&#xff0c;比如初始化列表、static成员、友元、内部类、匿名对象等。这些概念在C编程中起着非常重要的作用&#xff0c;对于想要深入了解C语言的开发者来说&#xff0c;掌握这些知识是至关重要的。本文&#xff0c;…...

webshell检测方式深度剖析 --- Pixy系列二(数据流分析)

开篇 书接上文&#xff0c;这次我们来聊聊数据流分析&#xff0c;数据流分析的内容非常广泛&#xff0c;我们力求深入浅出通俗易懂&#xff0c;在简短的篇幅内将这一概念描述清楚。 简单来说&#xff0c;数据流分析是一种用来获取相关数据沿着程序执行路径流动的信息分析技术…...

[DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]

文章目录 概要I Introduction小结 概要 提出的架构&#xff0c;双注意力U-Net与特征融合&#xff08;DAU-FI Net&#xff09;&#xff0c;解决了语义分割中的挑战&#xff0c;特别是在多类不平衡数据集上&#xff0c;这些数据集具有有限的样本。DAU-FI Net 整合了多尺度空间-通…...

使用Triton部署ONNX模型

介绍 适用于各种 AI 工作负载的推理&#xff1a;借助 NVIDIA Triton™&#xff0c;在任何处理器&#xff08;GPU、CPU 或其他&#xff09;上&#xff0c;对使用基于任何框架的&#xff0c;经过训练的机器学习模型或深度学习模型&#xff0c;进行推理部署。Triton 是 NVIDIA AI…...

Python访问ElasticSearch

ElasticSearch是广受欢迎的NoSQL数据库&#xff0c;其分布式架构提供了极佳的数据空间的水平扩展能力&#xff0c;同时保障了数据的可靠性&#xff1b;反向索引技术使得数据检索和查询速度非常快。更多功能参见官网介绍 https://www.elastic.co/cn/elasticsearch/ 下面简单罗列…...

Flutter 混合开发 - 动态下发 libflutter.so libapp.so

背景 最近在做包体积优化&#xff0c;在完成代码混淆、压缩&#xff0c;裁剪ndk支持架构&#xff0c;以及资源压缩&#xff08;如图片转webp、mp3压缩等&#xff09;后发现安装包的中占比较大的仍是 so 动态库依赖。 具体查看发现 libflutter.so 和 libapp.so 的体积是最大的&…...

Peter算法小课堂—动态规划

Peter推荐算法书&#xff1a;《算法导论》 图示&#xff1a; 目录 钢条切割 打字怪人 钢条切割 算法导论&#xff08;第四版&#xff09;第十四章第一节&#xff1a;钢条切割 题目描述&#xff1a; 给定一根长度为 n 英寸的钢条和一个价格表 &#xff0c;其中 i1,2,…,n …...

2022–2023学年2021级计算机科学与技术专业数据库原理 (A)卷

一、单项选择题&#xff08;每小题1.5分&#xff0c;共30分&#xff09; 1、构成E—R模型的三个基本要素是&#xff08; B &#xff09;。 A&#xff0e;实体、属性值、关系 B&#xff0e;实体、属性、联系 C&#xff0e;实体、实体集、联系 D&#xff0e;实体、实体…...

Clojure 实战(4):编写 Hadoop MapReduce 脚本

Hadoop简介 众所周知&#xff0c;我们已经进入了大数据时代&#xff0c;每天都有PB级的数据需要处理、分析&#xff0c;从中提取出有用的信息。Hadoop就是这一时代背景下的产物。它是Apache基金会下的开源项目&#xff0c;受Google两篇论文的启发&#xff0c;采用分布式的文件…...

Django 分页(表单)

目录 一、手动分页二、分页器分页 一、手动分页 1、概念 页码&#xff1a;很容易理解&#xff0c;就是一本书的页码每页数量&#xff1a;就是一本书中某一页中的内容&#xff08;数据量&#xff0c;比如第二页有15行内容&#xff09;&#xff0c;这 15 就是该页的数据量 每一…...

socket实现视频通话-WebRTC

最近喜欢研究视频流&#xff0c;所以思考了双向通信socket&#xff0c;接下来我们就一起来看看本地如何实现双向视频通讯的功能吧~ 客户端获取视频流 首先思考如何获取视频流呢&#xff1f; 其实跟录音的功能差不多&#xff0c;都是查询电脑上是否有媒体设备&#xff0c;如果…...

simulink代码生成(九)—— 串口显示数据(纸飞机联合调试)

纸飞机里面的协议是固定的&#xff0c;必须按照协议配置&#xff1b; &#xff08;1&#xff09;使用EasyHEX协议&#xff0c;测试int16数据类型 测试串口发出的数据是否符合&#xff1f; 串口接收数据为&#xff1a; 打开纸飞机绘图侧&#xff1a; &#xff08;1&#xff09…...

Mysql数据库(中)——增删改查的学习(全面,详细)

上一篇主要对查询操作进行了详细的总结&#xff0c;本篇主要对增删改操作以及一些常用的函数进行总结&#xff0c;包括流程控制等&#xff1b;以下的代码可以直接复制到数据库可视化软件中&#xff0c;便于理解和练习&#xff1b; 常用的操作&#xff1a; #函数&#xff1a; S…...

test dbtest-03-对比 Liquibase、flyway、dbDeploy、dbsetup

详细对比 Liquibase、flyway、dbDeploy、dbsetup&#xff0c;给出对比表格 下面是一个简要的对比表格&#xff0c;涵盖了 Liquibase、Flyway、dbDeploy 和 DbSetup 这四个数据库变更管理工具的一些主要特点。 特点/工具LiquibaseFlywaydbDeployDbSetup开发语言Java&#xff0…...

力导向图与矩阵排序

Graph-layout force directed&#xff08;力导向图布局&#xff09;是一种用于可视化网络图的布局算法。它基于物理模型&#xff0c;模拟了图中节点之间的相互排斥和连接弹性&#xff0c;以生成具有良好可读性和美观性的图形布局。 在力导向图布局中&#xff0c;每个节点被视为…...

word 常用功能记录

word手册 多行文字对齐标题调整文字间距打钩方框插入三线表插入参考文献自动生成目录 多行文字对齐 标题调整文字间距 打钩方框 插入三线表 插入一个最基本的表格把整个表格设置为无框线设置上框线【实线1.5磅】设置下框线【实线1.5磅】选中第一行&#xff0c;设置下框线【实线…...

C#线程基础(线程启动和停止)

目录 一、关于线程 二、示例 三、生成效果 一、关于线程 在使用多线程前要先引用命名空间System.Threading&#xff0c;引用命名空间后就可以在需要的地方方便地创建并使用线程。 创建线程对象的构造方法中使用了ThreadStart()委托&#xff0c;当线程开始执行时&#xff0c…...

如何利用ChatGPT来提高编程效率

如何利用ChatGPT来提高编程效率 在当今这个信息爆炸和技术快速发展的时代,程序员们面临着巨大的压力,既要保证代码的质量,又要提高工作效率。幸运的是,人工智能(AI)正在改变我们编写和维护代码的方式,而OpenAI的ChatGPT是其中的佼佼者。本文将讨论如何利用ChatGPT以及结合…...

java智慧工地源码,互联网+建筑工地,实现对工程项目内人员、车辆、安全、设备、材料等的智能化管理

智慧工地全套源码&#xff0c;微服务JavaSpring Cloud UniApp MySql&#xff1b;支持多端展示&#xff08;大屏端、PC端、手机端、平板端&#xff09;演示自主版权。 智慧工地概念&#xff1a; 智慧工地就是互联网建筑工地&#xff0c;是将互联网的理念和技术引入建筑工地&…...

创建并使用自己的C++模块(Windows10+MSVC)

module是C20种新引入的特性&#xff0c;关于module的介绍和好处&#xff0c;网上已有大量的文章&#xff0c;此处也不再赘述&#xff0c;本文仅记录在个人的环境上创建一个简单的module并使用这个module。 环境同上一篇文章&#xff08; windows10&#xff0c;MSVC C工具链&am…...

Spring Boot 2.7.11 集成 GraphQL

GraphQL介绍 GraphQL&#xff08;Graph Query Language&#xff09;是一种用于API的查询语言和运行时环境&#xff0c;由Facebook于2012年创建并在2015年公开发布。与传统的RESTful API相比&#xff0c;GraphQL提供了更灵活、高效和强大的数据查询和操作方式。 以下是GraphQL…...

软件工程期末总结

软件工程期末总结 软件危机出现的原因软件生命周期软件生命周期的概念生命周期的各个阶段 软件开发模型极限编程 可行性研究与项目开发计划需求分析结构化分析的方法结构化分析的图形工具软件设计的原则用户界面设计结构化软件设计面向对象面向对象建模 软件危机出现的原因 忽视…...

MidTool图文创作-GPT-4与DALL·E 3的结合

GPT-4与DALLE 3的结合 GPT-4是由OpenAI开发的最新一代语言预测模型&#xff0c;它在前代模型的基础上进行了大幅度的改进&#xff0c;不仅在文本生成的连贯性、准确性上有了显著提升&#xff0c;还在理解复杂语境和执行多步骤指令方面表现出了更高的能力。而DALLE 3则是一个创…...

Python将两个或多个列表合并为一个列表,并根据每个输入列表中的元素的位置将其组合在一起

将两个或多个列表合并为一个列表&#xff0c;并根据每个输入列表中的元素的位置将其组合在一起。 这个需求在实际开发过程中应该说非常常见&#xff0c;当然python也给我们内置了相关方法&#xff01; zip(*iterables, strictFalse) 在多个迭代器上并行迭代&#xff0c;从每…...

数模混合SoC芯片中LEF2Milkyway的golden flow

在数模混合芯片中的项目中&#xff0c;特别是数字模块很少甚至只有一个简单的数字控制逻辑时&#xff0c;我们要做数字模块的后端实现时&#xff0c;通常模拟那边会问我们实现需要他们提供哪些数据。 通常来说&#xff0c;我们可以让模拟设计提供数字模块的GDS或LEF文件即可。…...

Five tips to make your essay flow

This post was written by Sydney Nicholson, a second-year master’s student in the English Department. Dear writer, Have you ever wondered what it takes to make an essay “flow”? In my time as a writing center tutor, I’ve noticed that this is one of th…...

linux驱动(二):led补

本文主要探讨s5pv210的led驱动相关知识&#xff0c;包括驱动主次设备注册和取消&#xff0c;udev(mdev)机制&#xff0c;静态和动态映射操作寄存器。 字符设备驱动注册 老接口(register_chrdev) static inline int register_chrdev(unsigned int major, const char *n…...

怎么做自助交易网站/网络营销推广活动有哪些

第1关:创建数据库和表 任务描述 本关任务:编写一个能计算数组平均值和最大值的小程序。 相关知识 为了完成本关任务,你需要掌握:1. SQLite数据库连接,2.创建数据库和表。 SQLite数据库连接 下面的例子显示了如何连接到一个现有的SQLite数据库。如果参数中指定的数据库不…...

新昌做网站/网站的seo

原文链接&#xff1a;https://hellogis.yuque.com/docs/share/351e9e9d-831f-47bc-a7c6-871528beb8c2?# 《Arcpy》 文章目录介绍按需开发的思路系统学习使用ArcPy的方法相关文章介绍 Arcpy是ArcGIS给出的一种地理处理处理方式&#xff0c;用Python实现 在ArcGIS体系中&#…...

创建网页用什么软件/深圳网站设计专业乐云seo

在这个例子中&#xff0c;主要会用到python内置的和OS模块的几个函数&#xff1a;os.walk() &#xff1a; 该方法用来遍历指定的文件目录&#xff0c;返回一个三元tuple(dirpath, dirnames, filenames) &#xff0c;其中dirpath为当前目录路径&#xff0c;dirnames为当前路径下…...

石家庄网站建设成功案例/软文推广有哪些平台

0. 其他处理 计时&#xff1a; tic net train(net, X, y); toc1. 一个简单的 demo&#xff08;单层感知器&#xff09; P [1, 1, 1, 1, 0, 0, 0, 0; 0, 0, 1, 1, 0, 1, 1, 0; 0, 1, 0, 1, 1, 0, 1, 0];% 每一列表示一个输入样本 T [-1, 1, 1, 1, -1, -1, 1, -1];% 表示输出值…...

网站怎么做动效/星沙网站优化seo

2019独角兽企业重金招聘Python工程师标准>>> #include<stdio.h> #include<stdlib.h> main() { char string[100]; int i0,len; printf("请输入中文汉字&#xff1a;\n"); while(1) { if(string[i]\n)break; i; scanf("%c",&str…...

做摘抄的网站/seo建站技术

推荐一波我写的任务管理软件(持续扩展完善) 主要功能可以每天规划任务,并查看今天还剩下多少秒,以及总完成率. CSDN下载:https://download.csdn.net/download/qq_41806966/12545118 需要源码可以去我的Github:https://github.com/1711680493/Application 里面的ShendiTaskM…...