目录 start
目录 end
|2018-06-13| 码云 | CSDN | OSChina
主要是采用的JPA,极大的缩减了代码量,但是要注意不要过度依赖框架,丧失了基本的能力
为什么要有多数据源? 思考
性能最好的数据库连接池
连接池:1.x 默认是tomcat-jdbc连接池 2.x 是 HikariPool
怎么映射视图到实体上?
TODO
所以还不如直接写原生SQL! 那么JPA就真的没有使用的必要性了,直接用Mybatis结合插件生成自动的CRUD的代码,这样更为轻量 @Modifying
@Transactional
@Query(value = "update a set b=?1", nativeQuery = true)
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-jdbc')
runtime('mysql:mysql-connector-java')
2.继承接口,打好实体类的注解 @Entity
3.切记 属性名不能使用下划线(数据库风格)不然写声明方法就会报错,jpa只是看下划线前半部分,会说找不到属性
4.jpa是声明特定方法的接口,让jpa来实现并自动注入,如果是没有的方法,就可以使用@Query注解
// 一方
public class TestOne{
@Id
private String testOneId;
@OneToMany
@JoinColumn(name = "testOneId")//这个名字可以重复,最终会有一个随机码生成
private Set<TestMany> testManySet;
}
// 多方
public class TestMany {
@Id
private String testManyId;
@ManyToOne
@JoinColumn(name = "testOneId")
private TestOne testOneId;
}
问题: 当两个表互相引用了, 需要修改表结构 ,怎么删除重建两张表结构, 简单的命令会陷入死锁
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
@Configuration
public class RestConfiguration extends RepositoryRestMvcConfiguration {
@Override
public RepositoryRestConfiguration config() {
return super.config();
}
@Override
public ProfileResourceProcessor profileResourceProcessor(RepositoryRestConfiguration config) {
// 设置rest根目录是应用路径下的路径 : localhost:8080/rest
config.setBasePath("/rest");
// 允许输出id
config.exposeIdsFor(Goods.class);
return super.profileResourceProcessor(config);
}
}
@RepositoryRestResource(path = "book")
public interface BookDao extends JpaRepository<Book,Long>{}
所有路径的使用方法:
GET
查询单个 /repo/id
成功:200 失败404GET
查询所有 /repo
成功200 失败404POST
新增 /repo
json数据发送 成功 201 失败404DELETE
删除 /repo/id
json数据 成功204 失败404PUT
更新 /repo/id
json 更新成功200 没有该id就插入201 失败404(使用主键自动增长就不会遇到404)config.exposeIdsFor(Goods.class);
即可查看到id 参考博客配置连接信息
# REDIS (RedisProperties)
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)0不超时
spring.redis.timeout=0
在一个配置类中复制如下代码即可使用 StringRedisTemplate RedisTemplate 的实例
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<Object,Object> template = new RedisTemplate<>();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
template.setConnectionFactory(factory);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 值序列化采用 jackson2JsonRedisSerializer
template.setValueSerializer(jackson2JsonRedisSerializer);
// 键序列化采用 StringRedisSerializer
template.setKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}
@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
两个对象的简单使用
stringRedisTemplate.opsForValue().set("aaa", "hello");
String result = stringRedisTemplate.opsForValue().get("aaa");
//获取所有
Set<String> keysList = stringRedisTemplate.keys("*");
for(String temp :keysList){
log.info(temp);
}
常见数据类型的中间对象
设置超时时间
redisTemplate.expire("max",tempTime,TimeUnit.SECONDS);