Springboot数据访问,棒棒哒!
Springboot对数据访问部分提供了非常强大的集成,支持mysql,oracle等传统数据库的同时,也支持Redis,MongoDB等非关系型数据库,极大的简化了DAO的代码,尤其是Spring Data JPA,为不同数据库提供了统一的接口,我们只需继承其默认的JpaRepository(仓库模式),就自动的拥有很多常见的数据访问方法。
系列文章
快速入门系列--SpringBoot--03系统集成
SpringData是解决数据访问问题的一揽子解决方案,包含对JPA, MongoDB, Redis, Hadoop, Data Rest, Elasticsearch等一系列组件的支持,其通过Spring Data Commons提供统一的API。
3个常见数据访问组件的比较:
Hibernate 对数据库提供了较为完整的封装,封装了基本的DAO层操作,有较好的数据库移植性(其实就是对JPA的一种实现)
Mybatis 可以进行更细致的SQL优化,查询必要的字段,但是需要维护SQL和查询结果集的映射,而且数据库的移植性较差,针对不同的数据库编写不同的SQL。(有空试试mybatis接入公司框架)
Spring Data JPA 极大的简化了数据库访问,可以通过命名规范、注解的方式较快的编写SQL。
Spring Data JPA简单介绍,public interface PersonRepository extends JpaRepository<Person, Long> {},只要继承JpaRepository接口,就默认包含了常见的增删改查方法。(需要时再查阅,个人不是很推荐在关系型数据库中使用jpa,但NOSQL还是很推荐的)
声明式事务:给Config类添加@EnableTransactionManagement即可,而springboot无需任何配置,只需在需要事务处理的方法上添加@Transactional注解即可(spring包下)。
访问方式1,jdbc:Spring boot可以通过jdbcTemplate对数据库进行访问,不过功能相对简单,需要自己进行增强,相关配置如下。
- spring.datasource.url=jdbc:mysql://127.0.0.1:3306/user?characterEncoding=UTF-8
- spring.datasource.username=root
- spring.datasource.password=123456
- spring.datasource.driver-class-name=com.mysql.jdbc.Driver
- Maven:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-jdbc</artifactId>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- </dependency>
Tip:
Docker启动时:docker run -d -p 3306:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 mysql
访问方式2,jpa:Spring Data对java的JPA标准提供了实现(Hibernate也是对该标准的一种实现),Spring boot对此进行了集成,相比访问方式1,需要增加如下配置。
- spring.jpa.generate-ddl=false
- spring.jpa.show-sql=true
- spring.jpa.hibernate.naming.strategy=org.springframework.boot.orm.jpa.hibernate.SpringNamingStrategy
- Maven:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
在Eclipse中,支持JPA实体对象的代码生成,需要在项目Facet上添加jpa,之后使用jpatool生成代码。如果报错,可以直接修改配置文件(项目文件夹下的/.settings /org.eclipse.wst.common.project.facet.core.xml),添加配置项 <installed facet="jpt.jpa" version="2.1"/>即可,之后直接在项目上右键点选JPA Tools生成指定实体即可。
简单查询:按照标准的格式即可,比如通过UserName查询,User findByUserNameIgnoreCase(String userName),其会自动生成对应SQL。
分页查询:其已提供了分页功能,Page<User> findALL(Pageable pageable),Pageable pageable = new PageRequest(1, 10, new Sort(Direction.DESC, "id"))
限制查询:Order findTopByCreateTime(); List<User> findFirst5ByFirstname(String firstname, Sort sort);
自定义查询:在SQL的查询方法上面使用@Query注解,这样可以实现多表查询;删除和修改加上@Modifying;添加@Transactional支持事务,可以设置查询超时等配置项。
Tip:
生成的model有一些问题,比如@Id从Long变成了String, Bit->Byte(需要boolean), Long->BigInteger,因此不太推荐正向工程的形式(由代码生成数据库,容易丢失约束,所以配置项spring.jpa.generate-ddl=false)。同时,自动生成表中的字段会将camel命名的字段转化为xx_xx,因此需要添加上@Column注解
- @Column(name = "phonenumber")
- private String phoneNumber;
此外命名时不要使用isXXX形式,在各类序列化时很容易出问题,推荐使用ifActive。
Jpa更加信息的内容请参考: https://projects.spring.io/spring-data-jpa/
访问方式3,Mybatis(最为推荐):在springboot集成下,只需添加maven配置即可,无需任何额外项目配置,而且实体类直接使用pojo类即可,非常非常的方便。
- Maven:
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>1.3.0</version>
- </dependency>
- 简单示例
- @Select("select * from user where username = #{username}")
- User findUserByName(@Param("username") String name);
- @Select("select * from user")
- List<User> findAll();
- @Insert("insert into user (userID,createTime,createUser,dataChange_LastTime,email,ifActive,nickName,passwordHash,"
- + "phoneNumber, salt, updateUser, userName) values("
- + "#{userID}, #{createTime}, #{createUser}, #{dataChange_LastTime}, #{email}, #{ifActive}, #{nickName}, #{passwordHash}"
- + ", #{phoneNumber},#{salt},#{updateUser},#{userName})")
- @SelectKey(statement = "call identity()", keyProperty = "userID", before = false, resultType = long.class)
- User insert(User user);
- @Delete("delete from user where userid =#{userid}")
- void delete(Long userid);
- @Select("select * from user limit #{start},#{end} ")
- List<User> getPageUsers(int start, int end);
- @Update("update user set updateUser=#{updateUser},mail=#{mail} where userid=#{userid}")
- int update(User user);
Tip:
官方文档:http://www.mybatis.org/mybatis-3/zh/java-api.html,强烈推荐注解方式。
读写分离的配置(druid多数据源):http://blog.csdn.net/xiaoyu411502/article/details/48164311/,http://www.cnblogs.com/Alandre/p/6611813.html
传统的mybatis生成工具: mybatis-generator-gui
此外,只需要添加spring-boot-starter-data-rest,即可默认支持Rest Data,其默认配置了rest.base-path等信息,也很便捷。
Spring对mongo的支持通过Spring Data MongoDB来实现,提供的功能为:@Document映射领域对象与MongoDB的一个文档;@Id映射当前属性是ID;@DbRef当前属性将参考其他文档;@Field为文档的属性定义名称;@Version将当前属性作为版本。其提供了MongoTemplate用于数据访问,以及MongoClient和MongoDbFactory来配置数据库连接属性,Springboot均提供默认配置,常见配置如下所示。
- spring.data.mongodb.host=
- spring.data.mongodb.port=27017
- spring.data.mongodb.uri=mongodb://localhost/test
- spring.data.mongodb.database=
- Maven:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-mongodb</artifactId>
- </dependency>
推荐个mongodb视图工具:https://robomongo.org/download
Redis可以被当做缓存服务器使用,也可以作为数据库服务器使用,推荐一个Redis的客户端工具:https://github.com/caoxinyu/RedisClient
数据库服务器:Spring对Redis的支持通过Spring Data Redis来实现,Spring Data JPA提供了链接相关的ConnectinFactory(LettuceConnectionFactory&Srp)、数据操作相关RedisTemplate(StringRedisTemplate)和序列化器(JdkSerializationRedisSerializer&String&Jackson2Json),Springboot提供了默认的设置(org.springframework.boot.autoconfigure.redis),配置如下所示。
其常见的数据访问操作:opsForValue()操作只有简单属性的数据;opsForList()操作含有List的数据;opsForSet操作含有Set的数据;opsForZSet操作含有有序集合数据;opsForHash操作含有hash的数据。
- spring.redis.database=0 #db0
- spring.redis.host=localhost
- spring.redis.password=
- spring.redis.port=6379
- Maven:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-redis</artifactId>
- </dependency>
数据缓存Cache:在Config类中,注册RedisCacheManager,添加上@EnableCache注解。Springboot默认是ConcurrentMapCacheManager来处理缓存,若需要Redis作为缓存提供者,只需配置spring.cache.type=redis,使用@Cacheable, @CachePut, @CacheEvict, @Caching即可。
- spring.cache.type=redis
- Maven:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-cache</artifactId>
- </dependency>
由于有的数据提供系统只能运行在类Linux系统上,因此引入docker的概念(搭建环境时真心非常的棒,只需关注需要的组件,而无需关注依赖组件):
Window下安装包(需要bios支持虚拟cpu):https://github.com/boot2docker/windows-installer/releases
Tip: 这种方式实际有3层环境,本机->virtualbox->docker
测试时需要注意端口转发,分别是docker->virtualbox,然后是virtualbox到本机(生产环境是linux直接部署docker,无此问题),如果使用oracle数据库需要自己下载ojdbc并安装到maven。
Docker常见命令:
功能 | 示例 |
镜像命令 | |
镜像检索 | docker search 镜像名(redis) |
镜像拉取 | docker pull redis |
镜像列表 | docker images |
删除指定镜像 | docker rmi image-id |
删除所有镜像 | docker rmi ${docker images -q} |
容器命令 | |
运行容器 | docker run --name test-redis -d redis,其中-name为起名,-d为选择的镜像 |
容器列表 | docker ps,添加-a可以查看运行或停止的容器 |
启动容器 | docker start test-redis(container-name, container-id) |
停止容器 | docker stop test-redis |
端口映射 | Docker容器中运行软件所使用的端口,本机和局域网无法访问,所以需要将docker中容器中的端口映射到当前主机上,比如以redis为例,将容器6379端口映射到本地6378端口 docker run -d -p 6378:6379 --name port-redis redis |
删除指定容器 | docker rm container-id |
删除所有容器 | docker rm $(docker ps -a -q) |
容器日志 | docker logs port-redis |
登录容器 | Docker exec –it container-id bash exit退出 |
容器改名 | docker rename xxx xxx |
docker run命令参数:-d后台运行;-p暴露端口;-e设置环境变量,与dockerfile env设置相同效果 –name设置名称
Tip:
Hadoop、异步消息的整合会放在之后的文章中,敬请关注!J
参考资料
- 汪云飞. Spring Boot实战[M]. 北京:电子工业出版社, 2016.
Springboot数据访问,棒棒哒!的更多相关文章
- SpringBoot数据访问之Druid启动器的使用
数据访问之Druid启动器的使用 承接上文:SpringBoot数据访问之Druid数据源的自定义使用 官方文档: Druid Spring Boot Starter 首先在在 Spring Boot ...
- SpringBoot数据访问之整合mybatis注解版
SpringBoot数据访问之整合mybatis注解版 mybatis注解版: 贴心链接:Github 在网页下方,找到快速开始文档 上述链接方便读者查找. 通过快速开始文档,搭建环境: 创建数据库: ...
- springboot 数据访问【转】【补】
六.SpringBoot与数据访问 1.JDBC pom.xml配置 <dependencies> <dependency> <groupId>org.spring ...
- SpringBoot数据访问(一) SpringBoot整合Mybatis
前言 SpringData是Spring提供的一个用于简化数据库访问.支持云服务的开源框架.它是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案,其设计目的是为了使我们可以快速且 ...
- SpringBoot数据访问(二) SpringBoot整合JPA
JPA简介 Spring Data JPA是Spring Data大家族的一部分,它可以轻松实现基于JPA的存储库.该模块用于增强支持基于JPA的数据访问层,它使我们可以更加容易地构建使用数据访问技术 ...
- SpringBoot数据访问之Druid数据源的使用
数据访问之Druid数据源的使用 说明:该数据源Druid,使用自定义方式实现,后面文章使用start启动器实现,学习思路为主. 为什么要使用数据源: 数据源是提高数据库连接性能的常规手段,数据源 ...
- SpringBoot数据访问之整合Mybatis配置文件
环境搭建以及前置知识回顾 SpringBoot中有两种start的形式: 官方:spring-boot-starter-* 第三方:*-spring-boot-starter Mybatis属于第三方 ...
- SpringBoot数据访问(三) SpringBoot整合Redis
前言 除了对关系型数据库的整合支持外,SpringBoot对非关系型数据库也提供了非常好的支持,比如,对Redis的支持. Redis(Remote Dictionary Server,即远程字典服务 ...
- 【串线篇】SpringBoot数据访问【数据源/mybatis/指定映射文件位置】
一.配置数据源 1.1.jdbc版本 JDBC(.tomcat.jdbc.pool.DataSource作为数据源) <?xml version="1.0" encoding ...
随机推荐
- mvalidator手机端校验
官网地址:https://github.com/efri-yang/mobileValidate#%E5%8F%82%E6%95%B0 使用方法: html如下: <li class=" ...
- 【转】ActionScript,Flash,Flash/Flex Builder,FlashPlayer,AIR,swf,swc,swz之间的区别
原文链接:http://zengrong.net/post/1295.htm ActionScript ActionScript通常简称为AS,它是Flash平台的语言.AS编写的程序,最终可以编译成 ...
- CSS3学习笔记(2)-CSS盒子模型
p{ font-size: 15px; text-indent: 2em; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid ...
- EDP转接IC NCS8805:RGB/LVDS转EDP芯片,带Scaler
RGB/LVDS-to-eDP Converter w/ Scaler1 FeaturesEmbedded-DisplayPort (eDP) Output1/2/4-lane eDP @ 1.62/ ...
- .dll 文件编写和使用
1.基本概念 dll(dynamic-link library),动态链接库,是微软实现共享函数库的一种方式.动态链接,就是把一些常用的函数代码制作成dll文件,当某个程序调用到dll中的某个函数的时 ...
- ios 关于时间戳与时间转化的笔记
linux系统获取时间戳的方法:time() ; 时间戳转换成需要的时间格式: NSDateFormatter *formatter=[[NSDateFormatter alloc]init]; [f ...
- 线段树(hdu 1556)
Problem Description: N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电 ...
- 时间同步方法及几个可用的NTP服务器地址
大家都知道计算机电脑的时间是由一块电池供电保持的,而且准确度比较差经常出现走时不准的时候.通过互联网络上发布的一些公用网络时间服务器NTP server,就可以实现自动.定期的同步本机标准时间. 依靠 ...
- http协议的八种请求类型
GET:向特定的资源发出请求. POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件).数据被包含在请求体中.POST请求可能会导致新的资源的创建和/或已有资源的修改. OPTIONS: ...
- virtual box ubuntu 与Windows共享文件夹
由于懒得去截图了,直接抛链接.参考链接:http://www.cnblogs.com/lidabo/p/5317024.html 简介概括:首先安装增强功能,接着在virtual box的seting ...