首页
统计
友链
关于
Search
1
静静地生活着
415 阅读
2
JVM_1.引言
404 阅读
3
Chapter 03
331 阅读
4
机器学习 01
323 阅读
5
欢迎使用 Typecho
283 阅读
Java
School
ML
Other
Share
Explore
运维
登录
Search
bbchen
累计撰写
53
篇文章
累计收到
5
条评论
首页
栏目
Java
School
ML
Other
Share
Explore
运维
页面
统计
友链
关于
搜索到
53
篇与
的结果
2023-04-15
Win10右键新增md文件
前提:已安装Typora步骤:win+R -> regedit -> 回车找到HKEY_CLASSES_ROOT\.md左键单击.md -> 右侧默认字段的数据改为 Typora.md右键单击.md -> 新建项 -> 命名为ShellNew右键单击ShellNew -> 新建字符串值NullFilecomplete!
2023年04月15日
60 阅读
0 评论
0 点赞
2023-04-14
破解 XSHELL&XFTP 免费版关闭弹窗
XSHELL 是一款好用的 SSH 客户端,也是十分良心,提供了家庭/学校免费版本,在官网输入姓名(可以不是真实姓名)和邮箱后,可以通过邮箱内的 URL 免费下载。美中不足的是,每次关闭时会提示:破解这个弹窗十分简单,只需要一个16进制工具——HxD下面介绍具体方法:打开HxD,用HxD打开XShell.exe,搜索 74 11 6A 00 6A 07 6A 01修改 74 为 EB Ctrl+S保存即可补充:应首先运行过一次xshell,如果安装后直接修改,则会无法找到该字符串XFTP同理,搜索75 10 6A 00 6A 07 50 6A,将 75 改为 EB ,保存即可{cloud title="HxD-16进制编辑器" type="lz" url="https://wwxw.lanzouo.com/iz2wD0sz0xpc" password=""/}
2023年04月14日
59 阅读
0 评论
0 点赞
2023-03-23
xml中的转义字符问题及properties中无需转义
在配置mybatis-config.xml的mysql url时,会遇到如下问题:&会报错,这是因为对于xml而言,&和<是非法字符,需要使用转义字符&代替<会产生错误,因为解析器会把该字符解释为新元素的开始。&也会产生错误,因为解析器会把该字符解释为字符实体的开始。当使用外部properties文件时,还有如下问题: <environments default="development"> <environment id="development"> <!--配置数据管理器--> <transactionManager type="JDBC"/> <!--配置数据源--> <dataSource type="POOLED"> <!--配置驱动--> <property name="driver" value="${jdbc.driver}"/> <!--配置连接 mysql url--> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.pwd}"/> </dataSource> </environment> </environments>jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8 jdbc.user=root jdbc.pwd=123456这样配置后,报错如下:org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.sql.SQLNonTransientConnectionException: Cannot load connection class because of underlying exception: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the connection string near ';useUnicode=true&characterEncoding=UTF-8'. ### The error may exist in com/bbedu/mapper/MonsterMapper.xml ### The error may involve com.bbedu.mapper.MonsterMapper.getMonsterById ### The error occurred while executing a query ### Cause: java.sql.SQLNonTransientConnectionException: Cannot load connection class because of underlying exception: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the connection string near ';useUnicode=true&characterEncoding=UTF-8'.可以看出,在properties中无需转义,转义反而会导致无法解析,因此,properties需要改为:jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8 jdbc.user=root jdbc.pwd=123456
2023年03月23日
55 阅读
0 评论
0 点赞
2023-02-26
Chapter25_JDBC
JDBC简介概念JDBC是使用 Java 语言操作关系型数据库的一套 API全称:(Java DataBase Connectivity)Java 数据库连接本质官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口各个数据库厂商去实现这套接口,提供数据库驱动jar包我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类好处各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发可随时替换底层数据库,访问数据库的Java代码基本不变快速入门package com.bbedu.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class JDBCDemo { public static void main(String[] args) throws ClassNotFoundException, SQLException { // 1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.获取连接 String url = "jdbc:mysql://127.0.0.1:3306/db1"; String username = "root"; String password = "123456"; Connection connection = DriverManager.getConnection(url, username, password); // 3.定义 sql String sql = "UPDATE stu SET math = 100 WHERE NAME = '码云';"; // 4.获取执行sql对象的 Statement Statement statement = connection.createStatement(); // 5.执行sql int count = statement.executeUpdate(sql); // 受影响的行数 // 6.处理结果 System.out.println(count); // 7.释放资源 statement.close(); connection.close(); } }JDBC API 详解DriveManager作用:注册驱动获取数据库连接Connection作用:获取执行 SQL 的对象管理事务package com.bbedu.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class JDBCDemo_Connection { public static void main(String[] args) throws ClassNotFoundException, SQLException { // 1.注册驱动 //Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL5 以后可以不写 // 2.获取连接 String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false"; String username = "root"; String password = "123456"; Connection connection = DriverManager.getConnection(url, username, password); // 3.定义 sql String sql1 = "UPDATE stu SET english = 100 WHERE id = '1';"; String sql2 = "UPDATE stu SET english = 100 WHERE id = '2';"; // 4.获取执行sql对象的 Statement Statement statement = connection.createStatement(); try { // 开启事务 connection.setAutoCommit(false); // 执行 int count1 = statement.executeUpdate(sql1); // 受影响的行数 System.out.println(count1); int i = 3/0; int count2 = statement.executeUpdate(sql2); // 受影响的行数 System.out.println(count2); // 提交事务 connection.commit(); } catch (Exception e) { // 回滚事务 connection.rollback(); e.printStackTrace(); } // 7.释放资源 statement.close(); connection.close(); } }Statement执行 SQL 语句ResultSetpackage com.bbedu.jdbc; import java.sql.*; public class JDBCDemo_ResultSet { public static void main(String[] args) throws ClassNotFoundException, SQLException { // 1.注册驱动 //Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL5 以后可以不写 // 2.获取连接 String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false"; String username = "root"; String password = "123456"; Connection connection = DriverManager.getConnection(url, username, password); // 3.定义SQL String sql = "select * from stu;"; // 4.获取执行对象 Statement statement = connection.createStatement(); // 5.执行sql ResultSet resultSet = statement.executeQuery(sql); // 6.遍历 while (resultSet.next()){ // int id = resultSet.getInt(1); // String name = resultSet.getString(2); // double math = resultSet.getDouble(6); int id = resultSet.getInt("id"); String name = resultSet.getString("name"); double math = resultSet.getDouble("math"); System.out.println(id + " " + name + " " + math); System.out.println("-----------------"); } // 7.释放 resultSet.close(); statement.close(); connection.close(); } }练习@Test public void testResultSet2() throws SQLException { // 1.注册驱动 //Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL5 以后可以不写 // 2.获取连接 String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false"; String username = "root"; String password = "123456"; Connection connection = DriverManager.getConnection(url, username, password); // 3.定义SQL String sql = "select * from stu;"; // 4.获取执行对象 Statement statement = connection.createStatement(); // 5.执行sql ResultSet resultSet = statement.executeQuery(sql); // 创建集合 ArrayList<Account> list = new ArrayList<>(); // 6.遍历 while (resultSet.next()){ Account account = new Account(); int id = resultSet.getInt("id"); String name = resultSet.getString("name"); double math = resultSet.getDouble("math"); account.setId(id); account.setName(name); account.setMath(math); list.add(account); } System.out.println(list); // 7.释放 resultSet.close(); statement.close(); connection.close(); }PreparedStatement作用:预编译 SQL 语句并执行,预防 SQL 注入问题SQL 注入SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。@Test public void testInsert() throws Exception{ // 1.注册驱动 //Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL5 以后可以不写 // 2.获取连接 String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false"; String username = "root"; String password = "123456"; Connection connection = DriverManager.getConnection(url, username, password); // 接收用户输入 用户名和密码 String name = "zhangsan"; String pwd = "' or '1' = '1"; String sql = "select * from tb_user where username = '"+name+"' and password = '"+pwd+"';"; System.out.println(sql); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql); // 判断登录是否成功 if(resultSet.next()){ System.out.println("登陆成功"); }else { System.out.println("登陆失败"); } // 7.释放资源 resultSet.close(); statement.close(); connection.close(); }package com.bbedu.jdbc; import org.junit.jupiter.api.Test; import java.sql.*; public class JDBCDemo_PreparedStatement { @Test public void testPreparedStatement() throws Exception{ // 1.注册驱动 //Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL5 以后可以不写 // 2.获取连接 String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false"; String username = "root"; String password = "123456"; Connection connection = DriverManager.getConnection(url, username, password); // 接收用户输入 用户名和密码 String name = "zhangsan"; String pwd = "' or '1' = '1"; String sql = "select * from tb_user where username = ? and password = ?"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, name); preparedStatement.setString(2, pwd); ResultSet resultSet = preparedStatement.executeQuery(); //判断登录是否成功 if(resultSet.next()){ System.out.println("登陆成功"); }else { System.out.println("登陆失败"); } // 7.释放资源 resultSet.close(); preparedStatement.close(); connection.close(); } }原理数据库连接池实现package com.bbedu.druid; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.FileInputStream; import java.sql.Connection; import java.util.Properties; public class DruidDemo { public static void main(String[] args) throws Exception { // 导入jar包 // 定义配置文件 // 加载资源对象 Properties prop = new Properties(); prop.load(new FileInputStream("src/druid.properties")); // 获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); // 获取数据库连接 Connection connection = dataSource.getConnection(); System.out.println(connection); // System.out.println(System.getProperty("user.dir")); } } 练习完成商品品牌数据的增删改查操作环境准备数据库表 tb_brand实体类测试用例package com.bbedu.example; import com.alibaba.druid.pool.DruidDataSourceFactory; import com.bbedu.pojo.Brand; import org.junit.jupiter.api.Test; import javax.sql.DataSource; import java.io.FileInputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Properties; /** * 品牌数据的增删改查 */ public class BrandTest { /** * 查询所有 * SQL: select * from tb_brand; * 参数: 不需要 * 结果: List<Brand> */ @Test public void testSelectAll() throws Exception { // 导入jar包 // 定义配置文件 // 加载资源对象 Properties prop = new Properties(); prop.load(new FileInputStream("src/druid.properties")); // 获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); // 获取数据库连接 Connection conn = dataSource.getConnection(); // 定义 SQL String sql = "select * from tb_brand;"; // 获取对象 PreparedStatement preparedStatement = conn.prepareStatement(sql); // 执行SQL ResultSet rs = preparedStatement.executeQuery(); ArrayList<Brand> brands = new ArrayList<>(); // 处理结果 while (rs.next()) { // 获取数据 int id = rs.getInt("id"); String brandName = rs.getString("brand_name"); String companyName = rs.getString("company_name"); int ordered = rs.getInt("ordered"); String description = rs.getString("description"); int status = rs.getInt("status"); // 封装 Brand 对象 Brand brand = new Brand(); brand.setId(id); brand.setBrandName(brandName); brand.setCompanyName(companyName); brand.setOrdered(ordered); brand.setDescription(description); brand.setStatus(status); // 装载集合 brands.add(brand); } System.out.println(brands); // 释放资源 rs.close(); preparedStatement.close(); conn.close(); } /** * 添加 * * @throws Exception SQL:INSERT INTO tb_brand (brand_name, company_name, ordered, DESCRIPTION, STATUS) VALUES (?, ?, ?, ?, ?); * <p> * 参数:需要,除 id 外所有参数信息 * 结果 boolean */ @Test public void testAdd() throws Exception { // 接收参数 String brandName = "香飘飘"; String companyName = "香飘飘公司"; int ordered = 1; String description = "一年售出三亿杯"; int status = 1; // 导入jar包 // 定义配置文件 // 加载资源对象 Properties prop = new Properties(); prop.load(new FileInputStream("src/druid.properties")); // 获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); // 获取数据库连接 Connection conn = 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); // 释放资源 pstmt.close(); conn.close(); } /** * 测试修改 * * @throws Exception SQL: update tb_brand set brand_name=?, company_name=?, ordered=?, description=?, status=? where id=?; * 参数: 所有参数,包括 id * 结果: boolean */ @Test public void testUpdate() throws Exception { // 接收参数 String brandName = "香飘飘"; String companyName = "香飘飘股份有限公司"; int ordered = 1000; String description = "一年售出三亿杯,绕地球三圈"; int status = 1; int id = 5; // 导入jar包 // 定义配置文件 // 加载资源对象 Properties prop = new Properties(); prop.load(new FileInputStream("src/druid.properties")); // 获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); // 获取数据库连接 Connection conn = 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); // 释放资源 pstmt.close(); conn.close(); } /** * 删除 * * @throws Exception SQL: delete from tb_brand where id = ? * 参数: id * 返回: boolean */ @Test public void testDelete() throws Exception { // 接收参数 int id = 5; // 导入jar包 // 定义配置文件 // 加载资源对象 Properties prop = new Properties(); prop.load(new FileInputStream("src/druid.properties")); // 获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); // 获取数据库连接 Connection conn = 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); // 释放资源 pstmt.close(); conn.close(); } }
2023年02月26日
42 阅读
0 评论
0 点赞
2023-02-26
Chapter24_数据库
MySQL数据库数据库三层结构所谓安装 Mysql 数据库,就是在主机安装一个数据库管理系统(DBMS),这个管理程序可以管理多个数据库。DBMS(database manage system)一个数据库可以创建多个表,以保存数据(信息)DBMS、数据库和表的关系如图所示:数据库-表的本质仍然是文件表的结构行(row)、列(column)SQL 语句分类DDL:数据定义语句[ create 表,库...]DML:数据操作语句[ insert, update, delete ]DQL:数据查询语句[ select ]DCL:数据控制语句[ 管理数据库:比如用户权限 grant revoke ]SQl 通用语句SQL语句可以单行或多行书写,以分号结尾MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写注释:单行注释:-- 注释内容 或 #注释内容多行注释:/ 注释 /DDL操作数据库操作表练习DMLDQL基础查询条件查询排序查询分组查询分页查询约束概念与分类数据库设计表关系多表关系实现一对多:在多的一方建立外键,指向一的一方的主键,即外键约束多对多:一对一:多表查询内连接外连接子查询事务事务四大特征ACIDMySQL 事务默认自动提交
2023年02月26日
78 阅读
0 评论
0 点赞
1
...
3
4
5
...
11