上回说完redis,应该都知道是用作于缓存容器的了。
那我是不是还说到了mybatis.
啊,那我们这次来说一说JPA+hibernate吧。
至于为什么不用mybatis.大概是我MYSQL语句确实写得不熟,还是喜欢面向对象多一点。
言归正传.
6.MYSQL+JPA+hibernate
6.1 基本概念
MYSQL是啥,用来干嘛的,跟redis的区别是啥。简单明了的就是MYSQL是磁盘存储,是存在硬盘上的,持久化的存储。redis也可以持久化存储,但是一般作缓存,存储在内存上。(如果磁盘和内存概念搞不清楚,先去看下计算机基础。)
那JPA呢?JPA是持久化标准
,是作为一种规范,并未实现的接口协议。
hibernate就是对JPA的一种实现
,emmm…硬要说你理解成抽象类和实现类我感觉也没有什么问题。
先来讲讲为什么用hibernate吧,首先,它用的基本概念是ORM
,用对象的思考方式就能替代掉原本MYSQL的实体的概念。在使用和操作数据的时候你会感到很亲切。
然后,你也可以基本不用写MYSQL语句也能进行CRUD,当然它也可以用MYSQL语句来写自己的函数定义。反正我用起来非常舒服。
6.2配置MYSQL+JPA+hibernate
来来来,先去下载一个MYSQL
,然后进行安装,开启服务。
按照教程下载就好了
和redis一样,Spring boot可不会帮你自动下载一个服务器 0 0.
然后再下一个Navicat
,用来可视化数据库,这样你至少能知道自己到底有没有存储读写成功。
确认服务是否成功开启。
Navicat能不能连接成功
如果都OK了,说明前期准备就完成了。
2.配置spring boot
熟悉的味道,熟悉的感觉,开始配置spring boot.
有挺多参数我也不太清楚怎么回事,反正先弄了再说,不过要搞清楚数据库服务,和db的概念啊。
#数据库配置
#主要作用是:自动创建、更新、验证数据库表结构。
spring.jpa.hibernate.ddl-auto=update
#数据库连接
#localhost,为IP,3306为端口,test为数据库
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
#hibernate配置
#数据库类别
spring.jpa.database=mysql
#输出日志
spring.jpa.show-sql=true
#数据库没有会新建,内容不会清空
hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.jdbc.batch_size=500
spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates =true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
好了,这样你就连接上MYSQL服务了!!!!
是不是很神奇!!!!怎么做到的!!!!
我也不知道!!!!反正就是spring boot全家桶的强大之处,当然你能弄懂,希望能帮我科普科普(文盲博主)。
好了,灵魂注入完毕了。
3.IDE连接上你的数据库(可做可不做)
一张图表示完,不然之后的@Entity,@Table会有警告,而且看数据的时候也方便很多
4.基本案例
新建一个类,做我们的数据库的表.
加上@Entity注解,还有一些神奇的注解自行百度吧。
运行一下
@Entity
public class Student {
@Id//这个是主键
@GeneratedValue(strategy = GenerationType.AUTO)//自增长
private Integer id;
private Integer old;
private String Name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getOld() {
return old;
}
public void setOld(Integer old) {
this.old = old;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
}
去Navicat看一下,这样就建好了一个表
好了,之后就到了我们的CRUD操作时间。
新建一个接口类,继承CrudRepository<Student, Integer>
@Component
public interface StudentRepository extends CrudRepository<Student, Integer> {
//在批量删除更新的时候,不适合用Hibernate,用Mysql
//分页查询直接用mysql
@Query(value = "select * from Student where old>?20",nativeQuery = true)
List<Student> findByOldRegex();
@Query(value = "select * from Student where old>?1",nativeQuery = true)
List<Student> findByOldRegex(int old);
@Query(value = "select * from Student where old>?1 and old <?2",nativeQuery = true)
List<Student> findByOldRegex(int oldless,int oldmore);
@Query(value = "select s from Student s where s.old>?1 and s.old <?2")
List<Student> findByOldRegex2(int oldless,int oldmore);
@Query(value = "select * from Student where old >?1 ORDER BY ?#{#pageable}", nativeQuery = true)
List<Student> PageSearch( int old, Pageable pageable);
List<Student> findByOldLessThan(int old);
}
这里我们仔细聊一聊,@Query,这样就可以使用自己MYSQL语句,并且加上自己的参数进去,是没有什么问题的。
然后,它本身有自带的save方法,find方法。然而我们应该要带很多的参数去进行条件查询,hibernate强大就在于,你可以不用带注解@Query自己去写了,你可以去定义方法
,findByOldLessThat,这就意味着,寻找Old,并且old少于某个值的意思。 这样你就相当于完成了Mysql语句了,只用定义,不用实现
,猛不猛?猛啊!
我们来测试一下。
@Autowired
StudentRepository gStudentRepository;
public Object DBRedisUpdateKey(String key,int db){
Object ReturnObject = null;
Student text = new Student();
text.setOld(18);
text.setName("fff");
Object l = gStudentRepository.save(text);//返回存储的本体..
//先写入数据库,得判断是否成功
System.out.println("写入数据库成功");
ReturnObject = l;
return ReturnObject;
}
自己去Navicat去看一下,有没有惊喜?~
5.结尾
emmm,好了,我这里只做一些简单的案例做介绍,其实我们还需要继续加油去完善自己的一些类表,虽然hibernate写起来,你要定义的方法比较多,一个表就要定义很多方法了。而且在加入数据库的时候因为是一条一条加入的,但是你可以不用写SQL啊,而且写代码的时候,不像Mybits一样要去用数据库思维去思考。我们还有很多问题没有解决。我们还有很多的提升空间,下面留着一些东西给大佬们留下评论给我科普科普。
①hibernate批量加入
②hibernate连表查询
③hibernate能否将所有定义的接口放在一个文件,而不用一个表就要加一个接口类,这样会使得工程文件中有很多类文件。然后我发现这个问题的本质在于,我定义的是接口类,而且也没有实现类。一个public里面定义的接口类,自动注入也没办法找到实例。所以…我很迷0 0不知道咋做…