《SpringBoot实战派》一书第八章用ORM操作SQL数据库,具体操作过程和踩坑实录。
第一,由于本台计算机上没有安装mysql,在练习书中代码的时候,误以为本机不需要数据库便可以运行代码,导致卡了好久。
第二,把当时学习Mysql重拾起来,算是学以致用。
第三,遇到问题就一步一步解决问题,有挫败感正常,学会越挫越勇,转移挫败感逐渐找回信心直到正反馈的出现。任何人学习代码都是这个过程。

文章目录

  • 0.认识JDBC Template
  • 1.使用JDBCTemplate实现数据的增加、删除、修改和查询
  • 2.用JPA构建mysql实体数据表

0.认识JDBC Template

JDBC(Java DataBase Connectivity)是Java用于连接数据库的规范,也就是用于执行数据库SQL语句的Java API。它是由一组用Java语言编写的类和接口组成,为大部分关系型数据库提供访问接口。

JDBC需要每次进行数据库连接,然后处理SQL语句、传值、关闭数据库。如果都由开发人员编写代码,则很容易出错,可能会出现使用完成之后,数据库连接忘记关闭的情况。这容易导致连接被占用而降低性能,为了减少这种可能的错误,减少开发人员的工作量,JDBCTemplate被设计出来。

JDBCTemplate
JDBCTemplate=JDBC+Template,是对JDBC的封装。它更便于程序实现,替我们完成所有的JDBC底层工作。因此,对于数据库的操作,再不需要每次都进行连接、打开、关闭了。

JDBC和JDBCTemplate就像仓库管理员,负责从仓库中存取物品。而后者不需要每次进入都开门,取完关门,因为有电动门自动控制。

1.使用JDBCTemplate实现数据的增加、删除、修改和查询

项目结构

添加依赖
要使用JDBCTemplate,则需要添加其Starter依赖。因为要操作数据库,所有也需要配置数据库(以mysql为例)的连接依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope><version>8.0.20</version></dependency>

添加完依赖之后,还需要配置数据库的连接信息。这样JDBC才能正常连接到数据库。在application.properties配置文件中配置数据库的地址和用户信息

//配置ip地址,编码,时区和SSL
spring.datasource.url=jdbc:mysql://127.0.0.1/book?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
//用户名
spring.datasource.username=root
//密码
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

User.java
新建一个测试实体类User,实现RowMapper类,重写mapRow方法,以便实现字段和数据表字段映射。映射是指把Java中设置的实体字段和mysql数据库的字段对应起来,因为实体id可以对应数据库字段的u_id,也可以对应id、那么等。如果不重写,则程序不知道如何对应。

package com.example.demo.model;import lombok.Data;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;@Data
public class User implements RowMapper<User> {private int id;private String username;private String password;//必须重写mapRow方法@Overridepublic User mapRow(ResultSet resultSet,int i) throws SQLException{User user=new User();user.setId(resultSet.getInt("id"));user.setUsername(resultSet.getString("username"));user.setPassword(resultSet.getString("password"));return  user;}
}

JDBCTemplate提供了以下操作数据的3个方法

方法 含义
execute 表示执行,用于直接执行sql语句
update 表示更新,包括新增、修改、删除操作
query 表示查询

1)创建数据表
在使用JDBCTemplate之前,需要在控制器中注入JDBCTemplate,然后可以通过execute方法执行sql语句

2)添加数据
通过update方法

3)查询修改删除数据
执行sql字符串里面的SQL语句,通过query,update方法

UserController.java

