好吧,虽说是jpa和mybatis各占半壁江山~而且也知道各有利弊~~但是!单凭jpa现在已经入驻spring家族一点,就让我更加喜欢使用和放心使用~~
所以一般项目中没有明确需求还是使用jpa多一点的。以前曾传说hibernate相比于mybatis比较重而且不灵活,但是我觉得自从data-jpa出生以后,spring已经把大多数的底层封装好了。你不得不承认的是,单从使用角度来讲,jpa远比mybatis配置少而且使用方便。
首先如果第一次接触jpa我建议大家在spring官网了解它。讲真,这么多使用的框架中,我最喜欢的就是spring系列的官方文档(也可能是我一开始接触的就是spring所以比较熟悉。反正我是觉得spring的文档简单明了)。
废话就说到这吧,继续说正题。spring boot简单整合jpa。
1,创建一个spring boot项目,导入jpa依赖和数据库依赖:
<!-- jpa依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
因为我用的是mysql所以导入的是mysql的依赖。大家可以根据实际情况导入。
然后在配置文件中配置数据库连接配置,这里用yml或者properties都可以。因为我只是做个demo,所以直接使用boot自带的properties了,如果你习惯使用yml也ok的。
spring.datasource.url = jdbc:mysql://101.132.119.151:3306/ourtowns?characterEncoding=UTF-8
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
#这两句为了前端传过来的时间格式统一并且去除时区差别
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
server.port=8099
#jpa配置 不加这个设置会因表名与实体名大小写不同而找不到表
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
#这句是为了控制台显示sql语句。调试的时候很有用呦~
spring.jpa.show-sql=true
#spring.jpa.properties.hibernate.format_sql=true
这个是我的配置文件。
除了数据库的四行设置还定义一个jpa的不区分大小写。然后控制台显示sql语句。
需要注意的两点:
1,驱动问题。
mysql5.7版本以前都是com.mysql.jdbc.Driver
5.7版本以后是com.mysql.cj.jdbc.Driver(这个版本我没具体试过,但是我很确定8.xx版本的肯定是新的这个。)
2,jpa有个很屌的功能就是可以根据实体生成表。我亲身经历:第一次启动项目,把表导成实体了。第二次启动项目就是因为没配置大小写所以jpa一看实体有的表里没有,结果刷刷刷几秒钟~~把我几十个实体对象大小写明确的又导进数据库里了~~啧啧,一段挺有意思的印象深刻的经历。
其实正常来讲这么配置以后spring boot+jpa的框架就搭完了。接下来虽然领域模型推崇根据实体生成表,但是我们大多数还是传统做法,表生成实体。关于这个生成实体,手敲有点恶心人。还好的是有插件可以自动生成。因为我是用eclipse开发。所以这里讲一下eclipse如何根据表生成实体:
第一步,右键项目->properties
第二步:找到Project facets并且点进Convert to faceted form
第三步:到了这个页面点击JPA。需要注意一个问题,这个jpa对jdk版本有要求。不达到会弹出警告
第四步:勾选jpa以后会让你further congiguration available(进一步配置可用的。。我没看到过全文~~)
第五步:上个步骤点进来就是是这个页面。如果你是第一次配置,直接加连接就好。点击 Add connection.。
对了 ,这里的配置说一下。在最下面的两个选项中,第一个discover是每次启动都自动扫描覆盖实体。然后我再说下我的用法吧。我一般都是demo项目使用这个插件从表导成实体,然后再复制粘贴到自己的项目里。然后表中再有改动就手动更改实体了~~
第六步:在此可以选择你想要连接的数据库,并且创建连接。因为我demo是用mysql做的,毕竟主流。没啥太大的坑。
不过在这我要声明一下。如果是用sql server数据库。选择驱动的时候,我反正18年用的时候14.16版本驱动都不能用。剩下这一年没用过sqlserver了所以不知道现在怎么样了。还有因为我mysql的连接已经有了,为了表现效果所以截图用sql server来演示。
第七步:选择好驱动版本以后到jar list这块就需要相应的jar包了~。每个驱动版本所需要的是不一样的。不过在上面有提示。你完全可以按照jar的名字去百度上下载。应该都挺好找的,大把的资源~~。划重点是每个版本的驱动需要的jar可能不一样!千万别经验主义!
然后现在你看到的是一个例子,你需要做的是先clear在把你自己准备好的jar包add进来。然后账号密码库名url之类的按照你自己的配置完就点击ok吧。
第八步:点击ok后会跳到下面这个页面。我建议大家都测试一下连接在使用~~万一马虎拼错了什么呢?测试ok了再点finish
第九步:又回到了第五步的页面。把connection换成你刚刚配置好的那个,点击ok就好了~
刚刚是配置连接,接下来就要从表生成实体了。
1,右键项目。两种方法都可以,如下图:
2,上面两个位置的entities from tables都会进入到这个页面。确定连接是对的。如果你设置了每次都要申请连接就点击图上框起来的按钮。
(我建议大家这么配置,如果不是每次都要连接那么可能你数据库做出更改但是这里的表不变。如果进到这个页面直接显示数据库和表证明你没这么配置。)
3,选择你想导入的表。下一步。(右侧第一个按钮是全选)
4,这个页面可以设置表(实体)的关联关系。但是我一般都是代码关联。这里都是默认选项
5,这个页面可以设置实体的一些属性。第一个key的这个是主键方式。我一般都是选择none然后自己维护主键。
package是选择你生成实体的位置。一般也都有自己的包结构~~~~(其实如果配置好了在这直接finish就行了)
6,有些页面没看过会觉得遗憾~~虽然上个页面就可以ok了但是还是要看看最后这个。其实还是实体的设置。就酱~~finish后~~实体就自动生成啦~~
将一些jpa直接生成实体的小坑(针对mysql数据库):
tinyint类型会转换成byte型。
decimal类型转换成BigDecimal型。
long类型会转化成string类型。
还有一个奇奇怪怪的被转化类型我忘记叫什么了~~
暂时我遇到的就这么几个。其实也不算坑 ,就是如果不知道可能犯一些经验主义错误~~然后其实手动改这个实体的属性就好了~问题不大~~建议大家生成实体的时候大略检查一下~~我再声明一下我的使用方法。我是demo项目里生成实体然后复制粘贴到实际开发的项目中~~这样可以省了好多不必要的麻烦~~比如说用了插件以后实体改动会报错~~虽然不影响运行但是我这种强迫症受不了反正~~
哎,本来是想连生成实体带简单应用的~~结果可能是我太墨迹,生成实体就截图编辑上传解释的弄了n久~~所以jpa的简单使用明天再写吧~~如果看了还有不懂的或者出错的可以私聊或者留言~我看到了会尽量帮忙看看~~
喏,手打不易,大家动动小手分享转发点赞评论啥的~~~~