大概是17年时用过jdbc进行操作数据库,到现在为止没有再用过jdbc去写过一个示例程序,即简单的增删改查操作,CRUD也不是那么容易写吧,后面就开始基于ORM框架进行数据的操作了,是的,各种ORM框架我都用过。
有比较容易上手的JPA和Hibernate框架,不过这两个在企业中用的比较少,最常使用的就是MyBatis框架了,尤其它在动态sql方面的支持在我看来特别称赞,这也是自己为什么用了这么久ORM框架后要重新回过头来简单看下jdbc的操作了。
jdbc可以说是各个数据库厂商的规范,它也是java操作数据库的一种桥梁,数据库的增删改查操作都可以基于sql进行,自己也写过mybatis系列文章以及mysql操作sql语句的文章,想了解的可以看下历史文章。
接下来的示例程序很简单,我写这篇示例程序主要是为了回顾一下几年前刚刚学习jdbc时的用法,不涉及什么概念的讲解,想回忆一下的可以看下,对我而言写一篇文章不再是去分享一个技术点,我想这就是自己这段时间的改变,没有什么值得去炫耀,算是对自己掌握的技术点的一个回顾了,避免日后操作起来有点不知所措吧。
首先,操作数据库就需要我们熟知的连接mysql数据库驱动的jar包信息,由于这里基于maven的方式构建的项目,所以引入下面的jar包依赖信息就可以了。
org.springframework.boot
spring-boot-starter-jdbc
org.springframework.boot
spring-boot-starter-web
mysql
mysql-connector-java
runtime
org.projectlombok
lombok
1.18.12
上面主要是基于springboot的模式构建的web项目,所以添加web依赖的信息是不可缺少的。
然后,这里就写了一个简单的获取数据库连接的工具类,记得当初初学jdbc时完全不知道这是为什么?或许当初那个大大的问号也是为后来的现在做了一个隐藏的思考,到这里也算是明白了其中的含义。
package com.wpw.springbootjdbc;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
@Slf4j
@UtilityClass
public class DbUtil {
private static final String USER_NAME = "root";
private static final String PASSWORD = "root";
private static final String URL = "jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTC";
public static Connection getConnection() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection(URL, USER_NAME, PASSWORD);
} catch (ClassNotFoundException e) {
log.error("loading MySQL Driver fail,error message:{}", e.getMessage());
} catch (SQLException e) {
log.error("get sql connection fail,error message:{}", e.getMessage());
}
return null;
}
}
一般,java作为一门高级语言,我们在书写业务的时候就是基于面向对象编程的,写到这感觉书写CRUD代码也不是很容易,因为后端的技术点太多了,多的时时刻刻都有新的技术出来,或许你之前学习到的技术点早已用不上了。
比如上文提到的Hibernate框架以及JPA框架在企业中用的都比较少了或者说都不用了,这个时候你知识储备的内容或许稍微少了一点,但与此同时你会接触一个稍微比较好的技术,然后你有开始了一个新的技术使用的征程中,是的,你没有看错,现实就是这样,若企业没有用到这样的技术,你学了用不上等于"白学",这也是为什么会后技术leader或者稍微有丰富技术的工程师在一个项目的开始时会去做一个技术选型的原因吧。
java既然作为一门面向对象的高级语言,使用它去操作数据库自然不能少了一个基础类,这里就用比较常见的也是自己常用的user类做下示例程序的介绍了。
package com.wpw.springbootjdbc.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author wpw
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Accessors(chain = true)
public class User implements Serializable {
private Integer id;
private String userName;
private String passWord;
}
上面的各个注解的使用完全是基于lombok第三方依赖包,使用这个好处主要是减少了get,set方法的使用,在之前公司做业务的时候自己也在项目中也引入了这个包,好的东西肯定要用上,况且这也是简化项目,保持代码整洁的一种方式,习惯了这个方式的使用,也不用去写构造者模式的代码了。
下面就是基于数据库进行列表的查找和保存信息的代码了,关于增删改查这里只写了两个方法,查找和新增,其它两个没有写,因为我觉得你会写sql你就会了其它的方式,自己理解一些就好了。
package com.wpw.springbootjdbc;
import com.wpw.springbootjdbc.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* @author wpw
*/
@RestController
@Slf4j
public class UserController {
@GetMapping(value = "/getUserList")
private List getUserList() {
Connection connection = DbUtil.getConnection();
List userList = new ArrayList<>();
User user = null;
try {
PreparedStatement preparedStatement = connection.prepareStatement("select * from user");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
user = User.builder().id(id).userName(username).passWord(password).build();
userList.add(user);
}
} catch (SQLException e) {
log.error("error message:{}", e.getMessage());
} finally {
try {
connection.close();
} catch (SQLException e) {
log.error("connection close fail");
}
}
return userList;
}
@PostMapping(value = "/saveUser")
public void saveUser(@RequestBody User user) {
Connection connection = DbUtil.getConnection();
try {
PreparedStatement preparedStatement = connection.prepareStatement("insert into user(id,username,password) values(?,?,?)");
preparedStatement.setInt(1, user.getId());
preparedStatement.setString(2, user.getUserName());
preparedStatement.setString(3, user.getPassWord());
preparedStatement.execute();
} catch (SQLException e) {
log.error("insert fail");
} finally {
try {
connection.close();
} catch (SQLException e) {
log.error("connection close fail");
}
}
}
}
到这里就结束了,这也是算自己上个星期为什么没有写jdbc文章的一个总结,所以也算是补充一下技术点的回顾,最近写文章的时间越来越少了,可能自己不再那么追求写文章了,所以你看到这里就知道全篇文章,我想说的,想要表达的内容就和之前的文章风格不一样了,技术驱动业务?业务驱动技术?或许这两者是相辅相成的,以前我会学习各种技术,包括各种用不到的技术我都会学,这也导致了我的精神状态不是很好,记得昨天吃饭时有点疲惫时,赶紧放下了手机,看看视频才觉得,哦,没有必要全身心去学习额外的技术,本就平凡,就按照平凡的去做吧,当初初学spring框架时自己是完全不懂IOC和AOP的实际场景中的使用,后面随着工作年限的增长自己可以基于这样的技术去思考一个事情了,这或许是自己当初留下的思考方式对自己的作用吧。
其实现在看别人总结的学习路线图,基本上上面的内容自己一年之前都完全学习了,由于工作中用的少,所以示例程序倒是写了很多,不过常用的技术点会就行了,没有必要去完全把所有的东西都学会,因为这样很累,公司不用,虽然你会,但是随着时间的流逝,你的精神状态由于需要学习这么多内容会疲惫的,这也算是自己的一个感悟吧。
我之前是会用非关系型数据库进行业务的编码的,于此同时我学会了基于mongodb去做业务的开发,但是后面随着业务开发,mongodb用于存储数据却不见了身影,后面mongodb做为了上传文件的存储,自己写了一篇mongodb作为文件存储的操作文章,所以后面接触了更多的是mysql关系型数据库的操作,所以技术是和公司挂钩的,公司用什么,你就会什么就好了,知道了不代表会用,这也是自己写这么多文章完全不涉及到比较高深的消息队列kafka的操作,因为除了之前用了之后,后面就没有在接触过,所以我github上的kafka示例程序的内容到目前截止自己都没有去整理成一篇文章,所以我整理的都是偏向于java基础的编码的内容,算是当做一些自己思考的回顾吧,这也是自己为什么会把这篇文章当做java进阶文章的原因了。
到这里就结束了,算是一个阶段内容的回顾好了。