package com.example.demo.controller;import com.example.demo.model.User;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;
import java.util.Map;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.*;
@SpringBootTest
@RunWith(SpringRunner.class)/*** @author longzhonghua* @data 2/24/2019 9:51 AM*/
@RestController
@RequestMapping("user")
public class UserController {@Autowiredprivate JdbcTemplate jdbcTemplate;@Test//创建数据表@GetMapping("createUserTable")public void createUserTable() throws Exception {String sql = "CREATE TABLE `user` (\n" +"  `id` int(10) NOT NULL AUTO_INCREMENT,\n" +"  `username` varchar(100) DEFAULT NULL,\n" +"  `password` varchar(100) DEFAULT NULL,\n" +"  PRIMARY KEY (`id`)\n" +") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;\n" +"\n";jdbcTemplate.execute(sql);}@Test//saveUserTest//添加一个测试数据@GetMapping("saveUserTest")public void saveUserTest()throws Exception  {String sql = "INSERT INTO user (USERNAME,PASSWORD) VALUES ('longzhiran','123456')";int rows = jdbcTemplate.update(sql);System.out.println(rows);}@Test//updateUserPassword?id=1&passWord=12345678@GetMapping("updateUserPassword")public void updateUserPassword() throws Exception {Integer id=1;String passWord="999888";String sql = "UPDATE user SET PASSWORD = ? WHERE ID = ?";int rows = jdbcTemplate.update(sql, passWord, id);System.out.println(rows);}@Test//deleteUserById?id=1@GetMapping("deleteUserById")public void deleteUserById() throws Exception {String sql = "DELETE FROM  user  WHERE ID = ?";int rows = jdbcTemplate.update(sql, 1);System.out.println(rows);}@Test//getUserByName?userName=longzhiran@GetMapping("getUserByName")public void getUserByName()throws Exception {String name="longzhonghua";String sql = "SELECT * FROM user WHERE USERNAME = ?";List<User> list = jdbcTemplate.query(sql, new User(), new Object[]{name});for(User user:list){System.out.println(user);}}@Test//getAll@GetMapping("list")public void list() throws Exception {String sql = "SELECT * FROM user limit 1000";List<User> userList = jdbcTemplate.query(sql,new BeanPropertyRowMapper(User.class));for(User userLists:userList){System.out.println(userLists);}}}

运行项目
然后运行test创建数据表

打开book数据库,发现多了一张名为user的表

运行测试

在mysql中查看,发现多了一个用户

运行测试

在mysql中查看,密码已经修改

运行测试

在mysql中查看
id=1的用户信息已经删除

2.用JPA构建mysql实体数据表

第一步:安装mysql,这里笔者安装的是mysql 8.0.20
安装请移步笔者的另一篇博客:Mysql8.0.20下载和安装

第二步:创建数据库book

第三步就是IDEA中的操作

0.添加依赖
需要注意的是:注意mysql的版本需要设置正确

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.20</version><scope>runtime</scope></dependency>

1.配置文件

这里的数据库用户名和密码是自己的,一般为root和root

spring.datasource.url=jdbc:mysql://127.0.0.1/book?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= truespring.thymeleaf.cache=false
server.port=8080

当时报错:

org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

学习《Spring Boot实战派》时由于没有本台电脑上没有安装mysql,所以自然连不上,需要先安装mysql 然后创建数据库book。

后面踩过的坑
遇到问题

o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: S1009
o.h.engine.jdbc.spi.SqlExceptionHelper   : Unable to load authentication plugin 'caching_sha2_password'.

解决方法:更改mysql依赖的版本

然后接着报错

o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 08001
o.h.engine.jdbc.spi.SqlExceptionHelper   : Public Key Retrieval is not allowed

解决方案:cmd中登录mysql数据库 mysql -u root -p 输入密码

又遇到错误

o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1049, SQLState: 42000
o.h.engine.jdbc.spi.SqlExceptionHelper   : Unknown database 'book'

新建数据库book,使得本机存在book数据库

Article.java

package com.example.demo.entity;import com.sun.org.apache.xpath.internal.operations.Bool;
import lombok.Data;
import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;@Entity
@Data
public class Article implements Serializable{@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private long id;@Column(nullable = false,unique = true)@NotEmpty(message = "标题不能为空")private String title;@Column(columnDefinition = "enum('图','图文','文')")private String type;private Boolean available=Boolean.FALSE;@Size(min=0,max=20)private String keyword;@Size(max=255)private String description;@Column(nullable = false)private String body;@Transientprivate List keywordlists;public List getKeywordlists(){return Arrays.asList(this.keyword.trim().split("|"));}public void setKeywordlists(List keywordlists){this.keywordlists=keywordlists;}
}

运行项目之后会生成数据表如下图

sql数据库JDBCTemplate和JPA使用相关推荐

  1. bluemix java_Bluemix 基础:将 SQL 数据库添加到您的 Java 应用程序中

