第一章 JDBC概述

之前我们学习了JavaSE,编写了Java程序,数据保存在变量、数组、集合等中,无法持久化,后来学习了IO流可以将数据写入文件,但不方便管理数据以及维护数据的关系;

后来我们学习了数据库管理软件MySQL,可以方便的管理数据。

那么如何将它俩结合起来呢?即Java程序<==>MySQL,实现数据的存储和处理。

那么就可以使用JDBC技术。

1.1 JDBC概述

JDBC:Java Database Connectivity,它是代表一组独立于任何数据库管理系统(DBMS)的API,声明在java.sql与javax.sql包中,是SUN(现在Oracle)提供的一组接口规范。由各个数据库厂商来提供实现类,这些实现类的集合构成了数据库驱动jar。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7rQyGyCP-1636007430359)(imgs/1561212287381.png)]

即JDBC技术包含两个部分:

(1)java.sql包和javax.sql包中的API

因为为了项目代码的可移植性,可维护性,SUN公司从最初就制定了Java程序连接各种数据库的统一接口规范。这样的话,不管是连接哪一种DBMS软件,Java代码可以保持一致性。

(2)各个数据库厂商提供的jar

因为各个数据库厂商的DBMS软件各有不同,那么内部如何通过sql实现增、删、改、查等管理数据,只有这个数据库厂商自己更清楚,因此把接口规范的实现交给各个数据库厂商自己实现。

1.2 JDBC使用步骤

代码编写步骤:

1、注册驱动

三部曲:

(1)将DBMS数据库管理软件的驱动jar拷贝到项目的libs目录中

例如:mysql-connector-java-5.1.36-bin.jar

(2)把驱动jar添加到项目的build path中

(3)将驱动类加载到内存中

Class.forName(“com.mysql.jdbc.Driver”);

2、获取Connection连接对象

Connection conn = DriverManager.getConnection(url,username,password);

mysql的url:jdbc:mysql://localhost:3306/数据库名?参数名=参数值

jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf8(如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集

3、执行sql并处理结果

(1)编写sql

(2)创建Statement或PreparedStatement对象

(3)执行sql

增删改:调用executeUpdate方法

查询:调用executeQuery方法

(4)处理结果

增删改:返回的是整数值

查询:返回ResultSet结果,需要使用next()和getXxx()结合进行遍历

4、释放连接等

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6fv3OVg0-1636007430362)(imgs/1561213163143.png)]

相关的API:

1、DriverManager:驱动管理类

2、Connection:代表数据库连接

3、Statement和PreparedStatement:用来执行sql

​ 执行增、删、改:int executeUpate()

​ 执行查询:ResultSet executeQuery()

4、如何遍历ResultSet ?

​ (1)boolean next():判断是否还有下一行

​ (2)getString(字段名或序号),getInt(字段名或序号),getObject(字段名或序号)

示例代码1:增、删、改

public class TestJDBC {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1、注册驱动//(1)方式一:Class.forName("驱动类的全名称")Class.forName("com.mysql.jdbc.Driver");
//		(2)创建驱动类的对象
//		new com.mysql.jdbc.Driver();//硬编码//(3)通过DriverManager注册驱动
//		DriverManager.registerDriver(new com.mysql.jdbc.Driver());//硬编码//2、获取连接,连接数据库//TCP/IP协议编程,需要服务器的IP地址和端口号//mysql的url格式:jdbc协议:子协议://主机名:端口号/要连接的数据库名String url = "jdbc:mysql://localhost:3306/test";//其中test是数据库名String user = "root";String password = "123456";Connection conn = DriverManager.getConnection(url, user, password);//3、执行sql//添加一个部门到数据库的t_department表中//(1)编写sqlString sql = "insert into t_department values(null,'计算部2','计算钞票2')";/** 回忆:	TCP/IP程序时* Socket代表连接* socket.getOutputStream()来发送数据,* socket.getInputStream()来接收数据* * 可以把Connection比喻成Socket*    把Statement比喻成OutputStream*///(2)获取Statement对象Statement st = conn.createStatement();//(3)执行sqlint len = st.executeUpdate(sql);//(4)处理结果System.out.println(len>0?"成功":"失败");//4、关闭st.close();conn.close();}
}

示例代码2:查询

