MySQL JDBC

JDBC连接MySQL基本步骤 JDBC连接MySQL(1) JDBC连接MySQL一般步骤: 1、加载JDBC驱动 (1.1)、下载JDBC驱动、(链接: https://pan.baidu.com/s/1adjzuLHDjXhFA2_W8IiLGg 提取码: e6zv ). (2)、将驱动jar加到项目中。 (3)、加... 阅读详情

1.JDBC 介绍

java数据库连接

2.JDBC 使用步骤

第0步: 导包

第1步:注册驱动 (仅仅做一次)

  第2步:建立连接(Connection)

  第3步:创建运行SQL的语句(Statement)

  第4步:运行语句

  第5步:处理运行结果(ResultSet)

第6步:释放资源

其中 如果是添加,删除,更新操作,可以没有第5步,查询肯定会有第五步

5.0 导包

创建java项目

创建lib文件夹

把mysql-connector-java-5.1.38-bin.jar复制到lib中

右键  ->  Build Path  -> Add to Build Path

5.1 注册驱动 

创建java类 JDBC_01_Base_DQL

Class.forName("com.mysql.jdbc.Driver");

5.2 建立连接 

第一个参数是url

jdbc:mysql://IP:端口/数据库

第二个参数是数据库用户名

第三个参数是数据库密码

5.3 创建运行SQL 的语句 

5.4 运行语句

 

5.5 处理运行结果 

while (rs.next()) {

           //  在循环遍历中,把数据取出来

           System.out.print(rs.getInt("id") + "    ");

       // 如果传入是整型值 就会获取对应的列,比如下面 就是获取第一列的值,不建议使用

           System.out.print(rs.getInt(1) + "    ");

           System.out.print(rs.getString("id") + "  ");

           // 字符串不能用int来接收,除非这个 字符串是纯数字

           // System.out.print(rs.getInt("name") +"    ");

           System.out.print(rs.getString("name") + "  ");

           System.out.print(rs.getString("course") + "  ");

           System.out.print(rs.getDouble("score")+"  ");

           // 3 对应的是name列,如果更改表结构,把name列放到第四位了,那么这里就获取不到name了

           // 所以 不灵活,不推荐使用

           System.out.println(rs.getString(3));

       }

5.6 释放资源

先打开的资源后关闭

演示示例:JDBC_01_Base_DQL_00

课堂练习1:使用JDBC查询test_jdbc表

3 常见错误

链接超时导致

1 IP不对

2 端口不对

3 服务没启动

没有这个数据库

1 查看是否拼写错误

2 链接的是否是有该数据库的电脑(IP)

都是说明 用户名和密码不正确导致

1 用户名错误

2 密码错误

1 没有导入jar包

2 没有build path

3 加载驱动拼写错了com.mysql.jdbc.Driver 导致 找不到这个类

4 数据库高版本,jar包中的Driver驱动类路径不是这个 cj

6 代码优化

上面程序中,有可能会导致释放资源出现问题

比如查询语句写错了等,这时候会抛出异常,那么关闭语句就不会执行

所以我们应该使用try...catch...finally来优化一下

以刚才的练习为例,对test_jdbc表的查询进行优化

       Connection conn = null;

       Statement stmt = null;

       ResultSet rs = null ;

       try {

           // 1 加载驱动

           Class.forName("com.mysql.jdbc.Driver");

           // 2 创建数据库连接对象

           // 导包使用的都是java.sql的

            conn = DriverManager.getConnection(

                  "jdbc:mysql://127.0.0.1:3306/_06_", "root", "root");

          

           // 3 创建语句传输对象

              String sql = "select * from test_jdbc";

               stmt = conn.createStatement();

             

              // 4 接收数据库结果集

               rs = stmt.executeQuery(sql);

              while (rs.next()) {

                  //  在循环遍历中,把数据取出来

                  System.out.print(rs.getInt("id") + "    ");

                  System.out.print(rs.getString("name") + "  ");

                  System.out.println(rs.getDouble("money")+"  ");

              }

      

       } catch (Exception e) {

           e.printStackTrace();

       }finally{

           try {

              if (rs != null) {

                  rs.close();

              }

              if (stmt != null) {

                  stmt.close();

              }

              if (conn != null) {

                  conn.close();

              }

           } catch (SQLException e) {

              e.printStackTrace();

           }

       }

   7 DML

Data Manipulation Language : 数据操作语言

涉及的关键字有 : delete,update,insert

和查询的操作几乎一样,就是把第4步和第5步更改一下

       Connection conn = null;

       Statement stmt = null;

       ResultSet rs = null;

       try {

           // 1 加载驱动

           Class.forName("com.mysql.jdbc.Driver");

           // 2 创建数据库连接对象

           conn = DriverManager.getConnection(

                  "jdbc:mysql://127.0.0.1:3306/_06_", "root", "root");

           // 3 语句传输对象

           stmt = conn.createStatement();

           String sql = "insert into test_jdbc (id,name,money) values (4,'小小',999.9)";

           // sql = "update test_jdbc set money=money+1000 where id=1 ";

           // sql = "delete from test_jdbc where id = 1";

           // 如果是查询,就返回true,不是就返回false,价值不大,所以用的不多,添加,删除,更新都可以用这个方法

           // stmt.execute(sql);

           // 返回值是int,返回影响了几条数据(更改了几条/删除了几条/添加了几条),添加,删除,更新都可以用这个方法

           int count = stmt.executeUpdate(sql);

           System.out.println("影响了 " + count + " 条数据");

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           try {

              // 关闭资源,从上到下依次关闭,后打开的先关闭

              if (rs != null) {

                  rs.close();

              }

              if (stmt != null) {

                  stmt.close();

              }

              if (conn != null) {

                  conn.close();

              }

           } catch (Exception e2) {

              e2.printStackTrace();

           }

       }

8 PreparedStatement

添加或者更新的时候,尽量使用 PreparedStatement ,而不是使用Statement

  Statement 和 PreparedStatement 的区别

 

  Statement用于执行静态SQL语句,在执行的时候,必须指定一个事先准备好的SQL语句,并且相对不安全,会有SQL注入的风险

 

  PreparedStatement是预编译的SQL语句对象,sql语句被预编译并保存在对象中, 被封装的sql语句中可以使用动态包含的参数 ? ,

  在执行的时候,可以为?传递参数

 

  使用PreparedStatement对象执行sql的时候,sql被数据库进行预编译和预解析,然后被放到缓冲区,

  每当执行同一个PreparedStatement对象时,他就会被解析一次,但不会被再次编译 可以重复使用,可以减少编译次数,提高数据库性能

  并且能够避免SQL注入,相对安全(把’ 单引号 使用 \ 转义,避免SQL注入 )

8.1 DQL

使用PreparedStatement 执行查询

public static void load(int id) {

       Connection conn = null;

       PreparedStatement prst = null;

       ResultSet rs = null;

       try {

           // 1 加载驱动

           Class.forName("com.mysql.jdbc.Driver");

           // 2 创建数据库连接对象

           conn = DriverManager.getConnection(

                  "jdbc:mysql://127.0.0.1:3306/_06_", "root", "root");

           // 这里我们用? 问号代替值,可以叫占位符,也可以叫通配符

           String sql = "select * from test_jdbc where id = ?";

           // 3 语句传输对象

           prst = conn.prepareStatement(sql);

           // 设置第一个?的值

           prst.setInt(1, id);

           rs = prst.executeQuery();

           while (rs.next()) {

              System.out.print(rs.getInt("id") + "   ");

              System.out.print(rs.getString("name") + "   ");

              System.out.println(rs.getString("money") + "   ");

           }

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           try {

              // 关闭资源,从上到下依次关闭,后打开的先关闭

              if (rs != null) {

                  rs.close();

              }

              if (prst != null) {

                  prst.close();

              }

              if (conn != null) {

                  conn.close();

              }

           } catch (Exception e2) {

              e2.printStackTrace();

           }

       }

    }

8.1 DML

使用PreparedStatement 执行增删改,以添加为例

    public static void add(int id, String name, double money) {

       Connection conn = null;

       PreparedStatement prst = null;

       try {

           // 1 加载驱动

           Class.forName("com.mysql.jdbc.Driver");

           // 2 创建数据库连接对象

           conn = DriverManager.getConnection(

                  "jdbc:mysql://127.0.0.1:3306/_06_", "root", "root");

           // 这里我们用? 问号代替值,可以叫占位符,也可以叫通配符

           String sql = "insert into test_jdbc (id,name,money) values (?,?,?)";

           // 3 语句传输对象

           prst = conn.prepareStatement(sql);

           // 设置第一个?的值

           prst.setInt(1, id);

           prst.setString(2, name);

           prst.setDouble(3, money);

           // 返回也是影响的条数

           int count = prst.executeUpdate();

           System.out.println("影响了 "+count+" 条数据");

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           try {

              // 关闭资源,从上到下依次关闭,后打开的先关闭

              if (prst != null) {

                  prst.close();

              }

              if (conn != null) {

                  conn.close();

              }

           } catch (Exception e2) {

              e2.printStackTrace();

           }

       }

    }

 9 封装工具类

主要针对2个方面进行改进封装。

以下的代码我们每个方法中都会重复一次,这是没必要的,因为不同的方法其实只是具体执行的SQL语句的内容不同,对于获取连接与释放资源,对应的逻辑是相同的。我们完全可以把这一段逻辑抽取出来,形成独立的类与方法,再在实际应用时调用对应的类和方法就可以了。

1 创建连接这些

2 关闭资源这些

 

创建链接这些可以这样进行优化

    public static Connection getConnection() throws ClassNotFoundException,

           SQLException {

       String username = "root";

       String password = "root";

       String url = "jdbc:mysql://127.0.0.1:3306/_06_";

       Class.forName("com.mysql.jdbc.Driver");

       Connection connection = DriverManager.getConnection(url, username,

              password);

       return connection;

    }

关闭资源这些可以这样进行优化

因为Connection和Statement/PreparedStatement以及ResultSet都实现了AutoCloseable接口

所以我们可以直接写AutoCloseable

    public static void close(AutoCloseable obj) {

       if (obj != null) {

           try {

              obj.close();

           } catch (Exception e) {

              e.printStackTrace();

           }

       }

    }

10 Batch 多语句操作

在一次任务中,执行多条数据

10.1 Statement实现

    Connection conn = null;

       Statement stmt = null;

       try {

           conn = DBUtil.getConnection();

           stmt = conn.createStatement();

           stmt.addBatch("insert into test_jdbc (id,name,money) values(21,'stmt多条测试1',99.12)");

           stmt.addBatch("insert into test_jdbc (id,name,money) values(22,'stmt多条测试2',99.22)");

           stmt.addBatch("insert into test_jdbc (id,name,money) values(23,'stmt多条测试3',99.32)");

           stmt.addBatch("insert into test_jdbc (id,name,money) values(24,'stmt多条测试4',99.42)");

           stmt.executeBatch();

           System.out.println("执行成功");

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           DBUtil.close(stmt);

           DBUtil.close(conn);

       }

    演示示例:JDBC_05_Batch_Statement

10.2 PreparedStatement实现

       Connection conn = null;

       PreparedStatement prst = null;

       try {

           conn = DBUtil.getConnection();

           String sql = "insert into test_jdbc (id,name,money) values(?,?,?)";

           prst = conn.prepareStatement(sql);

           prst.setInt(1, 31);

           prst.setString(2, "prst多条测试1");

           prst.setDouble(3, 11.1);

           prst.addBatch();

           prst.setInt(1, 32);

           prst.setString(2, "prst多条测试2");

           prst.setDouble(3, 21.1);

           prst.addBatch();

           prst.setInt(1, 33);

           prst.setString(2, "prst多条测试3");

           prst.setDouble(3, 31.1);

           prst.addBatch();

           prst.executeBatch();

           System.out.println("执行成功");

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           DBUtil.close(prst);

           DBUtil.close(conn);

       }

四、知识点

1. 事务机制管理

Transaction事务机制管理

默认情况下,是执行一条SQL语句就保存一次,那么比如我需要 有三条数据同时成功同时失败,这个时候就需要开启事务机制了

如果开启事务机制,执行中发生问题,会回滚到没有操作之前,相当于什么也没有发生过

1.1 没有事务处理的操作

    Connection conn = null;

       PreparedStatement prst = null;

       Statement stmt = null;

       try {

           conn = DBUtil.getConnection();

           String sql = "insert into test_jdbc (id,name,money) values(?,?,?)";

           prst = conn.prepareStatement(sql);

           prst.setInt(1, 31);

           prst.setString(2, "事务测试1");

           prst.setDouble(3, 11.1);

           prst.addBatch();

           prst.setInt(1, 32);

           // 这里故意写成1,让报错

           prst.setString(1, "事务测试2");

           prst.setDouble(3, 21.1);

           prst.addBatch();

           prst.setInt(1, 33);

           prst.setString(2, "事务测试3");

           prst.setDouble(3, 31.1);

           prst.addBatch();

           prst.executeBatch();

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           DBUtil.close(stmt);

           DBUtil.close(prst);

           DBUtil.close(conn);

       }

    插入三条数据,但是第二天添加失败,但是1和3都能添加成功,因为默认是一条SQL就提交一次

 

演示示例:JDBC_01_NoTransaction

如何才能让这三条数据同时成功失败呢?

1.2 有事务处理的操作

Connection conn = null;

       PreparedStatement prst = null;

       Statement stmt = null;

       try {

           conn = DBUtil.getConnection();

           // 取消自动提交

           conn.setAutoCommit(false);

           String sql = "insert into test_jdbc (id,name,money) values(?,?,?)";

           prst = conn.prepareStatement(sql);

           prst.setInt(1, 31);

           prst.setString(2, "事务测试1");

           prst.setDouble(3, 11.1);

           prst.addBatch();

           prst.setInt(1, 32);

           // 这里故意写成1,让报错

           prst.setString(1, "事务测试2");

           prst.setDouble(3, 21.1);

           prst.addBatch();

           prst.setInt(1, 33);

           prst.setString(2, "事务测试3");

           prst.setDouble(3, 31.1);

           prst.addBatch();

           prst.executeBatch();

           // 提交

           conn.commit();

           conn.setAutoCommit(true);

       } catch (Exception e) {

           e.printStackTrace();

           try {

              // 事务回滚

              conn.rollback();

              conn.setAutoCommit(true);

           } catch (SQLException e1) {

              e1.printStackTrace();

           }

      

       } finally {

           DBUtil.close(stmt);

           DBUtil.close(prst);

           DBUtil.close(conn);

       }

2 SQL 注入 

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据 库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

先模拟应用场景

2.1 导入示例数据

DROP TABLE IF EXISTS `t_user`;

CREATE TABLE `t_user` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `username` varchar(255) NOT NULL,

  `password` varchar(255) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `t_user` VALUES ('1', 'admin', 'admin');

INSERT INTO `t_user` VALUES ('2', 'root', 'root');

INSERT INTO `t_user` VALUES ('3', 'zrz', '123');

2.2 创建 User实体类

2.3  创建IUserDao接口

提供一个登录和更新密码的功能

2.4 使用 Statement技术实现IUserDao接口

public class UserDao_Statement implements IUserDao {

    @Override

    public void login(User user) {

       Connection connection = null;

       Statement statement = null;

       ResultSet rs = null;

       try {

           connection = DBUtil.getConnection();

           statement = connection.createStatement();

           String sql = "select count(*) from t_user where username='"

                  + user.getUsername() + "' and password = '"

                  + user.getPassword() + "'";

           rs = statement.executeQuery(sql);

           rs.next();

           if (rs.getInt(1) != 0) {

              System.out.println("登录成功");

           } else {

              System.out.println("登录失败");

           }

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

    @Override

    public void updatePwd(User user, String newPwd) {

       Connection connection = null;

       Statement statement = null;

       try {

           connection = DBUtil.getConnection();

           statement = connection.createStatement();

           String sql = "update t_user set password = '" + newPwd

                  + "'  where username = '" + user.getUsername() + "'";

           int count = statement.executeUpdate(sql);

           System.out.println("修改成功,修改了 " + count + " 条数据");

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

}

2.5 测试test

2.6 使用 PreparedStatement技术实现IUserDao接口

public class UserDao_PreparedStatement implements IUserDao {

    @Override

    public void login(User user) {

       Connection connection = null;

       PreparedStatement statement = null;

       ResultSet rs = null;

       try {

           connection = DBUtil.getConnection();

           String sql = "select count(*) from t_user where username=? and password = ?";

           statement = connection.prepareStatement(sql);

           statement.setString(1, user.getUsername());

           statement.setString(2, user.getPassword());

      

           rs = statement.executeQuery();

           rs.next();

           if (rs.getInt(1) != 0) {

              System.out.println("登录成功");

           } else {

              System.out.println("登录失败");

           }

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

    @Override

    public void updatePwd(User user, String newPwd) {

       Connection connection = null;

       PreparedStatement statement = null;

       try {

           connection = DBUtil.getConnection();

           String sql = "update t_user set password = ?  where username =?";

           statement =connection.prepareStatement(sql);

           statement.setString(1, user.getPassword());

           statement.setString(2, user.getUsername());

      

           int count = statement.executeUpdate();

           System.out.println("修改成功,修改了 " + count + " 条数据");

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

}

2.7 测试test

重新导入示例数据,把示例数据还原

3  Properties优化硬代码

如上,我们项目开发完成测试通过后,通常是要打包发布给别人使用的,如果我们把一些配置信息写死到代码中(这种行为叫硬编码,hardcode),别人就无法修改了

比如别人使用的MySQL服务器对应的IP是10.0.0.1,端口号是9300,用户名是mysqluser、密码是123456。

那么我们只能改代码再重新打包发布,如果有多个用户,他们对应的配置信息都不同,那么我们要针对不同的用户打包发布多次。

以上显然是没必要的,因为我们开发的是程序,只要业务需求/逻辑不变,我们就无需多次打包发布。对此我们的解决方案是,尽量避免硬编码,      将数据与程序分离解耦,将配置信息存储到配置文件中,程序运行时读取配置文件,不同用户只需按自己的实际情况修改配置文件即可。

3.1 创建jdbc.properties配置文件

这种方式 账号密码什么的如果发生改动,我只需要更改配置文件就可以

在src目录下创建jdbc.properties文件,内容如下

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/_06_

username=root

password=root

3.2 更改DBUtil工具类

public static Connection getConnection() throws ClassNotFoundException,

           SQLException, IOException {

       Properties properties = new Properties();

       // getClassLoader : 获取类加载器

       // getResourceAsStream : 把资源转换为流

       // 这里 定位到src.所以可以直接写文件名,而流是定位到项目

       properties.load(DBUtil.class.getClassLoader().getResourceAsStream(

              "jdbc.properties"));

       // properties 本质就是一个map,可以通过key获取value

       // username=root 读取到之后,以 = 分隔为数组,把username作为key,root作为value保存

       // 所以我们就可以通过username 来获取root

       String driver = properties.getProperty("driver");

       String username = properties.getProperty("username");

       String password = properties.getProperty("password");

       String url = properties.getProperty("url");

       Class.forName(driver);

       Connection connection = DriverManager.getConnection(url, username,

              password);

       return connection;

    }

3.3 测试test

还是以刚才的SQL注入程序为例,只更改了DBUtil和添加了jdbc.properties

 

 

 

 

 

 

 

 

 

 

 

手把手教你用CV5200模块搭建无人机高清图传系统(含实测数据) 本文提供了一份基于CV5200模块搭建远距离无人机高清图传系统的完整实战指南。文章详细解析了系统架构、硬件连接、软件配置与优化,并分享了实地飞行测试数据。核心在于利用CV5200的LR-WiFi私有协议,在视距下实现数公里级的稳定高清视频传输,为DIY爱好者和行业应用提供了高性价比的解决方案。 阅读详情

相关推荐

浅谈车载控制器产线EOL实现方式

1、控制器生产产线上电路检测设计 2、客户总装产线检测设计

u012406840的博客 2万+

JDBC 技术 Java连接MySQL数据库(四万字零基础保姆级超全详解)

管他啥是啥,看就完了!有什么地方存在不足或者错误的,烦请各位大佬在评论区指正。!本文结合了韩顺平零基础学java,黑马程序员零基础学 JavaWeb,等多个视频的相关知识内容整理而来。花费了很多很多的时间,大家有兴趣也可以结合视频一起xi在开发中我们使用的是 Java语言,那么势必要通过 Java语言操作数据库中的数据。这就是接下来要学习的 JDBC 技术。ResultSet(结果集对象)类作用:封装了 DQL 查询语句查询返回的结果。

m0_74824044的博客 1199

Abaqus 单元与全局刚度矩阵导出实战指南:从INP修改到结果解析

本文提供了Abaqus中导出单元刚度矩阵和全局刚度矩阵的完整实战指南。通过详细步骤讲解INP文件修改、关键指令插入及结果文件解析,帮助工程师、研究人员和二次开发者深入理解有限元软件内核,实现理论验证、二次开发与深度问题调试。

k8s6orchestrator的博客 898

MySQL学习(五)JDBC 使用java操作数据库

JDBC

敲敲敲 2221

调用IP核、移植/复制IP核以及解决IP核被锁住/红锁问题(基于vivado)

解决不同工程IP核之间复制调用以及IP核红锁问题,让开发更简单!

weixin_44502554的博客 1万+

(2024,DDPM,DDIM,流匹配,SDE,ODE)扩散:基础教程

本文的目标是尽可能简单地教授扩散。第一节介绍扩散的基本原理。第二节和第三节展示如何构建随机和确定性扩散采样器。第四部分介绍了密切相关的流匹配,可看作是扩散的推广。​第五节,强调实践中最重要的一些设计选择,包括采样器、噪声时间表和参数化方法。

qq_44681809的博客 1万+

MySQL<7> JDBC

数据库编程的必备条件 编程语言: 如Java,C、C++、Python等 数据库(数据库服务器): 如Oracle,MySQL,SQL Server等 数据库驱动包: 不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提 供了 Java 的驱动包 mysql-connector-java,需要基于 Java 操作 MySQL 即需要该驱动包;同样的, 要基于 Java 操作 Oracle 数据库则需要 Oracle 的数据库驱动包ojdbc JDBC 什么是 JDBC? JDBC,即J

一朵花花 404

手把手用ROS实现Ego-Planner动态避障:无人机撞树问题终结方案

本文详细介绍了如何在ROS和Gazebo仿真环境中,通过配置和调优Ego-Planner算法,实现无人机的动态避障功能。文章深入解析了其基于局部梯度优化的核心思想,提供了从环境搭建、参数详解到代码集成的完整实践指南,并分享了实战排错经验,旨在彻底解决无人机在复杂动态场景中的碰撞问题。

weixin_29031161的博客 1630

读取SQL文件并执行

读取固定目录下的所有脚本文件然后执行到指定的数据库 在Spring中做测试有这样一个注解(Sql),如下所示: @Sql("classpath:ms_class.sql") @Test public void contextLoads() { } 这个注解就是用于读取Sql脚本并执行的,那么参照这个就可以了。 官方注释说明: @Sql is used to annotate a test cl...

m0_37607945的博客 1966

【接地系统篇】电力系统接地技术详解:从基本原理到实际应用

接地是为电流返回电源提供的一条低阻抗通道。简单来说,就是为故障电流修建一条"安全回家"的路,防止电流通过人体或其他不应带电的部件。接地系统选择原则安全性优先:TN-S系统安全性最高,适合重要场所经济性考虑:TN-C系统成本最低,适合一般工业连续性要求:IT系统供电连续性最好,适合特殊场所灵活性选择:TN-C-S系统兼顾经济与安全,应用最广。

2301_81299416的博客 2224

Unity技能系统核心:从理论到实践构建可扩展的Buff管理器

本文深入探讨了Unity游戏开发中构建可扩展技能系统的核心——Buff管理器。通过剖析三层架构(数据、逻辑、渲染)与独立组件管理模式,提供了从Buff数据定义、管理器核心实现到可视化编辑器搭建的完整实践方案,旨在解决技能系统维护难题,提升开发效率与代码质量。

weixin_29002209的博客 253

MySQL的JDBC的使用

JDBC 标准,在代码中的表现,一组 interface(接口),实现了这些接口的类 Driver (驱动) Jar 包,是一个zip压缩包,按一定的标准管理起来的一组类文件(*.class) 搭建实用JDBC环境的步骤 1.在根目录下新建 lib 目录 2.把 mysql-jdbc 的 jar 包复制到 lib 目录; 3.选择 File 下的 Project Structure 4....

博客 443

MobSF-v3源代码分析(一)

移动安全框架(MobSF)是一种自动化的移动应用程序(Android/iOS/Windows)测试框架,能够执行静态、动态和恶意软件分析。 它可用于Android、iOS和Windows移动应用程序的有效和快速安全分析,并支持二进制文件(APK,IPA和APPX)和压缩源代码。 MobSF可以在运行时为Android应用程序进行动态应用程序测试,并具有由CapFuzz(一种特定于Web API的安全扫描程序)提供支持的Web API模糊测试。MobSF旨在使您的CI/CD或DevSecOps管道集成无缝。

武天旭的博客 8960

JDBC 连接 MySQL

JDBC 是 Java DataBase Connectivity (Java 数据连接)技术的简称,是一种可用于执行SQL 语句的 Java API。它由一些 java 语言编写的类和接口组成;程序员通过使用 jdbc 可以方便地将 SQL 语句传送给几乎任何一种数据库。......

程序猿追的博客 11万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

从入门到精通【MySQL】 JDBC

从入门到精通【MySQL】 JDBC

双吉堡工程专业的一名27届Javaer。 3878

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

MySQL的JDBC连接

MySQL的JDBC连接MySQL的JDBC概念MySQL的JDBCJDBC添加数据封装连接工具更新数据和事务删除数据查询数据 MySQL的JDBC概念 JDBC 是 Java Database Connective的缩写,表示使用Java去连接数据库进行数据操作的过程 MySQL的JDBC 创建动态项目-以eclipse为例,首先要创建动态项目 连接开发包(在www.mvnrepositor...

hcwdd的博客 2万+

MYSQL中JDBC的使用

JDBC 是Java 中的一组API,用于执行SQL 操作(例如CRUD 操作:增、删、改、关系),同时可以和各种类型的数据库类型进行连接(MySQL、Oracle、SQL Server 等)。在项目中,可以通过下载MySQL的Connector/J包并添加到项目的类路径中。时,避免了简单的字符串粘贴可能带来的代码差异性差、安全性低的问题(如SQL注入),提供了更安全和清晰的插值方式。

eternal__day的博客 2000

【MySQL系列】Java的JDBC编程

MySQL数据库 JDBC编程部分的内容~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

哎呀是小张啊 的博客 2030

[MySQL]初始JDBC编程

JDBC即Java DataBase Connectivity , Java数据库连接 , 是一种用于执行SQL语句的Java API. 它是Java中数据库的连接规范.

Node_Hao的博客 4052

com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver

一、 com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver介绍 1.MySQL Connector / J介绍 MySQL通过MySQL Connector / J为使用Java编程语言开发的客户端应用程序提供连接。Connector / J实现了 Java数据库连接(JDBC)API以及它的许多增值扩展。它还支持新的X DevAPI。 MySQL Connector / J是JDBC Type 4驱动程序,实现了 JDBC 4.2规范。Type 4表示驱动程序是

XiaoPub的博客 9169

MySQL JDBC 编程

难道是针对⼀个数据库写⼀套调⽤的⽅法吗?因为驱动和 API 完全不同,所以不同的数据操作也是不同 的,要针对每种数据库写⼀套调⽤代码就太麻烦了,那要怎么办?。2.1 JDBC 定义JDBC,即 Java Database Connectivity,Java 数据库连接。是⼀种⽤于执行 SQL 语句的 Java API, 它是 Java 中的数据库连接规范。这个 API 由 java.sql.*,javax.sql.* 包中的⼀些类和接⼝组成,

2401_87167748的博客 1847

【MySQL】Java的JDBC编程

Java的JDBC编程 1. 数据库编程的必备条件 2. Java的数据库编程:JDBC 3. JDBC工作原理 4. JDBC使用 配置 最基本的一个JDBC程序编写流程 JDBC查询 4.1 JDBC开发案例 4.2 JDBC使用步骤总结 5. JDBC常用接口和类 5.1 JDBC API 5.2 数据库连接Connection 5.3 Statement对象 5.4 ResultSet对象 6. 应用案例 7. 内容重点总结 面试问答: 8. 课后作业

2402_85428625的博客 2123

MySQL之JDBC编程

是 Java 提供的一种,用于连接和操作关系型数据库。JDBC 是 Java 语言和数据库之间沟通的桥梁,使得 Java 应用程序可以与各种数据库进行交互。

YQY18289570091的博客 1183

mysql jdbc驱动_安装 mysql 的 JDBC driver

You can install the Connector/J package using either the binary or source distribution. The binary distribution provides the easiest method for installation; the source distribution lets you customize...

weixin_39709178的博客 985

JDBC连接MySQL

JDBC-MySQL 一、介绍 JDBC(Java DataBase Connectivity java数据库连接)是JAVA官方提供的一套接口,用于连接并操作数据库。 不同的数据库厂商都提供了一套JDBC的实现类,并以jar包形式发布,用于使我们的程序可以通过这套实现类来操作其数据库,这套jar称为”驱动”。我们无需记住这些数据库提供商提供的JDBC实现类的名字,只要使用JDBC接口看...

YIMT的博客 1323

MySQL之JDBC

MySQL数据库从小白到小菜05JDBC JDBC 在日常工作中,一般都会使用代码来操作数据库,MySQL会给各种主流的编程语言提供API(现成的函数/类)从而达到用代码来操作数据库的目的 由于MySQL本身就是由 C/C++ 语言实现的,所以使用C/C++语言来操作数据库是最直接的,而使用其它语言来操作数据库,就需要按照MySQL服务器的要求,构造出对应的网络请求就好了。 而通过JAVA来操作MySQL就需要先得到MySQL的API,可以在MySQL的官方网站上寻找各种版本的API。 ...

weixin_52793965的博客 463
上一篇: MySQL day03
下一篇: 01_html 基础
java_yangXL
博客等级 码龄5年 1粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值