    概述 学习如何在 Bluemix 上创建一个 SQL 数据库,并将其添加到您的 Java Web 应用程序中.探索一个数据驱动.动态生成的网络商店,该商店会根据当前库存水平来改变外观.使用基于 Web ...

  2. Unity + SQL数据库创建管理玩家排行榜学习教程

    Unity + SQL Databases Player Management Leaderboards + More! Unity + SQL数据库玩家管理排行榜+更多! MP4 |视频:h264, ...

  3. 在ASP.NET中使用WINDOWS模式登录SQL数据库

    作者:未知   请作者速与本人联系 经常发现有用户使用WINDOWS模式登录SQL SERVER,结果失败,提示: 用户 'KEKC/ASPNET' 登录失败. 说明: 执行当前 Web 请求期间,出 ...

  4. SQL数据库无法附加 系统表损坏修复 数据库中病毒解密恢复

    SQL数据库无法附加 系统表损坏修复 数据库中病毒解密恢复 开发此工具是为了 让手工恢复数据库物理故障时 更加简单便捷直观, 本工具用于物理修复独立处理大部分问题以及与DBCC配合完成修复各种数据库错 ...

  5. SQL数据库的数据体系结构

    SQL数据库的数据体系结构基本上是三级结构.在SQL中,关系模式(模式)称为"基本表"(base table):存储模式(内模式)称为"存储文件"(stored ...

  6. 物流信息管理系统MySQL设计,物流管理系统的SQL数据库设计(含代码)

    物流管理系统的SQL数据库设计(含代码) 物流管理信息系统的数据库设计班级xxx系统名称:物流管理信息系统一.需求分析物流管理系统是为制造商和零售商设计的管理系统数据库系统,目的是:1.实现上游制造商 ...

  7. C# 连接SQL数据库字符串

    一:C# 连接SQL数据库   Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=m ...

  8. 压缩SQL数据库日志-收缩SQL数据库日志-备份SQL数据库日志-删除SQL数据库日志

    [标题]压缩SQL数据库日志-收缩SQL数据库日志-备份SQL数据库日志-删除SQL数据库日志  [内容]         清除SQL数据库日志文件        有两种方式: 一.是压缩日志,二.是 ...

  9. SQL数据库无法附加 823错误修复 连接中断

    SQL数据库无法附加 823错误修复 连接中断 数据类型 MSSQL 2000 速达数据库 数据大小 156 MB 故障检测 无法附加,提示连接中断. 客户要求 恢复数据库数据 修复好 ERP可直接使 ...

最新文章

  1. mysql json类型数组索引_MySQL JSON 类型数据操作
  2. 100内奇数之和流程图_IATF 16949体系资料之过程流程图,收藏备用!
  3. Android应用优化方案
  4. Apache的make编译错误
  5. mysql通过命令创建数据库和导入数据库
  6. boost::geometry模块Linestring相关的测试程序
  7. [Python学习记录]——Hello Python
  8. easylog 使用_Easyloggingpp的使用
  9. cocos2d 很水很水的看法
  10. 程序员求助:被领导强行要求写Bug该怎么办?网友的回答让我笑翻
  11. jQuery+CSS动态改变class
  12. 网工路由交换相关配置
  13. 如何批量从Excel文件中导入数据到数据库(二)
  14. java添加购物车代码_Java web实现购物车功能的示例代码
  15. python setup.py install没反应_花了两天,终于把 Python 的 setup.py 给整明白了
  16. 马虎词汇教程1-5(转载)
  17. 群晖docker中安装VS code
  18. IDEA炫酷的主题字体颜色设置
  19. 射击末世--装饰者模式
  20. win10系统Microsoft Edge连接不上Internet

热门文章

  1. RestSharp .net 轻量级rest客户端
  2. ssr无法在win10使用_Nuxt SSR中使用WangEditor爬坑—把对象暴打出原型
  3. python大数据论坛_干货 | Python+大数据计算平台,PyODPS架构手把手教你搭建
  4. Verdi GUI技能操作-Application Tutorials部分
  5. 用WINRAR巧妙分割大压缩包
  6. stm32逆向与安全科普,bin文件逆向反汇编
  7. 建模案例:最优截断切割问题
  8. 【树型DP】加分二叉树
  9. matlab-画个拱桥和倒影?
  10. bzoj 1069 [SCOI2007]最大土地面积——旋转卡壳