public class TestSelect {public static void main(String[] args) throws Exception{// 1、注册驱动Class.forName("com.mysql.jdbc.Driver");// 2、连接数据库Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");// 3、执行sqlString sql = "SELECT * FROM t_department";Statement st = conn.createStatement();ResultSet rs = st.executeQuery(sql);//ResultSet看成InputStreamwhile(rs.next()){//next()表示是否还有下一行Object did = rs.getObject(1);//获取第n列的值Object dname = rs.getObject(2);Object desc = rs.getObject(3);/*int did = rs.getInt("did");//也可以根据列名称,并且可以按照数据类型获取String dname = rs.getString("dname");String desc = rs.getString("description");*/System.out.println(did +"\t" + dname + "\t"+ desc);}// 4、关闭rs.close();st.close();conn.close();}
}

第二章 使用PreparedStatement处理CRUD

2.1 通过PreparedStatement来解决Statement的问题

Statement的问题:通过PreparedStatement来代替

(1)sql拼接

		String sql = "insert into t_employee(ename,tel,gender,salary) values('" + ename + "','" + tel + "','" + gender + "'," + salary +")";Statement st = conn.createStatement();int len = st.executeUpdate(sql);

(2)sql注入

		String sql = "SELECT * FROM t_employee where ename='" + ename + "'";//如果我此时从键盘输入ename值的时候,输入:张三' or '1'= '1//结果会把所有数据都查询出来Statement st = conn.createStatement();ResultSet rs = st.executeQuery(sql);

PreparedStatement解决问题:

(1)避免sql拼接

		String sql = "insert into t_employee(ename,tel,gender,salary) values(?,?,?,?)";PreparedStatement pst = conn.prepareStatement(sql);//这里要传带?的sql,然后mysql端就会对这个sql进行预编译//设置?的具体值/*pst.setString(1, ename);pst.setString(2, tel);pst.setString(3, gender);pst.setDouble(4, salary);*/pst.setObject(1, ename);pst.setObject(2, tel);pst.setObject(3, gender);pst.setObject(4, salary);int len = pst.executeUpdate();//此处不能传sqlSystem.out.println(len);

(2)不会有sql注入

		String sql = "SELECT * FROM t_employee where ename=?";//即使输入'张三' or '1'= '1'也没问题PreparedStatement pst = conn.prepareStatement(sql);//中间加入设置?的值pst.setObject(1, ename);ResultSet rs = pst.executeQuery();

2.2 批处理

/** 批处理:* 	批量处理sql* * 例如:* (1)订单明细表的多条记录的添加* (2)批量添加模拟数据* ...* * 不用批处理,和用批处理有什么不同?* 批处理的效率很多* * 如何进行批处理操作?* (1)在url中要加一个参数*     rewriteBatchedStatements=true*     那么我们的url就变成了  jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true*     这里的?,表示?后面是客户端给服务器端传的参数,多个参数直接使用&分割* (2)调用方法不同* pst.addBatch();* int[] all = pst.executeBatch();* * 注意:如果批量添加时,insert使用values,不要使用value*/
public class TestBatch {public static void main(String[] args) throws Exception{long start = System.currentTimeMillis();//例如:在部门表t_department中添加1000条模拟数据//1、注册驱动Class.forName("com.mysql.jdbc.Driver");//2、获取连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true", "root", "123456");//3、执行sqlString sql = "insert into t_department values(null,?,?)";PreparedStatement pst = conn.prepareStatement(sql);//设置?的值for (int i = 1; i <=1000; i++) {pst.setObject(1, "模拟部门"+i);pst.setObject(2, "模拟部门的简介"+i);pst.addBatch();//添加到批处理一组操作中,攒一块处理
/*			if(i % 500 == 0){//有时候也攒一部分,执行一部分//2.执行pst.executeBatch();//3.清空pst.clearBatch();}*/}pst.executeBatch();//4、关闭pst.close();conn.close();long end = System.currentTimeMillis();System.out.println("耗时:" + (end - start));//耗时:821}
}

2.3 事务

/** mysql默认每一个连接是自动提交事务的。* 那么当我们在JDBC这段,如果有多条语句想要组成一个事务一起执行的话,那么在JDBC这边怎么设置手动提交事务呢?* (1)在执行之前,设置手动提交事务* Connection的对象.setAutoCommit(false)* (2)成功:* Connection的对象.commit();* 失败:* Connection的对象.rollback();* * 补充说明:* 为了大家养成要的习惯,在关闭Connection的对象之前,把连接对象设置回自动提交* (3)Connection的对象.setAutoCommit(true)* * 因为我们现在的连接是建立新的连接,那么如果没有还原为自动提交,没有影响。* 但是我们后面实际开发中,每次获取的连接,不一定是新的连接,而是从连接池中获取的旧的连接,而且你关闭也不是真关闭,* 而是还给连接池,供别人接着用。以防别人拿到后,以为是自动提交的,而没有commit,最终数据没有成功。*/
public class TestTransaction {public static void main(String[] args) throws Exception{/** 一般涉及到事务处理的话,那么业务逻辑都会比较复杂。* 例如:购物车结算时:* (1)在订单表中添加一条记录* (2)在订单明细表中添加多条订单明细的记录(表示该订单买了什么东西)* (3)修改商品表的销量和库存量* ...* 那么我们今天为了大家关注事务的操作,而不会因为复杂的业务逻辑的影响导致我们的理解,那么我们这里故意* 用两条修改语句来模拟组成一个简单的事务。* update t_department set description = 'xx' where did = 2;* update t_department set description = 'yy' where did = 3;* * 我希望这两天语句要么一起成功,要么一起回滚* 为了制造失败,我故意把第二条语句写错* update t_department set description = 'yy' (少了where) did = 3;*///1、注册驱动Class.forName("com.mysql.jdbc.Driver");//2、获取连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");//设置手动提交事务conn.setAutoCommit(false);//3、执行sqlString sql1 = "update t_department set description = 'xx' where did = 2";String sql2 = "update t_department set description = 'yy' did = 3";//这是错的//使用prepareStatement的sql也可以不带?PreparedStatement pst = null;try {pst = conn.prepareStatement(sql1);int len = pst.executeUpdate();System.out.println("第一条:" + (len>0?"成功":"失败"));pst = conn.prepareStatement(sql2);len = pst.executeUpdate();System.out.println("第二条:" + (len>0?"成功":"失败"));//都成功了,就提交事务System.out.println("提交");conn.commit();} catch (Exception e) {System.out.println("回滚");//失败要回滚conn.rollback();}//4、关闭pst.close();conn.setAutoCommit(true);//还原为自动提交conn.close();}
}

第三章 数据库连接池

1、什么是数据库连接池
连接对象的缓冲区。负责申请,分配管理,释放连接的操作。

2、为什么要使用数据库连接池

不使用数据库连接池,每次都通过DriverManager获取新连接,用完直接抛弃断开,连接的利用率太低,太浪费。
对于数据库服务器来说,压力太大了。我们数据库服务器和Java程序对连接数也无法控制,很容易导致数据库服务器崩溃。

我们就希望能管理连接。
我们可以建立一个连接池,这个池中可以容纳一定数量的连接对象,一开始,我们可以先替用户先创建好一些连接对象,
等用户要拿连接对象时,就直接从池中拿,不用新建了,这样也可以节省时间。然后用户用完后,放回去,别人可以接着用。
可以提高连接的使用率。当池中的现有的连接都用完了,那么连接池可以向服务器申请新的连接放到池中。
直到池中的连接达到“最大连接数”,就不能在申请新的连接了,如果没有拿到连接的用户只能等待。

3、市面上有很多现成的数据库连接池技术:

  • JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口(通常被称为数据源),该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现:
    • DBCP 是Apache提供的数据库连接池,速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持
    • C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以
    • Proxool 是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点
    • BoneCP 是一个开源组织提供的数据库连接池,速度快
    • Druid 是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool 优点于一身的数据库连接池

4、阿里的德鲁伊连接池技术

(1)加入jar包

例如:druid-1.1.10.jar

(2)代码步骤

第一步:建立一个数据库连接池

第二步:设置连接池的参数

第三步:获取连接

public class TestPool {public static void main(String[] args) throws SQLException {//1、创建数据源(数据库连接池)对象DruidDataSource ds =new DruidDataSource();//2、设置参数//(1)设置基本参数ds.setDriverClassName("com.mysql.jdbc.Driver");ds.setUrl("jdbc:mysql://localhost:3306/test");ds.setUsername("root");ds.setPassword("123456");//(2)设置连接数等参数ds.setInitialSize(5);//一开始提前申请好5个连接,不够了,重写申请ds.setMaxActive(10);//最多不超过10个,如果10都用完了,还没还回来,就会出现等待ds.setMaxWait(1000);//用户最多等1000毫秒,如果1000毫秒还没有人还回来,就异常了//3、获取连接for (int i = 1; i <=15; i++) {Connection conn = ds.getConnection();System.out.println("第"+i+"个:" + conn);//如果这里没有关闭,就相当于没有还
//			conn.close();#这里关闭,是还回池中}}
}
配置缺省说明
name配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。 如果没有配置,将会生成一个名字,格式是:”DataSource-” + System.identityHashCode(this)
jdbcUrl连接数据库的url,不同数据库不一样。例如:mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username连接数据库的用户名
password连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里:https://github.com/alibaba/druid/wiki/使用ConfigFilter
driverClassName根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName(建议配置下)
initialSize0初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
maxActive8最大连接池数量
maxIdle8已经不再使用,配置了也没效果
minIdle最小连接池数量
maxWait获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
poolPreparedStatementsfalse是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
maxOpenPreparedStatements-1要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
validationQuery用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。
testOnBorrowtrue申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturnfalse归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testWhileIdlefalse建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
timeBetweenEvictionRunsMillis有两个含义: 1)Destroy线程会检测连接的间隔时间2)testWhileIdle的判断依据,详细看testWhileIdle属性的说明
numTestsPerEvictionRun不再使用,一个DruidDataSource只支持一个EvictionRun
minEvictableIdleTimeMillis
connectionInitSqls物理连接初始化的时候执行的sql
exceptionSorter根据dbType自动识别 当数据库抛出一些不可恢复的异常时,抛弃连接
filters属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
proxyFilters类型是List,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

第四章 封装JDBCTools

配置文件:src/jdbc.properties

#key=value
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=123456
initialSize=5
maxActive=10
maxWait=1000

JDBCTools工具类:

package com.atguigu.util;import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;import javax.sql.DataSource;import com.alibaba.druid.pool.DruidDataSourceFactory;/** 获取连接或释放连接的工具类*/
public class JDBCTools {// 1、数据源,即连接池private static DataSource dataSource;static {try {//1、读取druip.properties文件Properties pro = new Properties();pro.load(JDBCTools.class.getClassLoader().getResourceAsStream("druid.properties"));//2、连接连接池dataSource = DruidDataSourceFactory.createDataSource(pro);} catch (Exception e) {e.printStackTrace();}}/*** 获取连接的方法* * @return* @throws SQLException*/public static Connection getConnection() {if (connection == null) {// 从连接池中获取一个连接try {connection = dataSource.getConnection();} catch (SQLException e) {e.printStackTrace();}}return connection;}/*** 释放连接的方法* * @param connection*/public static void releaseConnection(Connection connection) {if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

第五章 Apache的DBUtils

commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。

其中QueryRunner类封装了SQL的执行,是线程安全的。

(1)可以实现增、删、改、查、批处理、

(2)考虑了事务处理需要共用Connection。

(3)该类最主要的就是简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。

(1)更新

public int update(Connection conn, String sql, Object… params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。

(2)插入

public T insert(Connection conn,String sql,ResultSetHandler rsh, Object… params) throws SQLException:只支持INSERT语句,其中 rsh - The handler used to create the result object from the ResultSet of auto-generated keys. 返回值: An object generated by the handler.即自动生成的键值

(3)批处理

public int[] batch(Connection conn,String sql,Object[][] params)throws SQLException: INSERT, UPDATE, or DELETE语句

public T insertBatch(Connection conn,String sql,ResultSetHandler rsh,Object[][] params)throws SQLException:只支持INSERT语句

(4)使用QueryRunner类实现查询

public Object query(Connection conn, String sql, ResultSetHandler rsh,Object… params) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。

ResultSetHandler接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet rs)该方法的返回值将作为QueryRunner类的query()方法的返回值。

该接口有如下实现类可以使用:

  • BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
  • BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
  • ScalarHandler:查询单个值对象
  • MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
  • MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
  • ColumnListHandler:将结果集中某一列的数据存放到List中。
  • KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
  • ArrayHandler:把结果集中的第一行数据转成对象数组。
  • ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。

示例代码:BasicDAOImpl.java

package com.atguigu.test09.dbutil;import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;import com.atguigu.test06.threadlocal.JDBCTools2;public class BasicDAO2 {private QueryRunner qr = new QueryRunner();protected int update(String sql,Object... args) throws SQLException{Connection conn = JDBCTools2.getConnection();int len = qr.update(conn, sql, args);//QueryRunner可以帮你关闭连接return len;}protected <T> List<T> getList(Class<T> clazz,String sql,Object... args) throws Exception{Connection conn = JDBCTools2.getConnection();/** ResultSetHandler接口,用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。* (1)BeanListHandler等形式*/List<T> list = qr.query(conn, sql, new BeanListHandler<>(clazz), args);return list;}protected <T> T getBean(Class<T> clazz,String sql,Object... args) throws Exception{Connection conn = JDBCTools2.getConnection();/** ResultSetHandler接口,用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。* (2)BeanHandler等形式*/T t = qr.query(conn, sql, new BeanHandler<>(clazz), args);return t;}/** 通用的查询单个值的方法* 例如:员工总数,最高工资,平均工资等*/protected Object getObject(String sql,Object... args) throws Exception{Connection conn = JDBCTools2.getConnection();/** ResultSetHandler接口,用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。* (3)ScalarHandler:查询单个值对象等形式*/Object obj = qr.query(conn, sql, new ScalarHandler<>(), args);return obj;}/** 通用的查询多行多列的方法* 例如:每个部门的平均工资*/protected List<Map<String, Object>> getMapList(String sql,Object... args) throws Exception{Connection conn = JDBCTools2.getConnection();/** ResultSetHandler接口,用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。* (4)MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List*/List<Map<String, Object>> list = qr.query(conn, sql, new MapListHandler(), args);return list;}}

示例代码:

public interface EmployeeDAO2 {void addEmployee(Employee emp);void updateEmployee(Employee emp);void deleteByEid(int eid);Employee getByEid(int eid);List<Employee> getAll();long empCount();//查询员工总数double avgSalary();//查询全公司的平均工资//key是部门编号,Double是平均工资Map<Integer,Double> avgSalaryPerDepartment();
}

示例代码:

package com.atguigu.test09.dbutil;import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import com.atguigu.bean.Employee;public class EmployeeDAOImpl2 extends BasicDAO2 implements EmployeeDAO2 {@Overridepublic void addEmployee(Employee emp) {//`ename`,`tel`,`gender`,`salary`,`commission_pct`,`birthday`,//`hiredate`,`job_id`,`email`,`mid`,`address`,`native_place`,`did`String sql = "insert into t_employee values(null,?,?,?,?,?,?,?,?,?,?,?,?,?)";try {update(sql, emp.getEname(),emp.getTel(),emp.getGender(),emp.getSalary(),emp.getCommissionPct(),emp.getBirthday(),emp.getHiredate(),emp.getJobId(),emp.getEmail(),emp.getMid(),emp.getAddress(),emp.getNativePlace(),emp.getDid());} catch (SQLException e) {throw new RuntimeException(e);}}@Overridepublic void updateEmployee(Employee emp) {String sql = "update t_employee set `ename`=?,`tel`=?,`gender`=?,`salary`=?,`commission_pct`=?,`birthday`=?,`hiredate`=?,`job_id`=?,`email`=?,`mid`=?,`address`=?,`native_place`=?,`did`=? where eid=?";try {update(sql, emp.getEname(),emp.getTel(),emp.getGender(),emp.getSalary(),emp.getCommissionPct(),emp.getBirthday(),emp.getHiredate(),emp.getJobId(),emp.getEmail(),emp.getMid(),emp.getAddress(),emp.getNativePlace(),emp.getDid(),emp.getEid());} catch (SQLException e) {throw new RuntimeException(e);}}@Overridepublic void deleteByEid(int eid) {String sql = "delete from t_employee where eid=?";try {update(sql, eid);} catch (SQLException e) {throw new RuntimeException(e);}}@Overridepublic Employee getByEid(int eid) {//这里sql中通过取别名的方式,来指定对应的Javabean的属性名String sql = "select `eid`,`ename`,`tel`,`gender`,`salary`,`commission_pct` commissionPct ,`birthday`,`hiredate`,`job_id` jobId,`email`,`mid`,`address`,`native_place` nativePlace,`did` from t_employee where eid=?";Employee emp = null;try {emp = getBean(Employee.class, sql, eid);} catch (Exception e) {throw new RuntimeException(e);}	return emp;}@Overridepublic List<Employee> getAll() {//这里sql中通过取别名的方式,来指定对应的Javabean的属性名String sql = "select `eid`,`ename`,`tel`,`gender`,`salary`,`commission_pct` commissionPct ,`birthday`,`hiredate`,`job_id` jobId,`email`,`mid`,`address`,`native_place` nativePlace,`did` from t_employee";List<Employee>  list = new ArrayList<Employee>();try {list = getList(Employee.class, sql);} catch (Exception e) {throw new RuntimeException(e);}return list;}@Overridepublic long empCount() {String sql = "select count(1) from t_employee";Long count = 0L;try {Object obj = getObject(sql);count = (Long) obj;} catch (Exception e) {throw new RuntimeException(e);}return count;}@Overridepublic double avgSalary() {String sql = "select avg(salary) from t_employee";Double avg = 0.0;try {avg = (Double) getObject(sql);} catch (Exception e) {throw new RuntimeException(e);}return avg;}@Overridepublic Map<Integer, Double> avgSalaryPerDepartment() {String sql = "select did,avg(salary) from t_employee group by did";Map<Integer, Double> map = new HashMap<>();try {List<Map<String, Object>> mapList = getMapList(sql);/** String:字段的名称,例如:did,avg(salary)* Object:字段的值,例如1,19819.408666666666*  {did=1, avg(salary)=19819.408666666666}{did=2, avg(salary)=11708.5}{did=3, avg(salary)=70223.0}{did=4, avg(salary)=12332.0}{did=5, avg(salary)=11065.5}*/for (Map<String, Object> map2 : mapList) {map.put((Integer)map2.get("did"),(Double)map2.get("avg(salary)"));}} catch (Exception e) {throw new RuntimeException(e);}return map;}}

示例代码:

package com.atguigu.test09.dbutil;import java.util.List;
import java.util.Map;import org.junit.Test;import com.atguigu.bean.Employee;public class TestEmployeeDAOImp2 {@Testpublic void test1(){EmployeeDAOImpl2 ed2 = new EmployeeDAOImpl2();List<Employee> all = ed2.getAll();for (Employee employee : all) {System.out.println(employee);}}@Testpublic void test2(){EmployeeDAOImpl2 ed2 = new EmployeeDAOImpl2();long count = ed2.empCount();System.out.println(count);}@Testpublic void test3(){EmployeeDAOImpl2 ed2 = new EmployeeDAOImpl2();double avgSalary = ed2.avgSalary();System.out.println(avgSalary);}@Testpublic void test4(){EmployeeDAOImpl2 ed2 = new EmployeeDAOImpl2();Map<Integer, Double> map = ed2.avgSalaryPerDepartment();map.forEach((k,v) -> System.out.println(k+"->"+v));}
}

第六章 BaseDao封装

package com.atguigu.dao.impl;import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;import com.atguigu.util.JDBCUtils;/*** 定义一个用来被继承的对数据库进行基本操作的Dao* @author xin Chen* @param <T>*/
public class BaseDao<T> {private QueryRunner queryRunner = new QueryRunner();//定义一个变量来接收泛型的类型private Class<T> type;// 获取T的Class对象,获取泛型的类型,泛型是在被子类继承时才确定public BaseDao() {//获取子类的类型Class clazz = this.getClass();//获取父类的类型//getGenericSuperclass()用来获取当前类的父类的类型//ParameterizedType表示的是带泛型的类型ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericSuperclass();//获取具体的泛型类型 getActualTypeArguments获取具体的泛型的类型//这个方法会返回一个Type的数组Type[] types = parameterizedType.getActualTypeArguments();//获取具体的泛型的类型·this.type = (Class<T>) types[0];}/*** 通用的增删改操作* * @param sql* @param params* @return*/public int update(String sql, Object... params) {// 获取连接Connection connection = JDBCUtils.getConnection();int count = 0;try {count = queryRunner.update(connection, sql, params);} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.releaseConnection(connection);}return count;}/*** 获取一个对象* * @param sql* @param params* @return*/public T getBean(String sql, Object... params) {// 获取连接Connection connection = JDBCUtils.getConnection();T t = null;try {t = queryRunner.query(connection, sql, new BeanHandler<T>(type),params);} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.releaseConnection(connection);}return t;}/*** 获取所有对象* @param sql* @param params* @return*/public List<T> getBeanList(String sql, Object... params) {// 获取连接Connection connection = JDBCUtils.getConnection();List<T> list = null;try {list = queryRunner.query(connection, sql, new BeanListHandler<T>(type), params);} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.releaseConnection(connection);}return list;}
}
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 深富策略:多空角力 市场方向不明

    周三&#xff0c;三大指数集体下挫。上证指数低开震荡下行&#xff0c;一度跌破3500点&#xff0c;尾盘反抽&#xff0c;但是未能翻红。板块大面积红盘&#xff0c;煤炭开采、养殖业、农产品、医疗器械等涨幅居前。仅贵金属、国防军工、贸易、汽车等少数绿盘。 周三指数探底回升…...

    2024/4/17 6:48:12
  2. 2016-2027年全球与中国医药检测行业市场深度调研及投资预测报告

    2016-2027年全球与中国医药检测行业市场深度调研及投资预测报告 2020年中国医药检测市场规模达到了 亿元&#xff0c;预计2027年可以达到 亿元&#xff0c;未来几年年复合增长率(CAGR)为 % (2021-2027)。 本报告研究中国市场医药检测的发展现状及未来发展趋势&#xff0c;分…...

    2024/4/20 6:39:58
  3. Java基本语法

    1.Java程序格式 1.Java程序的基本格式 Java程序必须放在一个类中&#xff0c;类使用class关键字定义&#xff0c;在class前面可以有类的修饰符 如图&#xff1a; 2.编写Java 需要注意的点 (1).Java程序代码可分为结构定义语句和功能执行语句&#xff0c; 结构定义语句用于…...

    2024/4/15 3:59:20
  4. 快递购物APP开发 App定制开发

    案例背景 对商家来说&#xff0c;电商APP为他们提供了一个长期的信息发布平台&#xff0c;APP管理者可以不受时间和空间的限制&#xff0c;用手机或是电脑就能随时发布、管理营销信息&#xff0c;跟进查看营销数据。 案例详情 通过电商APP开发&#xff0c;商家自己就可以宣传…...

    2024/4/25 14:45:07
  5. 2021-2027中国Flex ATX计算机电源市场现状及未来发展趋势

    【报告篇幅】&#xff1a;97 【报告图表数】&#xff1a;133 【报告出版时间】&#xff1a;2021年11月 报告摘要 2020年中国Flex ATX计算机电源市场规模达到了 亿元&#xff0c;预计2027年将达到 亿元&#xff0c;未来几年年复合增长率(CAGR)为 % (2021-2027)。 本文研究中…...

    2024/4/27 0:33:00
  6. MapReduce跑得慢的原因以及优化方法

    MapReduce跑得慢的原因 MapReduce程序的效率瓶颈在于两个方面&#xff1a; 一、 计算机性能 CPU、内存、磁盘健康、网络 二、 I/O操作 数据倾斜map和reduce数量设置不合理reduce等待时间过久小文件过多大量不可拆分的超大文件spill次数过多merge次数过多 我们优化的重点是…...

    2024/4/27 3:57:42
  7. 【网络安全】 利用 EHole 进行红队快速批量打点

    前言 最近看到了关于很多红队方面的文章&#xff0c;如何进行信息收集&#xff0c;从单一目标或多个目标中进行快速查找漏洞。今天提供一种针对较多资产或目标的情况下进行批量识别目标框架进行针对性漏洞挖掘的方式。用得好可能其它队伍还在辛辛苦苦打点的时候&#xff0c;你…...

    2024/4/17 11:21:37
  8. 跨境电商ERP店群管理系统源码支持二开,企业数据私有化部署

    标签&#xff1a; erp软件 亚马逊 跨境电商ERP 跨境电商ERP&#xff0c;跨境电商erp系统&#xff1a;亚马逊erp&#xff0c;对接亚马逊、wish、ebay、速卖通、shopify、shopee虾皮、lazada等跨境电商平台。跨境电商ERP源码&#xff0c;跨境电商erp系统源码&#xff1a;亚马逊er…...

    2024/4/17 17:48:34
  9. 【UEFI实战】RSA算法

    RSA算法简述 RSA算法中的RSA并不是什么专业术语的缩写&#xff0c;它们是三个名字的头一个字母&#xff0c;这三个人是Rivest、Shamir 和 Adleman&#xff0c;他们提出了这个算法。 RSA算法是一个加密算法&#xff0c;用处当然是对数据进行加解密。 RSA算是是一种非对称的加…...

    2024/4/26 5:07:16
  10. 智能汽车弹窗广告,真是一门好生意?

    文丨智能相对论 作者丨科科鸡 11月3日&#xff0c;Notability向用户道歉&#xff0c;原因在于Notability将付费版本升级为了“免费版&#xff0b;订阅版”&#xff0c;先前一次性付费买断APP的老用户也需要转向订阅制&#xff0c;重新付费&#xff0c;遭遇大量用户吐槽。 智…...

    2024/4/16 7:56:30
  11. Spark官方Blog:SequoiaDB与Spark深度整合

    近日&#xff0c;Spark官方博客发布了SequoiaDB深度整合Spark的消息&#xff0c;同时SequoiaDB也获得了Spark的全球合作伙伴和Spark提供商商的认证 &#xff0c;以下就是这篇消息的原文 这是一篇来自我们的技术合作伙伴&#xff0c;SequoiaDB巨杉数据库的博客。作者是SequoiaDB…...

    2024/4/19 21:49:48
  12. Anaconda3下载与安装

    安装Anaconda3 &#xff08;1&#xff09;打开下载页面&#xff0c;https://www.anaconda.com/download/ &#xff08;2&#xff09;Products-->Individual Edition-->Anaconda Installers-->Windows\MacOS\Linux-->64/32bit &#xff08;3&#xff09;安装过程…...

    2024/4/25 20:25:36
  13. 从大数据地形图看大数据发展

    在新兴事物收到追捧的科技创新行业中&#xff0c;“大数据”目前正在走向理性与成熟。随着2006年Hadoop的成立, 在2011年到2014年间人们对“大数据”这一概念的兴趣达到了狂热的地步&#xff0c;凡是必提“大数据”。而进入2015年&#xff0c;随着大数据真正的开始广泛落地应用…...

    2024/4/27 8:51:59
  14. 【Linux】1. 基本命令

    目录写的太过详细&#xff0c;请耐心一点~1. useradd &#xff0c; passwd2. ls , pwd &#xff0c; cd2.1 ls 命令&#xff08;list&#xff09;2.1.1 命令行参数2.2 pwd 命令2.3 cd 命令&#xff08;change directory&#xff09;2.3.1 cd快捷用法3. touch , mkdir , rm , rm…...

    2024/4/15 4:00:31
  15. 国产高端医疗设备向着数字化转型发展,迎接新的机遇和挑战

    在中国经济飞速发展的今天&#xff0c;各行各业都在向着国产化发展&#xff0c;摆脱对非国产的依赖。医疗行业也是如此。近年来&#xff0c;国产医疗设备产业正在快速发展&#xff0c;行业市场规模不断扩大。目前我国已成为全球第二大医疗器械市场&#xff0c;市场增速高于全球…...

    2024/4/26 4:52:06
  16. 如何使用记录的数据构建地图/如何从记录的变换和激光扫描数据创建二维贴图slam_gmapping/Tutorials/MappingFromLoggedData

    How to Build a Map Using Logged Data 如何使用记录的数据构建地图 Description: This tutorial shows you how to create a 2-D map from logged transform and laser scan data. 描述&#xff1a;本教程向您展示如何从记录的变换和激光扫描数据创建二维贴图。Keywords: …...

    2024/4/5 6:16:45
  17. 协同级CRM能帮助企业带来哪些管理提升?

    现代通信技术、特别是互联网的出现&#xff0c;给企业和客户的交流带来了许多新的选择&#xff0c;这些选择为降低营销、销售和服务的成本带来了新的机遇。但同时&#xff0c;由于市场营销、销售和客户服务与支持是三个独立的部门&#xff0c;这种多渠道的交流也会造成一些不必…...

    2024/4/19 16:45:16
  18. 数据结构与算法指北

    最近在看数据结构与算法之美&#xff0c;结合刷题。留点经验书方便以后复习。 ### 1. 数组 **数组&#xff08;Array&#xff09;是一种线性表数据结构。它用一组连续的内存空间&#xff0c;来存储一组具有相同类型的数据。** 连续的空间和相同类型的数据的限制使得数组支持&a…...

    2024/4/20 13:04:41
  19. Angularjs中$watch监控对象变量

    关于angularjs中$watch的问题&#xff0c;事实上监控数据变化是一个比较耗费性能的问题&#xff0c;因为涉及到比较&#xff0c;如果变量多&#xff0c;自然非常慢&#xff0c;比如比较两个object&#xff0c;所以$watch的第三个参数即监控的是否是对象这个参数默认是false&…...

    2024/4/24 0:56:54
  20. 腾讯推出三款自研芯片,中国科技巨头纷纷瞄准半导体领域

    整理 | 祝涛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 11月3日&#xff0c;在位于武汉的腾讯数字生态大会上&#xff0c;腾讯高级执行副总裁、云与智慧产业事业群CEO汤道生宣布&#xff0c;腾讯已在三款自研芯片上取得进展&#xff0c;分别是AI推理芯片“紫…...

    2024/4/7 1:05:32

最新文章

  1. Apache Seata的可观测实践

    title: Seata的可观测实践 keywords: [Seata、分布式事务、数据一致性、微服务、可观测] description: 本文介绍Seata在可观测领域的探索和实践 author: 刘戎-Seata 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Seata简介 Seata的…...

    2024/4/27 22:21:05
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 学习java第三十九天

    一般使用 Autowired 注解让 Spring 容器帮我们自动装配 bean。要想把类标识成可用于 Autowired 注解自动装配的 bean 的类,可以采用以下注解实现&#xff1a; Component&#xff1a;通用的注解&#xff0c;可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层&#x…...

    2024/4/25 8:33:36
  4. ROS2高效学习第十章 -- ros2 高级组件之大型项目中的 launch 其二

    ros2 高级组件之大型项目中的 launch 1 前言和资料2 正文2.1 启动 turtlesim&#xff0c;生成一个 turtle &#xff0c;设置背景色2.2 使用 event handler 重写上节的样例2.3 turtle_tf_mimic_rviz_launch 样例 3 总结 1 前言和资料 早在ROS2高效学习第四章 – ros2 topic 编程…...

    2024/4/26 22:12:26
  5. 基于springboot实现影城管理系统项目【项目源码+论文说明】

    基于springboot实现影城管理系统演示 摘要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多生活之中&#xff0c;随之就产生了“小徐影城管理系统”&#xff0c;这样就让小徐影城管理系统更加方便简单。 对于本小…...

    2024/4/27 12:36:09
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/26 20:12:18
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/26 21:56:58
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/26 22:01:59
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57