一、ORM关系对象映射做了什么?
- 思考题:Mysql与springboot整合的流程步骤是怎样的?
- 对象关系映射,是一种规范,调节目前面向对象的程序设计与主流的关系型数据库之间发展不同步的问题,关系到对象的映射
让编程时可以全身心的用面向对象的设计思想去编程,用对象映射关系数据表,在持久化时,可以直接操作对象进行持久化
- ORM关系对象映射图
二、Mysql与Java实战之JdbcTemplate整合方式
- 什么是jdbc?
- Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法
- 什么是jdbcTemplate?
- Spring 的 JDBC Templet 是 Spring 对 JDBC 使用的一个基本的封装。他主要是帮助程序员实现了数据库连接的管理,其余的使用方式和直接使用 JDBC 没有什么大的区别。
- 环境准备
- 在linux或者mac安装MySql5.7版本并打开MySql服务
- 建表语句:
create database xdclass_mysql; create table user (id bigint auto_increment comment '自增id',name varchar(64) default '' not null comment '用户名称', primary key (id)) default charset=utf8mb4; grant all privileges on xdclass_mysql.* to 'xdclass'@'%' identified by 'xdclass'; flush privileges;
-
- 配置数据源
#通用数据源配置 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/xdclass_mysql?charset=utf8mb4&useSSL=false spring.datasource.username=xdclass spring.datasource.password=xdclass # Hikari 数据源专用配置 spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5
-
- 引入web项目依赖和jdbc对应jar包的maven依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency>
三、这种硬编码的方式,其实已经不推荐了
编码我也直接放出,说不定什么时候有用呢?
UserController
点击查看完整内容
import com.xdclass.mysql.constant.RestItemResult; import com.xdclass.mysql.dao.UserDao; import com.xdclass.mysql.domain.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @RestController @RequestMapping("/user") public class UserController { @Resource private UserDao userDao; @RequestMapping("/query") private RestItemResult<User> queryById(){ RestItemResult<User> userRestItemResult = new RestItemResult<>(); User locate = userDao.locate(1L); userRestItemResult.setItem(locate); return userRestItemResult; } @RequestMapping(value = "/add", method = RequestMethod.POST) public RestItemResult<User> add(@RequestBody User user) { RestItemResult<User> result = new RestItemResult<>(); userDao.add(user); if (user != null) { result.setItem(user); result.setResult("success"); } else { result.setMessage("新增用户失败"); result.setResult("failure"); } return result; } @RequestMapping(value = "/update", method = RequestMethod.POST) public RestItemResult<User> update(@RequestBody User user) { RestItemResult<User> result = new RestItemResult<>(); userDao.update(user); if (user != null) { result.setItem(user); result.setResult("success"); } else { result.setMessage("修改用户失败"); result.setResult("failure"); } return result; } @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET) public RestItemResult<User> delete(@PathVariable Long id) { RestItemResult<User> result = new RestItemResult<>(); if (userDao.delete(id)) { result.setResult("success"); } else { result.setMessage("删除用户失败"); result.setResult("failure"); } return result; } @RequestMapping(value = "/locate/{id}", method = RequestMethod.GET) public RestItemResult<User> locate(@PathVariable Long id) { RestItemResult<User> result = new RestItemResult<>(); User user = userDao.locate(id); if (user != null) { result.setItem(user); result.setResult("success"); } else { result.setMessage("查询用户失败"); result.setResult("failure"); } return result; } }
RestItemResult
点击查看完整内容
public class RestItemResult<T> { private String result; private String message; private T item; public String getResult() { return result; } public void setResult(String result) { this.result = result; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getItem() { return item; } public void setItem(T item) { this.item = item; } }
UserDao
点击查看完整内容
import com.xdclass.mysql.domain.User; import java.util.List; /** * @author daniel */ public interface UserDao { /** * 向数据库中保存一个新用户 * * @param user 要保存的用户对象 * @return 是否增肌成功 */ Boolean add(User user); /** * 更新数据库中的一个用户 * * @param user 要更新的用户对象 * @return 是否更新成功 */ Boolean update(User user); /** * 删除一个指定的用户 * * @param id 要删除的用户的标识 * @return 是否删除成功 */ boolean delete(Long id); /** * 精确查询一个指定的用户 * * @param id 要查询的用户的标识 * @return 如果能够查询到,返回用户信息,否则返回 null */ User locate(Long id); /** * 通过名称模糊查询用户 * * @param name 要模糊查询的名称 * @return 查询到的用户列表 */ List<User> matchName(String name); }
UserDaoImpl
点击查看完整内容
import com.xdclass.mysql.domain.User; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.support.rowset.SqlRowSet; import org.springframework.stereotype.Repository; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @Repository public class UserDaoImpl implements UserDao { @Resource private JdbcTemplate jdbcTemplate; @Override public Boolean add(User user) { String sql = "INSERT INTO user(id,NAME) VALUES(?,?)"; return jdbcTemplate.update(sql, user.getId(), user.getName()) > 0; } @Override public Boolean update(User user) { String sql = "UPDATE user SET NAME = ? WHERE id = ?"; return jdbcTemplate.update(sql, user.getName(), user.getId()) > 0; } @Override public boolean delete(Long id) { String sql = "DELETE FROM user WHERE id = ?"; return jdbcTemplate.update(sql, id) > 0; } @Override public User locate(Long id) { String sql = "SELECT * FROM user WHERE id=?"; SqlRowSet rs = jdbcTemplate.queryForRowSet(sql, id); if (rs.next()) { return generateEntity(rs); } return null; } @Override public List<User> matchName(String name) { String sql = "SELECT * FROM user WHERE NAME LIKE ?"; SqlRowSet rs = jdbcTemplate.queryForRowSet(sql, "%" + name + "%"); List<User> users = new ArrayList<>(); while (rs.next()) { users.add(generateEntity(rs)); } return users; } private User generateEntity(SqlRowSet rs) { User weChatPay = new User(); weChatPay.setId(rs.getLong("id")); weChatPay.setName(rs.getString("NAME")); return weChatPay; } }
User
点击查看完整内容
public class User { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
四、HTTP应用增删改查协议剖析
补充一个知识,未来可能有用
- HTTP协议简介
- HTTP 协议(Hypertext Transfer Protocol,超级文本传输协议),顾名思义,是关于如何在网络上传输超级文本(即 HTML 文档)的协议。HTTP 协议规定了 Web的基本 运作过程,以及浏览器与Web服务器之间的通信细节。HTTP协议采用客户/服务器通信模式,服务器端为 HTTP 服务器,它也称做 Web 服务器;客户端为 HTTP 客户程序,浏览器是最常见的 HTTP客户程序。
- 如图所示,在分层的网络体系结构中,HTTP协议位于应用层,建立在 TCP/IP 协议的基础上。HTTP 协议使用可靠的 TCP 连接,默认端口是 80 端口
- 当用户在浏览器中输入一个指向特定网页的 URL 地址时,浏览器就会生成一个 HTTP 请求,建立与远程 HTTP 服务器的 TCP 连接,然后把 HTTP 请求发送给远程 HTTP 服务器,HTTP 服务器再返回包含相应网页数据的 HTTP 响应,最后浏览器把这个网页显示出来。当浏览器与服务器之间的数据交换完毕,就会断开连接。
- JAVA socket套接字创建监听请求实战
- 查看端口占用 mac/linux:lsof -i:8080, windows: netstat -aon|findstr "8080"
- http 0.9==>http1.0==>http1.1==>http2==>http3(后续发展趋势是quic)
- 1.0 POST、DELETE、PUT、HEADER
- 1.1长连接 管道化
- 2.0 二进制分祯 多路复用:在共享TCP链接的基础上同时发送请求和响应
五、JdbcTemplate存在问题与Mybatis的引入
- 思考jdbcTemplate的缺点
- 将sql语句硬编码到java代码中,如果sql语句修改,需要重新编译java代码,不利于系统维护
- 在向statement中设置参数,对站位符位置和设置参数数值,硬编码到java代码中
- 从result结果集中遍历数据时,存在硬编码
- 解决方案
- 把sql语句定义到xml配置文件里
- 将结果集自动映射成java对象 UserInfo List int count
- 现成工具MyBatis
- MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- 工作原理
六、Mybatis
本文作者为DBC,转载请注明。