1.pom添加依赖

       <!-- spring data jpa,会注入tomcat jdbc pool/hibernate等 -->
     <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>

2.添加数据源配置(DataSource啥的,一系列对象spring boot 都会给你注入的,配置配置即可!)

spring.datasource.url=jdbc:mysql://localhost/test?characterEncoding=utf8&useSSL=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver #database pool config
# Number of ms to wait before throwing an exception if no connection is available.
spring.datasource.tomcat.max-wait=10000
# Maximum number of active connections that can be allocated from this pool at the same time.
spring.datasource.tomcat.max-active=300
# Validate the connection before borrowing it from the pool.
spring.datasource.tomcat.test-on-borrow=true
# initial pool size
spring.datasource.tomcat.initial-size=20
#=====================jpa config================================
#实体类维护数据库表结构的具体行为:update/create/create-drop/validate/none
spring.jpa.hibernate.ddl-auto=none
#打印sql语句
spring.jpa.show-sql=true
#格式化输出的json字符串
spring.jackson.serialization.indent_output=true

3.新建实体

@Entity
@Table(name="user")
public class User { @Id
@Column(name="id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id; @Column(name="number")
private String number; @Column(name="name")
private String name; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getNumber() {
return number;
} public void setNumber(String number) {
this.number = number;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

4.dao层

public interface UserDao{

    User getById(int id);

    User getByNumber(String number);

    int addUser(User user);

    void deleteUserById(int id);

    User updateUser(User user);

}
@Repository
public class UserDaoImpl implements UserDao { @PersistenceContext
private EntityManager entityManager; @Override
public User getById(int id) {
//find by primary key
return this.entityManager.find(User.class,id);
} @Override
public User getByNumber(String number) {
Query query = this.entityManager.createQuery("from User u where u.number=:number",User.class);
query.setParameter("number",number);
User user = (User)query.getSingleResult();
return user;
} @Override
public int addUser(User user) {
this.entityManager.persist(user);
//print the id
System.out.println(user.getId());
return user.getId();
} @Override
public void deleteUserById(int id) {
User user = this.entityManager.find(User.class,id); //关联到记录,方可删除
this.entityManager.remove(user);
} @Override
public User updateUser(User user) {
User userNew = this.entityManager.merge(user);
return userNew;
}
}

5.service层

public interface UserService {

    User getById(int id);

    User getByNumber(String number);

    int addUser(User user,boolean throwEx);

    void deleteUserById(int id);

    User updateUser(User user);
}
@Service
@Transactional
public class UserServiceImpl implements UserService { @Autowired
private UserDao userDao; @Override
@Transactional(readOnly = true)
public User getById(int id) {
return userDao.getById(id);
} @Override
@Transactional(readOnly = true)
public User getByNumber(String number) {
return userDao.getByNumber(number);
} @Override
public int addUser(User user,boolean throwEx) {
int id= this.userDao.addUser(user);
if(throwEx){
throw new RuntimeException("throw a ex");
}
return id;
} @Override
public void deleteUserById(int id) {
this.userDao.deleteUserById(id);
} @Override
public User updateUser(User user) {
return this.userDao.updateUser(user);
} }

6.controller层

@Controller("user1")
@RequestMapping("/jpa/user")
public class UserController {
/**
* 日志(slf4j->logback)
*/
private static final Logger logger = LoggerFactory.getLogger(UserController.class); @Autowired
private UserService userService; /**
* 返回text格式数据
* @param id 主键id
* @return 用户json字符串
*/
@RequestMapping("/get/id/{id}")
@ResponseBody
public String getUserById(@PathVariable("id")String id){
logger.info("request /user/get/id/{id}, parameter is "+id);
User user = userService.getById(Integer.parseInt(id));
return JSONObject.toJSONString(user);
} /**
* 返回json格式数据
* @param number 编号
* @return 用户
*/
@RequestMapping("/get/number/{number}")
@ResponseBody
public User getUserByNumber(@PathVariable("number")String number){
User user = userService.getByNumber(number);
return user;
} @RequestMapping("/add/{number}/{name}")
@ResponseBody
public String addUser(@PathVariable("number")String number,@PathVariable("name")String name,boolean throwEx){
User user = new User();
user.setNumber(number);
user.setName(name);
int id = -1;
try{
id = userService.addUser(user,throwEx);
}catch (RuntimeException ex){
System.out.println(ex.getMessage());
}
return String.valueOf(id);
} @RequestMapping("/delete/{id}")
@ResponseBody
public void getUserById(@PathVariable("id")int id){
this.userService.deleteUserById(id);
} @RequestMapping("/update/{id}/{number}/{name}")
@ResponseBody
public User addUser(@PathVariable("id")int id, @PathVariable("number")String number, @PathVariable("name")String name){
User user = new User();
user.setId(id);
user.setNumber(number);
user.setName(name);
return userService.updateUser(user);
}
}

7. spring data jpa新使用方式,更高级

1.dao

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
/**
* spring data jpa 会自动注入实现(根据方法命名规范)
* @return
*/
User findByNumber(String number); @Modifying
@Query("delete from User u where u.id = :id")
void deleteUser(@Param("id")int id);
} 2.service public interface UserService { User findById(int id); User findByNumber(String number); List<User> findAllUserByPage(int page,int size); User updateUser(User user,boolean throwEx); void deleteUser(int id);
} @Service
@Transactional
public class UserServiceImpl implements UserService { @Autowired
private UserRepository userRepository; @Override
public User findById(int id) {
return this.userRepository.findOne(id);
} @Override
public User findByNumber(String number) {
return this.userRepository.findByNumber(number);
} @Override
public List<User> findAllUserByPage(int page,int size) {
Pageable pageable = new PageRequest(page, size);
Page<User> users = this.userRepository.findAll(pageable);
return users.getContent();
} @Override
public User updateUser(User user,boolean throwEx) {
User userNew = this.userRepository.save(user);
if(throwEx){
throw new RuntimeException("throw a ex");
}
return userNew;
} @Override
public void deleteUser(int id) {
this.userRepository.deleteUser(id);
}
} 3.controller @Controller("user2")
@RequestMapping("/datajpa/user")
public class UserController {
/**
* 日志(slf4j->logback)
*/
private static final Logger logger = LoggerFactory.getLogger(UserController.class); @Autowired
private UserService userService; /**
* 返回text格式数据
* @param id 主键id
* @return 用户json字符串
*/
@RequestMapping("/get/id/{id}")
@ResponseBody
public String getUserById(@PathVariable("id")String id){
logger.info("request /user/get/id/{id}, parameter is "+id);
User user = userService.findById(Integer.parseInt(id));
return JSONObject.toJSONString(user);
} /**
* 返回json格式数据
* @param number 编号
* @return 用户
*/
@RequestMapping("/get/number/{number}")
@ResponseBody
public User getUserByNumber(@PathVariable("number")String number){
User user = userService.findByNumber(number);
return user;
} @RequestMapping("/get/all/{page}/{size}")
@ResponseBody
public List<User> getAllUserByPage(@PathVariable("page")int page,@PathVariable("size")int size){
return this.userService.findAllUserByPage(page,size);
} @RequestMapping("/update/{id}/{number}/{name}")
@ResponseBody
public User addUser(@PathVariable("id")int id, @PathVariable("number")String number, @PathVariable("name")String name,boolean throwEx){
User user = new User();
user.setId(id);
user.setNumber(number);
user.setName(name);
User userNew = null;
try{
userService.updateUser(user,throwEx);
}catch (RuntimeException ex){
System.out.println(ex.getMessage());
}
return userNew;
} @RequestMapping("/delete/{id}")
@ResponseBody
public void getUserById(@PathVariable("id")int id){
this.userService.deleteUser(id);
} }

8.注入jdbcTemplate和transactionTemplate,使用传统方式操作数据库,更加灵活,方法如下

    @Autowired
private JdbcTemplate jdbcTemplate; @Autowired
private TransactionTemplate transactionTemplate; /**
* 手动控制事物测试
* @param throwEx
*/
@Override
public void testTransactionManually(boolean throwEx) { try {
transactionTemplate.execute(new TransactionCallback<Boolean>() { /**
* 事物代码
*
* @param transactionStatus 事物状态
* @return 是否成功
*/
@Override
public Boolean doInTransaction(TransactionStatus transactionStatus) {
User user = new User();
user.setId(1);
int a = new Random().nextInt(10); //0-9
user.setNumber("10000u" + a);
jdbcTemplate.update("UPDATE USER SET NUMBER=? WHERE ID=?", new Object[]{user.getNumber(), user.getId()}, new int[]{Types.VARCHAR, Types.INTEGER});
if (throwEx) {
throw new RuntimeException("try throw exception"); //看看会不会回滚
}
return true;
}
});
}catch (RuntimeException ex){
System.out.println(ex.getMessage());
} } /**
* 手动执行jdbc测试
*/
@Override
public void testJdbcTemplate() {
User user = new User();
int a = new Random().nextInt(10); //0-9
user.setNumber("10000i"+ a );
user.setName("name"+a);
this.jdbcTemplate.update("INSERT into USER(NUMBER,NAME )VALUES (?,?)",user.getNumber(),user.getName());
}

至此,我已经讲了三种方式(jpa两种+jdbcTemplate)如何操作数据库了,你爱怎么用就怎么用,上述代码均是实践证明可行的!

项目源码:https://github.com/hdwang123/springboottest_onedb

五、spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate的更多相关文章

  1. Spring Boot微服务如何集成fescar解决分布式事务问题?

    什么是fescar? 关于fescar的详细介绍,请参阅fescar wiki. 传统的2PC提交协议,会持有一个全局性的锁,所有局部事务预提交成功后一起提交,或有一个局部事务预提交失败后一起回滚,最 ...

  2. Spring Boot 2.0 快速集成整合消息中间件 Kafka

    欢迎关注个人微信公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site ...

  3. Spring Boot与ActiveMQ的集成

    Spring Boot对JMS(Java Message Service,Java消息服务)也提供了自动配置的支持,其主要支持的JMS实现有ActiveMQ.Artemis等.本节中,将以Active ...

  4. spring boot与ElasticSearch的集成

    本文主要介绍Spring boot与ElasticSearch的集成,因为Spring boot的教程以及ElasticSearch的学习其他博客可能更优秀,所以建议再看这篇文章前先学习学习一下Spr ...

  5. Spring Boot 微服务应用集成Prometheus + Grafana 实现监控告警

    Spring Boot 微服务应用集成Prometheus + Grafana 实现监控告警 一.添加依赖 1.1 Actuator 的 /prometheus端点 二.Prometheus 配置 部 ...

  6. Spring Boot 2.x 快速集成Kafka

    1 Kafka Kafka是一个开源分布式的流处理平台,一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据.Kafka由Scala和Java编写,2012年成为Apache ...

  7. Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源

    本文是 Spring Boot 整合数据持久化方案的最后一篇,主要和大伙来聊聊 Spring Boot 整合 Jpa 多数据源问题.在 Spring Boot 整合JbdcTemplate 多数据源. ...

  8. Spring Boot (二)集成Jsp与生产环境部署

    一.简介 提起Java不得不说的一个开发场景就是Web开发,也是Java最热门的开发场景之一,说到Web开发绕不开的一个技术就是JSP,因为目前市面上仍有很多的公司在使用JSP,所以本文就来介绍一下S ...

  9. Spring boot security权限管理集成cas单点登录

    挣扎了两周,Spring security的cas终于搞出来了,废话不多说,开篇! Spring boot集成Spring security本篇是使用spring security集成cas,因此,先 ...

随机推荐

  1. Django Rest Framework源码剖析(六)-----序列化(serializers)

    一.简介 django rest framework 中的序列化组件,可以说是其核心组件,也是我们平时使用最多的组件,它不仅仅有序列化功能,更提供了数据验证的功能(与django中的form类似). ...

  2. 20155232《网络对抗》Exp 6 信息搜集与漏洞扫描

    20155232<网络对抗>Exp 6 信息搜集与漏洞扫描 一.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版 ...

  3. 汇编 EBP ,ESP 寄存器

    知识点:  CALL框架  EBP寄存器 栈底指针  ESP寄存器 栈顶指针 一.EBP栈底指针 EBP是一个特殊的寄存器,通过EBP+偏移量 可以访问CALL里边的局部变量.它的低16位叫BP ...

  4. TICTOC: Header Only C++ Timer

    感觉最近的更新频率略高啊-哈哈- 这次的带来的是一个十分简单便利的C++计时库. 项目地址:https://github.com/miaoerduo/tictoc 欢迎Start和提MR. 项目中有详 ...

  5. 1、Docker概述与安装

    1.Docker概述 原文地址:https://docs.docker-cn.com/engine/docker-overview/#docker-engine Docker是一个开发,集装,运行应用 ...

  6. 小白之selenium+python关于cookies绕开登录1

    cookie是存储在本地浏览器目录的一些信息,详细一点的话可以查看度娘,按照我的理解就是将信息存储在本地,访问网站的时候,网站的服务器会优先读取本地目录位置的信息,然后做出相对的反应.这就是为什么有的 ...

  7. linux重启tomcat的shell脚本

    基本思路: 先检查待重启的tomcat的进程是否存在 存在则执行shutdown. 然后再次检查进程是否还存在,不存在则执行kill 然后删除工作空间及10天前的日志. 最后执行启动. #!/bin/ ...

  8. mac10.12.6系统使用cmake安装opencv3.3.0+opencv_contrib-3.3.0

    brew与cmake brew安装 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/ins ...

  9. c语言数字图像处理(二):图片放大与缩小-双线性内插法

    图像内插 假设一幅大小为500 * 500的图像扩大1.5倍到750 * 750,创建一个750 * 750 的网格,使其与原图像间隔相同,然后缩小至原图大小,在原图中寻找最接近的像素(或周围的像素) ...

  10. Zip伪加密 破解ZIP密码

    ZIP是一种相当简单的分别压缩每个文件的存档格式.分别压缩文件允许不必读取另外的数据而检索独立的文件:理论上,这种格式允许对不同的文件使用不同的算法.不管用何种方法,对这种格式的一个告诫是对于包含很多 ...