JDBC学习,从入门到入土

JDBC引入

JDBC概念:

JDBC是使用Java语言操作关系型数据库的一套API。全称:(Java DataBase Connectivity)Java数据库连接

JDBC的本质:

官方定义的一套操作所有关系型数据库的规则,即接口

各个数据库厂商去实现这套接口,即提供实现类,这些实现类也叫做驱动, 厂商提供的是相应的数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的是驱动jar包中的实现类。

JDBC的好处:

各数据库厂商使用相同的接口,Java代码不需要针对不同的数据库分别开发。可随时替换底层数据库,访问数据库的Java代码基本不变。

JDBC的使用步骤

有七步,如代码所示:

package JDBC学习;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class test1 {public static void main(String[] args) {Connection conn = null;Statement sta = null;try {//1 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2 获取连接String url = "jdbc:mysql://127.0.0.1:3306/limingmao";String username = "liergou";String password = "liergou070509";conn = DriverManager.getConnection(url, username, password);//3 定义SQLString sql_1 = "UPDATE emp1 SET salary = 20000 WHERE `name` = 'Tom'";//4 获取执行sql的对象Statementsta = conn.createStatement();//5 执行sqlint i = sta.executeUpdate(sql_1);//i为受影响的行数//6 处理结果System.out.println(i);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {//7 释放资源try {sta.close();} catch (SQLException e) {e.printStackTrace();}try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}

注:mysql5.0之后可以省略注册驱动一步

JDBC API详解

DiverManager

DiverManager(驱动管理类)作用:

  1. 注册驱动
  2. 获取数据库连接

关于DiverManager中的静态方法static Connection getConnection(String url,String user,String password)

参数:
  1. url:连接路径

  1. user:用户名
  2. password:密码

Connection

Connection(数据库连接对象)作用:

  1. 获取执行SQL的对象
  2. 管理事务

获取执行SQL的对象

  • 普通执行SQL对象

Statement createStatement()

  • 预编译SQL的执行SQL对象:防止SQL注入

PreparedStatement preparedStatement(sql)

  • 执行存储变量的对象

CallableStatement prepareCall(sql)

 事务管理

 可以利用JDBC的三个方法来管理事务:

package JDBC学习;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class test2 {public static void main(String[] args) {Connection conn = null;Statement sta = null;try {//1 注册驱动//Class.forName("com.mysql.cj.jdbc.Driver");//2 获取连接String url = "jdbc:mysql://127.0.0.1:3306/limingmao";String username = "liergou";String password = "liergou070509";conn = DriverManager.getConnection(url, username, password);//3 定义SQLString sql_1 = "UPDATE emp1 SET salary = 20000 WHERE `name` = 'Tom'";String sql_2 = "UPDATE emp1 SET salary = 20000 WHERE `name` = '丘丘人'";//4 获取执行sql的对象Statementsta = conn.createStatement();//开启事务conn.setAutoCommit(false);//5 执行sqlint i = sta.executeUpdate(sql_1);//i为受影响的行数int j = sta.executeUpdate(sql_2);//i为受影响的行数//6 处理结果System.out.println(i);System.out.println(j);//提交事务conn.commit();} /*catch (ClassNotFoundException e) {e.printStackTrace();} */catch (SQLException e) {//回滚事务try {conn.rollback();} catch (SQLException ex) {e.printStackTrace();}e.printStackTrace();} finally {//7 释放资源try {sta.close();} catch (SQLException e) {e.printStackTrace();}try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}

先设置MySQL不自动提交事务,在try中末尾处加上提交事务的操作。如果出现异常,说明此异常操作的事务不应该提交,要回滚事务。将回滚事务的操作放在catch中,随着和对异常的处理操作一起进行回滚操作

Statement

Statement作用:

执行SQL语句。

执行SQL语句

int executeUpdate(sql):执行DML、DDL语句

返回值:①DML语句影响的行数 ②DDL语句执行后,执行成功也可能返回0

ResultSet executeQuery(sql):执行DQL语句

返回值:ResultSet结果集对象

ResultSet

Result(结果集对象)作用:

封装了DQL查询语句的结果

ResultSet executeQuery(sql):执行DQL语句

返回值:ResultSet结果集对象

获取查询结果

boolean next():①将指针从当前位置移动到下一行 ②判断当前行是否为有效行

返回值:true,有效行,当前行有数据;false,无效行,当前行没有数据。

xxx getXxx(参数):获取数据

xxx:数据类型。如int getInt()、String getString(参数)

参数:int,列的编号,从1开始。String:列的名称。

使用

使用时通常会用上while循环

while(…….next()){

……

…….getXxx(参数);

}

例:查询员工表emp1中的数据并打印。

@Test
void test3() {Connection conn = null;Statement sta = null;ResultSet rs = null;try {//获取连接(注册驱动已省略)String url = "jdbc:mysql:///limingmao";String username = "liergou";String password = "liergou070509";conn = DriverManager.getConnection(url,username,password);//定义SQL语句String sql_1 = "select * from emp1";//获取statement对象sta = conn.createStatement();//执行sqlrs = sta.executeQuery(sql_1);//处理结果,遍历查询的所有结果while(rs.next()){int id = rs.getInt("id");String name = rs.getString(2);Date date = rs.getDate(3);double salary = rs.getDouble("salary");System.out.print(id + "\t");System.out.print(name + "\t");System.out.print(date + "\t");System.out.print(salary + "\t");System.out.println();}} catch (SQLException e) {e.printStackTrace();} finally {//释放资源try {rs.close();sta.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}
}

还可以使用其查询数据做Java代码的处理,例:将员工的sal添加到一个Arraylist中。

@Test
void test4() {Connection conn = null;Statement sta = null;ResultSet rs = null;try {//获取连接(注册驱动已省略)String url = "jdbc:mysql:///limingmao";String username = "liergou";String password = "liergou070509";conn = DriverManager.getConnection(url,username,password);//定义SQL语句String sql_1 = "select salary from emp1";//获取statement对象sta = conn.createStatement();//执行sqlrs = sta.executeQuery(sql_1);//处理结果,遍历查询的所有结果ArrayList<Double> sal = new ArrayList<>();while(rs.next()){double salary = rs.getDouble("salary");sal.add(salary);}Iterator ii = sal.iterator();while (ii.hasNext()){System.out.println(ii.next());}} catch (SQLException e) {e.printStackTrace();} finally {//释放资源try {rs.close();sta.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}
}

例:将员工的信息添加到一个Arraylist中。

@Test
void test5() {Connection conn = null;Statement sta = null;ResultSet rs = null;try {//获取连接(注册驱动已省略)String url = "jdbc:mysql:///limingmao";String username = "liergou";String password = "liergou070509";conn = DriverManager.getConnection(url,username,password);//定义SQL语句String sql_1 = "select * from emp1";//获取statement对象sta = conn.createStatement();//执行sqlrs = sta.executeQuery(sql_1);//处理结果,遍历查询的所有结果ArrayList<Employee> employees = new ArrayList<>();while(rs.next()){int id = rs.getInt(1);String name = rs.getString("name");Date date = rs.getDate(3);double salary = rs.getDouble("salary");employees.add(new Employee(id,name,date,salary));}Iterator ii = employees.iterator();while (ii.hasNext()){System.out.println(ii.next());}} catch (SQLException e) {e.printStackTrace();} finally {//释放资源try {rs.close();sta.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}
}

PreparedStatement

PreparedStatement作用:

预编译SQL语句并执行:预防SQL注入问题

SQL注入

即利用SQL语句的语法,在填入时,强制查询结果为true。

操作

①获取PrepareStatement对象

//SQL语句中的参数值,使用?占位符替代
String sql = "SELECCT * FROM user WHERE username = ? AND password = ?";//通过Connection对象获取,并传入相应的SQL语句。
PreparedStatement psta = conn.prepareStatement(sql);

②设置参数值

PreparedStatement对象:setXxx(参数1,参数2):给?赋值

Xxx指的是数据类型,参数1是?的顺序编号,从一开始。参数2是?的具体的值

③执行SQL

使用:executeUpdate()/executeQuery():不需要再传入SQL语句。

例:

@Test
void test7()
{Connection conn = null;PreparedStatement psta = null;ResultSet rs = null;try {//获取连接String url = "jdbc:mysql:///limingmao";String username = "liergou";String password = "liergou070509";conn = DriverManager.getConnection(url,username,password);//接收用户输入的用户名和密码String uname = "张三";String pwd = "1234";//定义SQLString sql = "SELECT * FROM tb_user WHERE username = ? AND password = ?";//获取psta对象psta = conn.prepareStatement(sql);//设置?的值psta.setString(1,uname);psta.setString(2,pwd);//执行SQL语句rs = psta.executeQuery();//判断是否成功if(rs.next()) {System.out.println("登录成功");}else {System.out.println("登录失败");}} catch (SQLException e) {e.printStackTrace();} finally {try {//释放资源rs.close();psta.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}
}

PreparedStatement原理

  1. 在获取PreparedStatement对象时,将SQL语句发送给MySQL服务器进行检查、编译
  2. 执行时就不用再进行这些步骤了,速度更快
  3. 如果SQL模板一样,则只需要进行一次检查、编译

PreparedStatement好处:

  1. 预编译SQL,性能更高
  2. 防止SQL注入:将敏感字符进行转义

开启预编译功能:

userServerPrepStmts=true:将此参数键值对放到url的参数键值对处。

数据库连接池

简介

数据库连接池是个容器,负责分配、管理数据库连接(Connection)

它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个

释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏

好处:

  • 资源重用
  • 提升系统响应速度
  • 避免数据库连接遗漏

数据库连接池实现

标准接口:DataSource

官方提供的数据库连接池标准接口,由第三方组织实现此接口。

功能:获取连接

Connection getConnection()

常见的数据库连接池:

  • DBCP
  • C3P0
  • Druid

Druid(德鲁伊)

Druid连接池是阿里巴巴开源的数据库连接池项目

功能强大,性能优秀,是Java语言最好的数据库连接池之一

使用步骤以及代码实现如下:

public class test_druid {public static void main(String[] args){try {//加载配置文件Properties prop = new Properties();prop.load(new FileInputStream("D:\\李明茂\\Java学习\\JDBC\\src\\druid.properties"));//获取连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);//获取数据库连接ConnectionConnection conn = dataSource.getConnection();System.out.println(conn);} catch (Exception e) {e.printStackTrace();}}
}

JDBC练习:实现品牌列表的增删查改

要求:使用数据库连接池(德鲁伊),使用预编译防SQL注入的PreparedStatement

题目准备:

数据库准备:

CREATE TABLE tb_brand(
id INT PRIMARY KEY AUTO_INCREMENT,
brand_name VARCHAR(20),-- 品牌名称
company_name VARCHAR(20),-- 企业名称
ordered INT,-- 排序字段
description VARCHAR(100),-- 描述信息
`status` INT-- 状态 0表示禁用,1表示启用
);INSERT INTO tb_brand(brand_name,company_name,ordered,description,`status`)
VALUES('金坷拉','金坷垃股份有限公司',5,'要种庄稼,必须要有金坷垃',0),
('米哈游','米哈游技术有限公司',100,'技术宅拯救世界',1),
('腾讯','腾讯技术有限公司',50,'下元梦之心',1);SELECT * FROM tb_brand;DESC tb_brand;

Java中Brand类的准备:

public class Brand {
private Integer id;
private String brandName;
private String companyName;
private Integer ordered;
private String description;
private Integer status;public Brand() {}public Brand(Integer id, String brandName, String companyName, Integer ordered, String description, Integer status) {this.id = id;this.brandName = brandName;this.companyName = companyName;this.ordered = ordered;this.description = description;this.status = status;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getBrandName() {return brandName;}public void setBrandName(String brandName) {this.brandName = brandName;}public String getCompanyName() {return companyName;}public void setCompanyName(String companyName) {this.companyName = companyName;}public Integer getOrdered() {return ordered;}public void setOrdered(Integer ordered) {this.ordered = ordered;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}@Overridepublic String toString() {return "Brand{" +"id=" + id +", brandName='" + brandName + '\'' +", companyName='" + companyName + '\'' +", ordered=" + ordered +", description='" + description + '\'' +", status=" + status +'}';}
}

开始练习:

查所有数据:(单元测试方法中实现,下同)

/*** 查询所有* SQL语句:SELECT * FROM tb_brand;* 参数:不需要* 结果:List<Brand>*/@Testpublic void testSelectAll(){Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {//加载配置文件Properties prop = new Properties();prop.load(new FileInputStream("D:\\李明茂\\Java学习\\JDBC\\src\\druid.properties"));//获取连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);//获取数据库连接Connectionconn = dataSource.getConnection();//定义SQL语句String sql = "SELECT * FROM tb_brand";//获取PreparedStatement对象pstmt = conn.prepareStatement(sql);//执行SQL语句rs = pstmt.executeQuery();//处理结果List<Brand> brands = new ArrayList<>();while(rs.next()){brands.add(new Brand(rs.getInt("id"),rs.getString(2),rs.getString(3),rs.getInt(4),rs.getString("description"),rs.getInt(6)));}Iterator ii = brands.iterator();while (ii.hasNext()){System.out.println(ii.next());}} catch (Exception e) {e.printStackTrace();} finally {try {rs.close();pstmt.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}}

增:

/*** 添加* SQL语句:* INSERT INTO tb_brand(brand_name,company_name,ordered,description,`status`) VALUES(?,?,?,?,?);* 参数:需要,除了id之外的所有参数,共五个。*/@Testpublic void testAdd(){Connection conn = null;PreparedStatement pstmt = null;//假设接受到的添加的信息如下:String brandName = "网易";String companyName = "网易技术有限公司";Integer ordered = 1;String description = "下蛋仔派对";Integer status = 1;try {//加载配置文件Properties prop = new Properties();prop.load(new FileInputStream("D:\\李明茂\\Java学习\\JDBC\\src\\druid.properties"));//获取连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);//获取数据库连接Connectionconn = dataSource.getConnection();//定义SQL语句String sql = "INSERT INTO tb_brand(brand_name,company_name,ordered,description,`status`) VALUES(?,?,?,?,?);";//获取PreparedStatement对象pstmt = conn.prepareStatement(sql);//设置参数pstmt.setString(1,brandName);pstmt.setString(2,companyName);pstmt.setInt(3,ordered);pstmt.setString(4,description);pstmt.setInt(5,status);//执行SQL语句int count = pstmt.executeUpdate();//处理结果System.out.println(count > 0);} catch (Exception e) {e.printStackTrace();} finally {try {pstmt.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}}

改:

/*** 修改* SQL语句:UPDATE tb_brand SET brand_name = ?,company_name = ?,ordered = ?,description = ?,status = ? WHERE id = ?;*/@Testpublic void testUpdate(){Connection conn = null;PreparedStatement pstmt = null;//假设接受到的添加的信息如下:String brandName = "网易";String companyName = "网易技术有限公司";Integer ordered = 1;String description = "66666";Integer status = 1;Integer id = 4;try {//加载配置文件Properties prop = new Properties();prop.load(new FileInputStream("D:\\李明茂\\Java学习\\JDBC\\src\\druid.properties"));//获取连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);//获取数据库连接Connectionconn = dataSource.getConnection();//定义SQL语句String sql = "UPDATE tb_brand SET brand_name = ?,company_name = ?,ordered = ?,description = ?,status = ? WHERE id = ?;";//获取PreparedStatement对象pstmt = conn.prepareStatement(sql);//设置参数pstmt.setString(1,brandName);pstmt.setString(2,companyName);pstmt.setInt(3,ordered);pstmt.setString(4,description);pstmt.setInt(5,status);pstmt.setInt(6,id);//执行SQL语句int count = pstmt.executeUpdate();//处理结果System.out.println(count > 0);} catch (Exception e) {e.printStackTrace();} finally {try {pstmt.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}}

删:

/*** 删除* SQL语句:DELETE FROM tb_brand WHERE id = ?;*/@Testpublic void testDelete(){Connection conn = null;PreparedStatement pstmt = null;//假设接受到的添加的信息如下:Integer id = 4;try {//加载配置文件Properties prop = new Properties();prop.load(new FileInputStream("D:\\李明茂\\Java学习\\JDBC\\src\\druid.properties"));//获取连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);//获取数据库连接Connectionconn = dataSource.getConnection();//定义SQL语句String sql = "DELETE FROM tb_brand WHERE id = ?;";//获取PreparedStatement对象pstmt = conn.prepareStatement(sql);//设置参数pstmt.setInt(1,id);//执行SQL语句int count = pstmt.executeUpdate();//处理结果System.out.println(count > 0);} catch (Exception e) {e.printStackTrace();} finally {try {pstmt.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/238936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# WPF上位机开发(业务主流程才是核心)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说了很多的c# wpf编程技术&#xff0c;里面有控件&#xff0c;有绘图&#xff0c;有数据库&#xff0c;有多线程等技术。但是他们都属于实…

数据结构之进阶二叉树(二叉搜索树和AVL树、红黑树的实现)超详细解析,附实操图和搜索二叉树的实现过程图

绪论​ “生命有如铁砧&#xff0c;愈被敲打&#xff0c;愈能发出火花。——伽利略”&#xff1b;本章主要是数据结构 二叉树的进阶知识&#xff0c;若之前没学过二叉树建议看看这篇文章一篇掌握二叉树&#xff0c;本章的知识从浅到深的对搜索二叉树的使用进行了介绍和对其底层…

数据结构 | 查漏补缺

目录 数据的基本单位 冒泡排序 DFS和BFS中文 Prim 比较 中序线索二叉树 顺序栈 链栈 时间复杂度 循环队列 求第K个结点的值 数据的基本单位 数据元素 循环队列sq中&#xff0c;用数组elem[0‥25]存放数据元素&#xff0c;设当前sq->front为20&#xff0c;sq-&g…

MySQL——内置函数

目录 一.日期函数 1.current_date() 2.current_time() 3.current_stamp() 4.date_add() 5.date_sub() 6.datediff 7.date 8.now 二.字符串函数 1.charset() 2.concat() 3.length() 4.replace 5.substring(str,postion,length) 6.instr&#xff08;string,substr…

零代码助力服装行业数字化转型

内容来自演讲&#xff1a;涂岳俊 | 广州市衣湛国际信息科技有限公司 | CEO 摘要 这篇文章讨论了为什么选择明道云零代码平台&#xff0c;以及它如何帮助服装企业解决各种问题。作者分享了自己的经验&#xff0c;并列举了一些成功的案例来证明零代码平台的优势。文章还提到了在…

[Unity错误解决]There are 2 audio listeners in the scene.

There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene. 从组件中找出包含 Audio Listener 的&#xff0c;只激活一个&#xff0c;其他的关掉

【Amazon 实验①】使用Amazon WAF做基础 Web Service 防护

文章目录 一、实验介绍二、实验环境准备三、验证实验环境四、Web ACLs 配置 & AWS 托管规则4.1 Web ACLs 介绍4.2 Managed Rules 托管规则4.3 防护常见威胁类型&#xff08;sql注入&#xff0c;XSS&#xff09;4.4 实验步骤4.4.1 创建Web ACL4.4.2 测试用例4.4.3 测试结果4…

融资项目——vue之路由实现

通俗来说&#xff0c;路由就是锚点<a>的升级版。下面举一个例子来了解&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><div id"list"><h1…

【C++】可变参数模板使用总结(简洁易懂,详细,含代码演示)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》…

【Unity基础】9.地形系统Terrain

【Unity基础】9.地形系统Terrain 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;地形编辑器Terrain &#xff08;1&#xff09;创建地形 游戏场景中大多数的山川河流地表地貌都是基…

前端项目为什么需要 TypeScript 来强化?

什么是TypeScript? TypeScript 是一个为开发大规模应用程序而设计的语言。它是 JavaScript 的一个超集&#xff0c;包含 JavaScript 全部的功能&#xff0c;并扩展了一些新的特性。具体来说&#xff0c;TypeScript 增加了如类型注解和编译时类型检查等特性&#xff1a; let n…

淘宝通过关键字搜索商品列表API接口对接详细步骤(支持免费测试)

通过关键字搜索商品&#xff0c;批量获取到相关商品&#xff0c;这是几乎所有电商平台购物商城都有的功能。我将此功能封装为API&#xff0c;可供外部软件直接调用&#xff0c;实现通过关键字搜索淘宝商品的功能。 接口名称&#xff1a;item_search-按关键字搜索淘宝商品 请求…

微信小程序promise封装

一. 在utils文件夹内创建一个request.js 写以下封装的 wx.request() 方法 const baseURL https:// 域名 ; //公用总路径地址 export const request (params) > { //暴露出去一个函数&#xff0c;并且接收一个外部传入的参数let dataObj params.data || {}; //…

pytorch中nn.Sequential详解

1 nn.Sequential概述 1.1 nn.Sequential介绍 nn.Sequential是一个序列容器&#xff0c;用于搭建神经网络的模块被按照被传入构造器的顺序添加到容器中。除此之外&#xff0c;一个包含神经网络模块的OrderedDict也可以被传入nn.Sequential()容器中。利用nn.Sequential()搭建好…

csrf自动化检测调研

https://github.com/pillarjs/understanding-csrf/blob/master/README_zh.md CSRF 攻击者在钓鱼站点&#xff0c;可以通过创建一个AJAX按钮或者表单来针对你的网站创建一个请求&#xff1a; <form action"https://my.site.com/me/something-destructive" metho…

一些问题/技巧的集合(仅个人使用)

目录 第一章、1.1&#xff09;前端找不到图片1.2&#xff09;1.3&#xff09;1.4&#xff09; 第二章、2.1&#xff09;2.2&#xff09;2.3&#xff09; 第三章、3.1&#xff09;3.2&#xff09;3.3&#xff09; 第四章、4.1&#xff09;4.2&#xff09;4.3&#xff09; 友情提…

系列一、GitHub搜索技巧

一、GitHub搜索技巧 1.1、概述 作为程序员&#xff0c;GitHub大家应该都再熟悉不过了&#xff0c;很多时候当我们需要使用某一项技能而又无从下手时&#xff0c;通常会在百度&#xff08;面向百度编程&#xff09;或者在GitHub上通过关键字寻找相关案例&#xff0c;比如我想学…

IU5070E线性单节锂电池充电管理IC

IU5070E是一款具有太阳能板最大功率点跟踪MPPT功能&#xff0c;单节锂离子电池线性充电器&#xff0c;最高支持1.5A的充电电流&#xff0c;支持非稳压适配器。同时输入电流限制精度和启动序列使得这款芯片能够符合USB-IF涌入电流规范。 IU5070E具有动态电源路径管理(DPPM)功能&…

第11章 GUI Page403~405 步骤三 设置滚动范围

运行效果&#xff1a; 源代码&#xff1a; /**************************************************************** Name: wxMyPainterApp.h* Purpose: Defines Application Class* Author: yanzhenxi (3065598272qq.com)* Created: 2023-12-21* Copyright: yanzhen…