2021-11-18 迈向程序猿的第三十一步

2023-11-10

目录

一.工具类的封装

二.ORM

三.Dao层的抽取

 四.DateUtils

五.Service业务层


一.工具类的封装

//问题: 每次进行CRUD操作,都要写一套JDBC,很繁琐
//解决方案:将重复的操作,抽取到工具类中封装
//1.加载驱动只需要一次---放到静态代码块
//问题2: 直接在工具类中将数据库驱动,数据库名,用户名,密码写死了,不方便后续变更---硬编码
//解决方案:需要变为软编码形式,使程序更灵活,维护性更强
public class LoginTest {
    public static void main(String[] args) {
        System.out.println("请输入用户名");
        Scanner sc = new Scanner(System.in);
        String username = sc.nextLine();  //获取一行内容
        System.out.println("请输入密码");
        String password = sc.nextLine();
        if(login2(username,password)){  //登录功能
            System.out.println("登录成功~!");
        }else{
            System.out.println("登录失败~!");
        }
    }

    private static boolean login2(String username, String password) {
        Connection conn = null;
        PreparedStatement prst   = null;
        ResultSet rs    = null;
        try {
            conn = DBUtils.getConnection();
            prst = conn.prepareStatement("select count(*) from user where username=? and password=?");
            //参数1:对应第一个占位符? 下标从1开始
            prst.setString(1,username);
            prst.setString(2,password);
            //获取结果集
            //sql注入的隐患
            rs = prst.executeQuery();
            if(rs.next()){
                int result = rs.getInt(1); //聚合函数只有一个字段
                return result>0;  //result不小于0,则返回true
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtils.closeAll(rs,prst,conn);
        }
        return false;
    }

    private static boolean login(String username, String password) {
        Connection conn = null;
        Statement st    = null;
        ResultSet rs    = null;
        try {
            conn = DBUtils.getConnection();
            st = conn.createStatement();
            //获取结果集
            //sql注入的隐患
            String sql = "select count(*) from user where username='"+username+"' and password='"+password+"'";
            rs = st.executeQuery(sql);
            if(rs.next()){
                int result = rs.getInt(1); //聚合函数只有一个字段
                return result>0;  //result不小于0,则返回true
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtils.closeAll(rs,st,conn);
        }
        return false;
    }
}


public class DBUtils {
    private static Properties p = new Properties();
    //静态代码块:只加载一次
    static{
        //反射对象调用getResourceAsStream
        //从src目录下获取到db.properties的资源
        try {
            InputStream is = DBUtils.class.getResourceAsStream("/db.properties");
            p.load(is);
            Class.forName(p.getProperty("driver"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(p.getProperty("url"), p.getProperty("username"), p.getProperty("password"));
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    public static void closeAll(AutoCloseable...cs){
        for(AutoCloseable c : cs){
            if(c!=null){
                try {
                    c.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

配置文件的抽取
driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///mydb1
username=root
password=123

二.ORM

对象关系映射:对象-实体类(不放main方法的类),关系-数据表,两者数据的转换
简单地说,就是从数据表中取出数据后,存储到实体类中

//案例:获取岗位表的信息,存储到实体类中

//创建一个实体类与关系表对应: 对象属性=表字段
//将数据表中零散的字段值,封装到实体类中,方便操作

@Data //生成set/get及toString
@NoArgsConstructor  //生成无参构造
@AllArgsConstructor  //生成全参构造
class Jobs{
    private  String job_id;
    private  String job_title;
    private  String min_salary;
    private  String max_salary;
}

public class Test1 {
    public static void main(String[] args) throws SQLException {
        Connection conn = DBUtils.getConnection();
        PreparedStatement prst = conn.prepareStatement("select * from t_jobs");
        ResultSet rs = prst.executeQuery();
        while(rs.next()){
            String job_id = rs.getString("job_id");
            String job_title = rs.getString("job_title");
            String min_salary = rs.getString("min_salary");
            String max_salary = rs.getString("max_salary");
            Jobs jobs = new Jobs(job_id,job_title,min_salary,max_salary);
            System.out.println(jobs);  //对象关系映射:将表字段内容存到实体属性中
        }
        DBUtils.closeAll(rs,prst,conn);
    }
}

三.Dao层的抽取

Dao层:数据访问层,用于做与数据库交互的事情
如果不将dao层抽取,例如登录功能,所有代码都放到测试类中,使得测试类代码特别臃肿
抽取后代码分离设计:
main方法中做业务逻辑操作; dao层只做jdbc操作

案例: Person数据表的增删改查操作
/*
#### 创建数据表
        > - 创建一张表 Person,有以下列:
        >   - id:int,主键,自动增长
        >   - name:varchar(20) 非空
        >   - age:int 非空
        >   - bornDate:Date
        >   - email:字符串
        >   - address:字符串
*/

//在测试类中,进行业务逻辑操作
//操作步骤:
//1.创建数据表
//2.新建实体类
//3.编写工具类
//4.将jdbc抽象到dao层
//5.在测试类中编写业务逻辑

------------创建实体类------------
//实体类中的属性要与表字段一致--ORM
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private int id;
    private String name;
    private  int age;
    private Date bornDate;
    private  String email;
    private  String address;
}



------------创建测试类------------
public class Test1 {
    public static void main(String[] args) {
        System.out.println("请输入你要进行的操作:1.添加 2.修改 3 删除  4 查所有  5.根据id查");
        PersonDaoImpl personDao = new PersonDaoImpl();
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        switch (num){
            case 1:  //添加传对象,一般主键自增长,id不用管
                int result = personDao.insert(new Person(0,"ls",20,new Date(),"ls@163.com","湖北"));
                System.out.println("插入:"+result);
                break;
            case 2:  //修改传对象,要有修改的主键id,才能修改
                result = personDao.update(new Person(2,"ww",44,new Date(),"ww@163.com","江西"));
                System.out.println("修改:"+result);
                break;
            case 3:
                result = personDao.delete(1);  //删除id
                System.out.println("删除:"+result);
                break;
            case 4:   //查询所有,返回List集合
                List<Person> list = personDao.selectAll();
                System.out.println("查所有:"+list);
                break;
            case 5:  //查询单个,往往根据id查,返回实体对象
                Person person = personDao.selectById(2);
                System.out.println("查对象:"+person);
                break;
            default:
                System.out.println("您的输入有误~");
                break;
        }
    }
}


------------创建dao层操作------------
//dao层--数据访问层(用于做jdbc操作)
public class PersonDaoImpl {

    public int insert(Person person) {
        Connection conn = null;
        PreparedStatement prst = null;
        try {
            conn = DBUtils.getConnection();
            prst = conn.prepareStatement("insert into person(name,age,bornDate,email,address) values(?,?,?,?,?)");
            prst.setString(1,person.getName());
            prst.setInt(2,person.getAge());
            //sql包下的new Date(参数)可以long类型的毫秒值参数
            prst.setDate(3,new Date(person.getBornDate().getTime()));
            prst.setString(4,person.getEmail());
            prst.setString(5,person.getAddress());
            return prst.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.closeAll(prst,conn);
        }
        return 0;
    }

    public int update(Person person) {
        Connection conn = null;
        PreparedStatement prst = null;
        try {
            conn = DBUtils.getConnection();
            prst = conn.prepareStatement("update person set name=?,age=? where id=?");
            prst.setString(1,person.getName());
            prst.setInt(2,person.getAge());
            prst.setInt(3,person.getId());
            return prst.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.closeAll(prst,conn);
        }
        return 0;
    }

    public int delete(int id) {
        Connection conn = null;
        PreparedStatement prst = null;
        try {
            conn = DBUtils.getConnection();
            prst = conn.prepareStatement("delete from person where id=?");
            prst.setInt(1,id);
            return prst.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.closeAll(prst,conn);
        }
        return 0;
    }

    public Person selectById(int id) {
        Connection conn = null;
        PreparedStatement prst = null;
        ResultSet rs = null;
        try {
            conn = DBUtils.getConnection();
            prst = conn.prepareStatement("select * from person where id=?");
            prst.setInt(1,id);
            rs = prst.executeQuery();
            if(rs.next()){
                String name = rs.getString("name");
                int age = rs.getInt("age");
                Date bornDate = rs.getDate("bornDate");
                String email = rs.getString("email");
                String address = rs.getString("address");
                return new Person(id,name,age,bornDate,email,address);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtils.closeAll(rs,prst,conn);
        }
        return null;
    }

    public List<Person> selectAll() {
        Connection conn = null;
        PreparedStatement prst = null;
        ResultSet rs = null;
        List<Person> list = new ArrayList<>();
        try {
            conn = DBUtils.getConnection();
            prst = conn.prepareStatement("select * from person");
            rs = prst.executeQuery();
            while(rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                Date bornDate = rs.getDate("bornDate");
                String email = rs.getString("email");
                String address = rs.getString("address");
                list.add(new Person(id,name,age,bornDate,email,address));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtils.closeAll(rs,prst,conn);
        }
        return list;
    }
}

 四.DateUtils

日期工具类
在项目中,针对日期类可能需要相互转化
例如:String转Date,Date转String,Utils的Date转SQL的Date

//日期类的转换方法:
public class DateUtils {
    private  static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    public static Date utilToSQL(java.util.Date date){
        return new Date(date.getTime());
    }

    public static String utilToString(java.util.Date date){
        return sdf.format(date);
    }

    public static java.util.Date stringToUtil(String strDate){
        try {
            return sdf.parse(strDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}

五.Service业务层

用于进行业务逻辑分析,一个业务功能可以包含一个或多个dao操作

例如:转账业务-->细化分析
      一个业务-->多个dao,判断发送方账户,接收方账户正确性,钱是否足够
      最后才能做转账功能--一个账户加钱,另一个用户减钱
      以上都是业务分析范畴

 

案例:转账业务功能分解
/*
* 创建一张表account,有以下列:
- id:int,主键,自动增长
- cart :varchar(40) 非空
- password : 字符串
- money  :double(8,2)
* */
//操作步骤:
//1.创建数据表,插入两条数据
//2.创建实体类Account
//3.创建DBUtils数据库工具类
//4.创建业务层,进行转账业务分析
//5.具体与数据库交互,交给dao层
//6.在测试类中进行测试


---------创建实体类---------
//创建实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Account {
    private int id;
    private  String card;
    private  String password;
    private  double money;
}


----------业务逻辑分析-----------
//转账业务类
public class AccountServiceImpl {
    private  AccountDaoImpl accountDao = new AccountDaoImpl();
    //转账的业务功能
    public String tansfer(String sendCard,double money,String recvCard,String password){
        //1.根据发送方账户,获取对象,如果没有则报异常
        Account sendAccount = accountDao.selectCard(sendCard);
        if(sendAccount==null){
            throw new RuntimeException("发送方账户不存在!");
        }
        //2.如果有,拿到了对象,看看密码是否正确,金额够不够
        if(!password.equals(sendAccount.getPassword())){
            throw  new RuntimeException("密码错误");
        }
        if(sendAccount.getMoney()<money){
            throw new RuntimeException("余额不足");
        }
        //3.判断接收方账户是否存在,如果不存在,则报异常
        Account recvAccount = accountDao.selectCard(recvCard);
        if(recvAccount==null){
            throw  new RuntimeException("接收方账户不存在");
        }
        //4.进行转账-->发送方减钱(update),接收方加钱(update)
        sendAccount.setMoney(sendAccount.getMoney()-money);
        int result = accountDao.update(sendAccount);
        System.out.println("发送方修改:"+result);

        recvAccount.setMoney(recvAccount.getMoney()+money);
        result = accountDao.update(recvAccount);
        System.out.println("发送方修改:"+result);

        return "转账成功~~!";
    }
}


----------数据访问层----------
public class AccountDaoImpl {
    public Account selectCard(String card) {
        Connection conn = null;
        PreparedStatement prst = null;
        ResultSet rs = null;
        try {
            conn = DBUtils.getConnection();
            prst = conn.prepareStatement("select * from account where card=?");
            prst.setString(1,card);
            rs = prst.executeQuery();
            if(rs.next()){
                int id = rs.getInt("id");
                String password = rs.getString("password");
                double money = rs.getDouble("money");
                return new Account(id,card,password,money);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtils.closeAll(rs,prst,conn);
        }
        return null;
    }

    public int update(Account recvAccount) {
        Connection conn = null;
        PreparedStatement prst = null;
        try {
            conn = DBUtils.getConnection();
            prst = conn.prepareStatement("update account set money=? where id=?");
            prst.setDouble(1,recvAccount.getMoney());
            prst.setInt(2,recvAccount.getId());
            return prst.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtils.closeAll(prst,conn);
        }
        return 0;
    }
}


-------------测试类-------------
public class Test1 {
    public static void main(String[] args) {
        AccountServiceImpl accountService = new AccountServiceImpl();
        String res = accountService.tansfer("10010",1000,"10086","123");
        System.out.println(res);
    }
}

(=-=,JDBC的漫漫长路,应用层,业务层,表示层,代码量正在不断加大,有时候手速慢了还敲不赢,很充实,小白这里相信现在敲得每一行代码,都是通往成功路上的地砖,敲得越多,离成功越近,希望每个初学者都可以保持初心,嗯敲就完事了!)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2021-11-18 迈向程序猿的第三十一步 的相关文章

  • spring boot框架下如何过滤tomcat产生的访问日志

    我们使用spring boot框架 通过嵌入式tomcat生成访问日志 访问日志的格式如下 server tomcat access log enabled true server tomcat access log pattern h l
  • 在 Java 和 C 中在运行时调用名为“string”的方法

    我们如何调用名称为的方法string在运行时 谁能告诉我如何在 Java 和 C 中做到这一点 在java中可以通过反射api来完成 看一下Class getMethod String methodName Class parameterT
  • Eclipse 说“更新 Android Developer Toolkit”

    我不知何故弄乱了我的 Eclipse 和 Android 设置 我不知道如何修复它 问题症状如下 在 首选项 gt Android 中 我尝试选择 android sdk linux 的位置 选择时出现错误 此 Android SDK 需要
  • com.google.gwt.dev.jjs.InternalCompilerException:访问期间出现意外错误

    我在使用版本 2 6 0 编译 gwt 应用程序时遇到以下错误 最初我用 gwt 版本 2 6 1 的 maven 编译它 然后尝试通过版本 2 6 0 的 eclipse 编译它 跟版本兼容有关系吗 com google gwt dev
  • UiBinder 中的 gwt 按钮

    我需要创建一个按钮 所以它是一个带有图像的按钮 gwt with UiBinder 但我不确定如何进行 这是我的ui xml code
  • 找不到模块:javafx.controls

    我已经下载了JavaFX SDK 解压它并设置PATH TO FX系统变量 如下本说明 https openjfx io openjfx docs install javafx 我使用了以下代码示例 import javafx applic
  • 使用 viewModel 从 ChildFragment 访问 ParentFragment 中的 ViewModel

    我正在尝试访问ParentViewModel for ParentFragment from ChildFragment using viewModels 这是我的代码 In ParentFragment class ParentFragm
  • Python MySQL 模块

    我正在开发一个需要与 MySQL 数据库交互的 Web 应用程序 但我似乎找不到任何真正适合 Python 的模块 我特别寻找快速模块 能够处理数十万个连接 和查询 所有这些都在短时间内完成 而不会对速度产生重大影响 我想我的答案将是游戏领
  • 用 Java 捕获扬声器输出

    使用Java可以捕获扬声器输出吗 此输出不是由我的程序生成的 而是由其他正在运行的应用程序生成的 这可以用 Java 完成还是我需要求助于 C C 我有一个基于 Java 的应用程序 使用过的爪哇声音 https stackoverflow
  • 在 jFrame 中启用右键单击

    嘿 我正在寻找如何使用 NetBeans 在 jFrame 中启用 仅且仅 右键单击并显示弹出菜单 使用我的代码 private void formMouseClicked java awt event MouseEvent evt pop
  • 如何在 apache poi 中找到包含图片的单元格

    我尝试在 xls 文档中循环图像 我写下一个代码 HSSFPatriarch patriarch sheet getDrawingPatriarch if patriarch null Loop through the objects fo
  • Laravel 中的 SQL 运算符是什么?

    我正在查看 Laravel 的源代码 发现了很多 Eloquent 的 SQL 运算符 我想知道其中一些是什么以及如何使用它们 不幸的是我没有找到任何文档 这是我找到的运营商vendor laravel framework src Illu
  • Java字符串中的字符数[重复]

    这个问题在这里已经有答案了 可能的重复 Java 使用unicode上划线显示平方根时字符串的长度 https stackoverflow com questions 7704426 java length of string when u
  • Spring @Configuration如何缓存对bean的引用

    使用基于 Java 的配置时 Spring 如何防止再次调用 bar 我想知道编译时注释处理或通过代理方法 Configuration public class AppConfig Bean public Foo foo return ne
  • Java 通用问题

    下面的代码可以编译 但如果我取消注释行 它不会编译 我很困惑为什么 HashMap 确实扩展了 AbstractMap 并且声明映射的第一行可以正常编译 import java util AbstractMap import java ut
  • 像搜索一样在mysql中包含空格

    我在某些情况下使用 mysql like 关键字时遇到问题 我的要求是这样的 首先 当我搜索时 ABC 结果应该找到ABC and ABCdef但不是xyzABCdef or xyzABC 乍一看使用起来很简单ABC 但在我搜索时的情况 h
  • 警告:无法加载 sqljdbc_auth.dll 原因:java.library.path 中没有 sqljdbc_auth

    我正在使用 Ubuntu 12 05 并尝试连接到 Windows Server 2012 来获取数据库 我的数据库名称是 jobs 电脑的IP地址是192 160 1 33 托管在1433 但是当我尝试连接时出现以下错误 WARNING
  • Selenium Webdriver 中的 IF 语句

    我想知道是否有人可以帮助我解决我正在尝试解决的问题以及 Java 中 Webdriver 的 If 语句 当登录到我正在测试的应用程序时 可以在主页之前进入安全问题页面 如果是新用户等 我希望测试中的代码做的是 如果出现安全问题页面 请填写
  • 使用反射 API 填充 Proto 中的地图字段

    我正在尝试编写一个模块 该模块将获取 Message Builder 和从字段名称到值的映射 并将用值填充构建器 一切正常 直到我遇到地图字段 使用 Proto3 我收到一条特定消息 我知道我可以执行该消息的字段 builder b put
  • 如何获取 EC2 实例的 CloudWatch 指标数据

    我想获取我的 EC2 实例的 Cloudmetrics 数据 以便我可以使用这些数据绘制图表并将其显示在我的 Android 设备上 我怎么做 有相同的示例程序或教程吗 提前致谢 这就是我正在做的 private static void f

随机推荐

  • BeanUtils.copyProperties基本用法与小坑

    1 实际应用 BeanUtils copyProperties 赋值目标对象 模板源对象 我们都知道当有两个对象AB 属性名称一样的情况下 如果需要把A的全部属性给B 传统写法是 B setXX A getXX 如果只有几个特别的参数需要赋
  • 机器学习小窍门:Python 帮你进行特征选择

    转 https www leiphone com news 201807 3gGDmue2OXYZE0vQ html 特征选择 也就是从数据集中找出并选择最有用特征的过程 是机器学习工作流中一个非常重要的步骤 不必要的特征降低了训练速度 降
  • 第七篇 硬件内存资源的获取,解析

    硬件资源的获取 解析 1 生成WDF的KMDFhelloWorld程序 2 改写INF文件中硬件ID 3 编译安装 以上三点不重复介绍 下面直接关注更新 增加的代码 在DeviceADD例程中添加 首先是增加即插即用管理 应该对应于WDM的
  • 内外网切换BAT脚本

    1 切换内网脚本 BAT脚本设置IP 子网掩码 网关 DNS echo off cls color 0A Echo Echo 正在修改IP地址和DNS服务器地址 请耐心等待 Echo cmd c netsh interface ip set
  • AntDesign 自定义图片上传前端压缩画质

    为什么压缩图片 应为现在公司没有使用云数据库 从而为了减少服务器的消耗需要将用户上传的图片压缩 前端压缩图片的技术选择 查阅资料发现当下两种压缩的方法 第一种使用工具库实现 npm install image conversion save
  • EXT4.2.0 + common-fileipload1.3 + 大文件上传(可达到20G)

    待续
  • npm 设置淘宝镜像

    查看当前镜像源 npm config get registry 在国外 受网速的影响的影响比较大 https registry npmjs org 1 配置 npm 为淘宝镜像 npm config set registry https r
  • 寒假小复习1

    1 java标识符 1 由数字 字母 构成 其中数字不能放在开头 2 java的关键字不能用为标识符 3 没有长度限制 注意区分大小写 package demo public class Demo public static final d
  • Vue数组对象,数组中多个对象将colorName值相同的合并

    这里使用到了Object values xx reduce prev cur index 方法 首先这个数据源是长这样的 需要的效果是长这样 代码 skuSizeData 是数据源 skuSizePropData 是在此之前我将所有的尺码进
  • QT事件循环与线程

    初次读到这篇文章 译者感觉如沐春风 深刻体会到原文作者是花了很大功夫来写这篇文章的 文章深入浅出 相信仔细读完原文或下面译文的读者一定会有收获 由于原文很长 原文作者的行文思路是从事件循环逐渐延伸到线程使用的讨论 译者因时间受限 暂发表有关
  • RSA简介

    什么是RSA RSA算法是应用最广泛的公钥密码算法 1977年 RSA算法由MIT的罗纳德 李维斯特 Ron Rivest 阿迪 萨莫尔 Adi Shamir 和伦纳德 阿德曼 Leonard Adleman 共同设计 于1978年正式发布
  • ==和equals

    对比的是栈中的值 基本数据类型是变量值 引用类型是堆中内存对象的值 equals object中默认也是采用 进行比较 通常会重写 String已经重写了equals方法 如下实际上是比较两个字符串中每一个字符的内容 public bool
  • 【C语言进阶】从一组数字中,找出只出现过一次的两个数字

    题目描述 有一组数字 只有两个数字出现过一次 其余数字都出现过两次 请找出只出现过一次的数字 举例 数组 1 2 3 4 6 1 2 3 4 8 输出 6 8 思路 这种题目是一种特定类型 形式1 一组数字 只有一个数字出现过一次 其余数字
  • webstrom 断点调试,小白详细步骤篇

    网上找了很久都是七零八落的 要么就是不够通俗易懂故作此文章记录和分享 设置debug调试 编辑器右上角点编辑配置 点击 号选js调试 url填你项目运行的url和端口 以及用于调试的浏览器 添加断点和运行测试调试 这里打上断点 点击右上角d
  • 应用服务器巡检,服务器巡检-常规检查项

    服务器巡检 常规检查项 由会员分享 可在线阅读 更多相关 服务器巡检 常规检查项 3页珍藏版 请在人人文库网上搜索 1 服务器巡检项目经理需要定期对硬件 软件及数据库环境进行检查常规检查项如下 1 服务器部分 l 服务器前面板有无故障灯闪烁
  • 帆软可以不可以生成文件到服务器_番禺街坊注意!微信发送高清大文件不压缩,网友:QQ可以卸载了?...

    刚上新了表情包的微信 又双叒叕出新功能了 这次的功能有点实用 昨天 腾讯微信团队宣布 微信已支持向朋友发送高清视频和图片 且不会被压缩 微信用户点击对话框右下角的 号 右滑点击文件 在上方选择手机相册 就能选择用户想要发送的视频和图片了 目
  • 为什么mybatisplus这么好用,反而用的不多?

    对会用的人来说 mybatis plus的wrapper非常好用 不再需要去关注dao层了 但是这需要一定的学习成本 而且不太符合经典的三层架构思维 对一些老前辈来说完全是违反常识的 很别扭 对他们来说 dao层还是拿在自己手里更踏实 给第
  • 【区块链与密码学】第6-9讲:数字签名算法的可证明安全性

    本课堂内容全部选编自PlatON首席密码学家 武汉大学国家网络安全学院教授 博士生导师何德彪教授的 区块链与密码学 授课讲义 教材及互联网 版权归属其原作者所有 如有侵权请立即与我们联系 我们将及时处理 6 9数字签名算法的可证明安全性 可
  • ResNet详解:ResNet到底在解决什么问题?

    原作者开源代码 https github com KaimingHe deep residual networks 论文 https arxiv org pdf 1512 03385 pdf 1 网络退化问题 在ResNet诞生之前 Ale
  • 2021-11-18 迈向程序猿的第三十一步

    目录 一 工具类的封装 二 ORM 三 Dao层的抽取 四 DateUtils 五 Service业务层 一 工具类的封装 问题 每次进行CRUD操作 都要写一套JDBC 很繁琐 解决方案 将重复的操作 抽取到工具类中封装 1 加载驱动只需