SpringBoot操作数据库有多种方式,如
JDBC直接操作:太古老了,没人愿意这样玩
Mybatis插件:比较时髦,比较适合sql复杂,或者对性能要求高的应用,因为sql都是自己写的。
Spring-data-jpa: 使用hibernate作为实现,基本上不需要写sql,因为sql都是统一的,总是会产生多余的查询,性能上相对而言会低,但不绝对,影响性能的因素是多种的,这里说的性能是 从最终的查询的sql来对比的,毕竟生成的sql没有经过深思熟虑写出来的性能好。
JdbcTemplate:spring在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。Spring-data-jpa引入的时候,JdbcTemplate必然会被引入的。
当然还有其他中间件,主流使用的就是Mybatis和Spring-data-jpa。
首发地址:
品茗IT-同步发布
品茗IT 提供在线支持:
一键快速构建Spring项目工具
一键快速构建SpringBoot项目工具
一键快速构建SpringCloud项目工具
一站式Springboot项目生成
如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。
本文假设你已经引入Spring必备的一切了,已经是个Spring项目了,如果不会搭建,可以打开这篇文章看一看《Spring和Spring Mvc 5整合详解》。
使用Spring-data-jpa需要引入spring-data-jpa,因为是非Springboot项目,我们不能通过starter引入,需要引入spring-data-jpa、javax.transaction-api、hibernate-core。
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0modelVersion>
<parent>
<groupId>cn.pomitgroupId>
<artifactId>SpringWorkartifactId>
<version>0.0.1-SNAPSHOTversion>
parent>
<artifactId>SpringDataJpaartifactId>
<packaging>jarpackaging>
<name>SpringDataJpaname>
<url>http://maven.apache.orgurl>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-ormartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-dbcp2artifactId>
dependency>
<dependency>
<groupId>org.springframework.datagroupId>
<artifactId>spring-data-jpaartifactId>
<version>2.0.10.RELEASEversion>
dependency>
<dependency>
<groupId>javax.transactiongroupId>
<artifactId>javax.transaction-apiartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>org.hibernategroupId>
<artifactId>hibernate-coreartifactId>
<version>5.2.17.Finalversion>
<scope>compilescope>
<exclusions>
<exclusion>
<artifactId>jboss-transaction-api_1.2_specartifactId>
<groupId>org.jboss.spec.javax.transactiongroupId>
exclusion>
exclusions>
dependency>
dependencies>
<build>
<finalName>SpringDataJpafinalName>
build>
project>
父模块可以在https://www.pomit.cn/spring/SpringWork/pom.xml获取。
需要配置数据源、jdbcTemplate、entityManagerFactory、transactionManager和jpa:repositories。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<context:annotation-config />
<context:component-scan base-package="cn.pomit.springwork.springdatajpa">
context:component-scan>
<bean id="annotationPropertyConfigurerJpaLock"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="order" value="1" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="locations">
<list>
<value>classpath:db.propertiesvalue>
list>
property>
bean>
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db.dirverClass}">property>
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<property name="maxTotal" value="20" />
<property name="validationQuery" value="SELECT 1" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource">property>
bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource">property>
<property name="packagesToScan" value="cn.pomit.springwork.springdatajpa.domain">property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect">
property>
bean>
property>
bean>
<jpa:repositories base-package="cn.pomit.springwork.springdatajpa.dao" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
beans>
这里面,需要注意的是:
entityManagerFactory,是实体和数据库选择信息。
jpa:repositories,指明Spring-data-jpa的repositories地址。就是我们的数据库交互层。
transactionManager,事务处理器。
tx:annotation-driven:开启事务注解。
db.properties中存放数据库的地址端口等连接信息。
db.properties:
db.url=jdbc:mysql://127.0.0.1:3306/boot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
db.username=cff
db.password=123456
db.dirverClass=com.mysql.cj.jdbc.Driver
我们直接使用Spring-data-jpa, 一切都会变的特别简单。Spring-data-jpa支持快速查询,也支持@Query自定义查询,只需要新建接口继承JpaRepository或者CrudRepository等接口即可。
UserInfoDao :
package cn.pomit.springwork.springdatajpa.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import cn.pomit.springwork.springdatajpa.domain.UserInfo;
@Repository
public interface UserInfoDao extends JpaRepository<UserInfo, String> {
UserInfo findByUserName(String userName);
}
注意加上@Repository注解。实体要加上@Entity和@Table注解。
我们定义一个service和web接口来做测试。
UserInfoService :
package cn.pomit.springwork.springdatajpa.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.pomit.springwork.springdatajpa.dao.UserInfoDao;
import cn.pomit.springwork.springdatajpa.domain.UserInfo;
@Service
public class UserInfoService {
@Autowired
UserInfoDao userInfoDao;
public UserInfo getUserInfoByUserName(String userName){
return userInfoDao.findByUserName(userName);
}
}
SpringDataJpaRest:
package cn.pomit.springwork.springdatajpa.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import cn.pomit.springwork.springdatajpa.domain.UserInfo;
import cn.pomit.springwork.springdatajpa.service.UserInfoService;
@RestController
@RequestMapping("/springdatajpa")
public class SpringDataJpaRest {
@Autowired
UserInfoService userInfoService;
@RequestMapping(value = "/test/{name}", method = { RequestMethod.GET })
public UserInfo testMybatis(@PathVariable("name") String name) {
return userInfoService.getUserInfoByUserName(name);
}
}
UserInfo:
详细完整的实体,可以访问品茗IT-博客《Spring和SpringDataJpa整合详解》进行查看
全部代码可以在Spring组件化构建https://www.pomit.cn/java/spring/spring.html中的SpringDataJpa组件中查看,并下载。
Spring组件化构建
SpringBoot组件化构建
SpringCloud服务化构建
喜欢这篇文章么,喜欢就加入我们一起讨论Spring技术吧!