狂神说MyBatis01:第一个程序

1.简介

1.1 什么是MyBatis

  • MyBatis 是一款优秀的持久层框架
  • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程
  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数据库中的记录。
  • MyBatis 本是apache的一个开源项目ibatis, 2010年这个项目由apache 迁移到了google code,并且改名为MyBatis 。
  • 2013年11月迁移到Github .
  • Mybatis官方文档 : http://www.mybatis.org/mybatis-3/zh/index.html
  • GitHub : http://github.com/mybatis/mybatis-3

1.2 持久化

持久化是将程序数据在持久状态和瞬时状态间转换的机制。

  • 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
  • JDBC就是一种持久化机制。文件IO也是一种持久化机制。
  • 在生活中 : 将鲜肉冷藏,吃的时候再解冻的方法也是。将水果做成罐头的方法也是。

为什么需要持久化服务呢?那是由于内存本身的缺陷引起的

  • 内存断电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号等,遗憾的是,人们还无法保证内存永不掉电。
  • 内存过于昂贵,与硬盘、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也高,至少需要一直供电吧。所以即使对象不需要永久保存,也会因为内存的容量限制不能一直呆在内存中,需要持久化来缓存到外存。

1.3 持久层

什么是持久层?

  • 完成持久化工作的代码块 . ----> dao层 【DAO (Data Access Object) 数据访问对象】
  • 大多数情况下特别是企业级应用,数据持久化往往也就意味着将内存中的数据保存到磁盘上加以固化,而持久化的实现过程则大多通过各种关系数据库来完成。
  • 不过这里有一个字需要特别强调,也就是所谓的“层”。对于应用系统而言,数据持久功能大多是必不可少的组成部分。也就是说,我们的系统中,已经天然的具备了“持久层”概念?也许是,但也许实际情况并非如此。之所以要独立出一个“持久层”的概念,而不是“持久模块”,“持久单元”,也就意味着,我们的系统架构中,应该有一个相对独立的逻辑层面,专注于数据持久化逻辑的实现.
  • 与系统其他部分相对而言,这个层面应该具有一个较为清晰和严格的逻辑边界。【说白了就是用来操作数据库存在的!】

1.4 为什么需要Mybatis

  • Mybatis就是帮助程序猿将数据存入数据库中 , 和从数据库中取数据 .

  • 传统的jdbc操作 , 有很多重复代码块 .比如 : 数据取出时的封装 , 数据库的建立连接等等... , 通过框架可以减少重复代码,提高开发效率 .

  • MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping) -->对象关系映射

  • 所有的事情,不用Mybatis依旧可以做到,只是用了它,所有实现会更加简单!技术没有高低之分,只有使用这个技术的人有高低之别

  • MyBatis的优点

    • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件就可以了,易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
    • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
    • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
    • 提供xml标签,支持编写动态sql。
    • .......
  • 最重要的一点,使用的人多!公司需要!

2. 第一个Mybatis程序

思路流程:搭建环境-->导入Mybatis--->编写代码--->测试

2.1 搭建环境

1、搭建实验数据库

CREATE DATABASE `mybatis`;

USE `mybatis`;

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 insert into user values(1,'哇哈哈','123456'),(2,'zinc','aaaaaa'),(3,"zzz","zzzzzsss");

2、导入MyBatis相关 jar 包

  • GitHub上找
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

3、编写MyBatis核心配置文件

  • 查看帮助文档
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/zinc/dao/UserMapper.xml"/>
    </mappers>
</configuration>

4、编写MyBatis工具类

  • 查看帮助文档
package com.zinc.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;

//sqlSessionFactory
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {

        InputStream inputStream = null;
        try {
            String resource = "mybatis-config.xml";
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    //获取SqlSession连接
    public static SqlSession getSession(){
        return sqlSessionFactory.openSession();
    }
}

5、创建实体类

package com.zinc.pojo;
//实体类
public class User {
    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

6、编写Mapper接口类

package com.zinc.dao;
import com.zinc.pojo.User;

import java.util.List;

public interface UserDao {
    List<User> selectUser();
}

7、编写Mapper.xml配置文件

  • namespace 十分重要,不能写错!
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zinc.dao.UserDao">
    <select id="selectUser" resultType="com.zinc.pojo.User">
        select * from user
    </select>
</mapper>

8、编写测试类

  • Junit 包测试
package com.zinc.dao;

import com.zinc.pojo.User;
import com.zinc.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class test {
    @Test
    public void test(){
        //第一步:获取sqlSession对象
        SqlSession  sqlSession=MybatisUtils.getSession();

        //getmapper
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> userlist=mapper.selectUser();

        for (User user:userlist){
            System.out.println(user);
        }
        sqlSession.close();
    }
}

9、运行测试,成功的查询出来的我们的数据,ok!

image-20230328233842276

问题说明:

可能出现问题说明:Maven静态资源过滤问题

在子项目的pom.xml里面加入即可

   <build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
    </build>
本文转载于网络 如有侵权请联系删除

相关文章

  • windows10adb环境配置(adb shell命令)

    大家好,又见面了,我是你们的朋友全栈君。win10配置adb环境变量一、找到安装好的adb绝对路径高级系统设置—环境变量右键—属性—高级系统设置—环境变量 找到系统变量—Path点击进去 把刚才的adb路径复制到上面,新建—复制adb路径到上面 最后,windows+R—输入cmd—进入黑窗口—输入【adbversion】查看版本号,配置成功。 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127934.html原文链接:https://javaforall.cn

  • Python 如何将字符串转为字典?

    在自动化运维开发过程中,经常会遇到一个小需求:需要将一个字符串转为字典;这也就联想到,很多开发人员将表中的字段存储成字符串类型存储到MySQL数据表中,那么在从字段值到之后,势必要进行转化,这样更方便使用;注意:这里转换的前提是字符串格式符合JSON格式比如字符串:user_info=‘{“name”:“john”,“gender”:“male”,“age”:28}’我们想把它转为下面的字典:user_dict={“name”:“john”,“gender”:“male”,“age”:28}有以下几种方法:1、通过json来转换>>>importjson >>>user_info='{"name":"john","gender":"male","age":28}' >>>user_dict=json.loads(user_info) >>>user_dict {u'gender'

  • WebDriverIO教程:处理Selenium中的警报和覆盖

    在此有关Selenium中警报处理的WebDriverIO教程中,我将向您展示如何在WebDriverIO中处理警报和弹出窗口以及叠加模式。我还将介绍自动化期间将要遇到的各种类型的警报,以及使用WebDriverIO在Selenium中处理警报时需要遵循的关键点。WebDriverIO中的警报类型警报和弹出窗口在任何网站开发中都很常见,并且在执行Selenium测试自动化时,您也必须处理它们。这些警报或JavaScript警报会弹出,使您的注意力从当前的浏览器上移开,并迫使您阅读它们。如果您不知道如何处理警报,则将无法执行任何进一步的浏览器操作,这对于手动和自动都适用。重要的是要注意,您无法使用devtools或XPath来识别警报。另外,由于不能将它们作为窗口来处理,这就是为什么要处理它们有些棘手的原因,但是请不要担心,您可以在本WebDriverIo教程的后面部分中找到更多有关此的信息。WebDriverIO中需要处理三种警报。1、警报弹出 2、确认提示 3、提示弹出警报弹出窗口弹出警报或alert()方法将显示一个仅带有消息和“确定”按钮的警报框。该警报用于通知用户一些信息。信息

  • 【2020HBU天梯赛训练】7-28 搜索树判断

    借鉴柳神做法,不用生成树7-28搜索树判断对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。输入格式:输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。输出格式:输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES,否侧输出NO。如果判断结果是YES,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。输入样例1:7 865710811复制输出样例1:YES 576811108复制输入样例2:7 868510911复制输出样例2:NO复制边判断边把根存进去。后序遍历方法存入数组。使用isMirror进行两次判断。用根root和边界值尾下标tail进行判断是否满足搜索树条件。#include&l

  • ftp服务器的搭建

    结合这两个网址https://www.fenfa51.com/http://blog.sina.com.cn/s/blog_459ced7a0101ou76.html一:安装vsftpd查看是否已经安装vsftpdrpm-qa|grepvsftpd如果没有,就安装,并设置开机启动yum-yinstallvsftpdchkconfigvsftpdon二:基于虚拟用户的配置所谓虚拟用户就是没有使用真实的帐户,只是通过映射到真实帐户和设置权限的目的。虚拟用户不能登录CentOS系统。修改配置文件打开/etc/vsftpd/vsftpd.conf,做如下配置anonymous_enable=NO//设定不允许匿名访问local_enable=YES//设定本地用户可以访问。注:如使用虚拟宿主用户,在该项目设定为NO的情况下所有虚拟用户将无法访问chroot_list_enable=YES//使用户不能离开主目录ascii_upload_enable=YESascii_download_enable=YES//设定支持ASCII模式的上传和下载功能pam_service_name=vsftpd/

  • leetcode327. Count of Range Sum

    题目要求Givenanintegerarraynums,returnthenumberofrangesumsthatliein[lower,upper]inclusive. RangesumS(i,j)isdefinedasthesumoftheelementsinnumsbetweenindicesiandj(i≤j),inclusive. Note: AnaivealgorithmofO(n2)istrivial.YouMUSTdobetterthanthat. Example: Input:nums=[-2,5,-1],lower=-2,upper=2, Output:3 Explanation:Thethreerangesare:[0,0],[2,2],[0,2]andtheirrespectivesumsare:-2,-1,2.复制这道题目是指,现有一个整数数组,并输入上界值upper和下界值lower,问数组中一共有多少组连续的子数组,其子数组中数字的和在上界和下界之内。思路一:暴力循环我们可以首先遍历一遍数组,计算子数组下标[0,i)的所有元素的和。根据该结果可以计

  • weblogic下部署应用时slf4j与logbak冲突的解决办法

    今天在weblogic上部署一个使用logback的应用时,报错如下:java.lang.IllegalArgumentException:Invalid'logbackConfigLocation'parameter:/opt/app/Oracle/Middleware/user_projects/domains/base_domain/servers/Server7005/tmp/_WL_user/acc_service_ca/bk1axn/war/WEB-INF/lib/_wl_cls_gen.jar!/logback.xml网上搜索了一翻,大致原因是weblogic已经自带了slf4j的模块,与应用中的logback冲突,按照官网https://community.oracle.com/thread/3525130?start=0&tstart=0 的做法,在WEB-INF下放一个名为weblogic.xml的文件,参考以下内容:1<?xmlversion="1.0"encoding="UTF-8"?&g

  • 分布式锁的实现和应用场景_redis分布式锁释放锁

    大家好,又见面了,我是你们的朋友全栈君。分布式锁为了解决分布式场景下全局加锁的问题。在单体项目中可以使用synchronize完成对于不同线程之间的资源争抢问题。但是在分布式场景下,synchronize只能对其中一个项目进行资源控制,进程之间的资源增强仍然无法解距。换言之,可以将分布式锁理解为对于整个分不是系统的synchronize。通常使用独立与线程之外的工具控制资源,如redis及框架redisson。1.传统单体架构业务流程synchronized(this){ /**业务逻辑扣减库存*/ }复制以上代码对于单体架构可以控制库存问题2.使用redis的SetNX命令//业务开始前 //使用setnx在redis中设置一个key-value if(如果设置成功){ /**业务逻辑扣减库存*/ } //删除redis中的key复制上诉代码为简单的代码逻辑,在实际中可以使用try-finally的方式或自动过期时间保证锁一定会被删除。也可使用redisson框架代替方法2版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权

  • Unity 数据存储和读取的案例分享

    在Demo中分别使用这四种方法实现面板上数据的存储和读取创建一个Data脚本用来序列化和反序列化,需要向这个类中添加需要保存的数据,最后也是需要从这个类中读取保存的数据需要存储和读取数据的脚本Data1[System.Serializable]publicclassData{    //关卡/生命值/关卡得分    publicintlevels;    publicinthealth;    publicintscores;}向Data中存储和读取数据的方法2usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine; ///<summary>///数据管理///</summary>publicclassDataManager:MonoBehaviour{    //创建Data对象,并添加需要保存的数据    privateDataGetGameData()    {        Datadata=newData();        data.levels=CanvasM

  • java 从头开始学 第一天(基础概念)

    面向对象编程opp java是一个支持并发基于类和面向对象的计算机编程语言。 优点 1代码开发模块化,更易于维护和修改。 2代码复用。 3增强代码的可靠性和灵活性。 4增强代码的可靠性。   面向对象编程有很多重要的特性:封装,继承,多态和抽象。 1.封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变他内部的数据。在java当中,有3种修饰符:public,private和protected。每一种修饰符给其他的位于同一个包或者不同包下面向对象赋予不同的访问权限 封装的优点 通过隐藏对象的属性来保护对象内部的状态 提高代码的可用性和可维护性 因为对象的行为可以被单独的改变或者是扩展 禁止对象之间的不良交互提高模块化   2多态是编程语言给不同的底层数据类型做相同的借口展示的一种能力,一个多态类型上的操作可以应用到其他类型的值上面   3抽象是吧想法从具体的实例中分离出来的步骤,因此要更具他们的功能而不是实现细节来穿件类。java支持创建只暴露接口而不包含方法实现的抽象的类,这种抽象技术的主要目的是把类的行为和实现细节分离开

  • Lotus 客户端命令集合

      Lotus是Filecoin分布式存储网络的客户端(的golang实现)。 本文介绍Lotus的命令,在终端中执行命令用例格式如下: lotus[全局选项]命令[命令选项][参数…] 其中,[]内代表可选项。 全局选项有两个: [全局选项]说明 --help,-h 显示帮助(默认:false) --version,-v 打印版本(默认:false) 下面介绍命令和对应的命令选项: lotusdaemon命令 作用是启动Lotus守护进程,在终端中执行命令用例格式如下: lotusdaemon[命令选项][参数…] [命令选项][参数…]说明 --apivalue (默认值:“1234”) --genesisvalue 用于运行第一个节点的genesis文件 --bootstrap (默认值:true) --import-chainvalue 在第一次运行时,从给定文件加载链 --halt-after-import 从文件中导入链后暂停进程(默认:false) --pprofvalue 指定写入cpu性能测试文件的

  • restful 和 restframework

     一。restful     restful 没有语言限制,      一切皆资源:       通过请求方式知道要做什么操作比如(HTTPGET、POST、PUT(全局更新)/PATCH(局部更新)、DELETE,还可能包括HEADER和OPTIONS。)   restful(是一种协议,)一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。    RESTful的实现:RESTfulWeb服务与RPC样式的Web服务 了解了什么是REST,我们再看看RESTful的实现。使用RPC样式架构构建的基于SOAP的Web服务成为实现SOA最常用的方法。RPC样式的Web服务客户端将一个装满数据的信封(包括方法和参数信息)通过HTTP发送到服务器。服务器打开信封并使用传入参数执行指定的方法。方法的结果打包到一个信封并作为响应发回客户端。客户端收到响应并打开信封。每个对象都有自己独特的方法以及仅公开一个URI的RPC样式Web服务,URI表示单个端

  • Golang 编译Mac、Linux、Windows多平台可执行程序

    https://blog.csdn.net/luolianxi/article/details/105848036 *********************************************************************** 1.MacMac下编译Linux,Windows平台的64位可执行程序:CGO_ENABLED=0GOOS=linuxGOARCH=amd64gobuildtest.goCGO_ENABLED=0GOOS=windowsGOARCH=amd64gobuildtest.go2.LinuxLinux下编译Mac,Windows平台的64位可执行程序:CGO_ENABLED=0GOOS=darwinGOARCH=amd64gobuildtest.goCGO_ENABLED=0GOOS=windowsGOARCH=amd64gobuildtest.go3.WindowsWindows下编译Mac,Linux平台的64位可执行程序:SETCGO_ENABLED=0SETGOOS=darwin3SETGOARCH=amd64gobuildma

  • JMS学习(三)JMS 消息结构之属性及消息体详解

    一、前言   通过上一篇的学习我们知道了消息分为三个部分,即消息头,属性及消息体,并对消息头的十个属性进行了详细的介绍,本文再对消息属性及消息体进行详细的介绍。 二、属性介绍   消息属性的主要作用是可以对头信息进行一个额外的补充,毕竟消息头信息一是有限,二是很多不能由应用程序设定。通常,消息属性可以用在消息选择器的表达式里,结合起来实现对消息的过滤。   消息属性的值只能是基本的类型,或者这些基本类型对应的包装类型。也就是说,不能将一个自定义的对象作为属性值。通常情况下,如果能够放在body里的内容,就不必放在消息属性里。   消息属性按类型可以分为标准属性(JMSX作为前缀),消息组件自定义的属性(JMS_作为前缀),以及应用自定义的属性。自定义的属性不要以前面两种为前缀。  标准的JMSX属性如下表:      其中,JMSXGroupID和JMSGroupSeq是客户端可以设置的。消息的属性一旦设置,且消息发送后,就会变成只读的,将不能再被修改。   跟头信息的设置不同的是,对于这些标准属性,JMS

  • 第四章 树和二叉树

    二叉链表的类型定义——教材101页 typedefstructbtnode {   DataTypedata;   structbtnode*lchild,*rchild;//指向左右孩子的指针 }*BinTree; 三叉链表的类型定义——教材102页 typedefstructttnode {   DataTypedata;   structttnode*lchild,*parent,*rchild;//在二叉链表的基础上多了一个指向双亲的指针 }*TBinTree; TBinTreeroot; 二叉链表的三种遍历的递归算法 1先序遍历-根,左,右 voidpreorder(BinTreebt) {   if(bt!=NULL)   {     visit(bt);//根     preorder(bt->lchild);//左     preorder(bt->rchild);//右   } } 2中序遍历-左,根,右 voidpreorder(BinTreebt) {   if(bt!=NULL)   {         inorder(bt->lchild);

  • app崩溃后自动重启

    android 引用:http://blog.csdn.net/caiwenfeng_for_23/article/details/41184353 packagecom.tan.abnormalrestart; importjava.lang.Thread.UncaughtExceptionHandler; importandroid.app.Application; importandroid.content.Intent; publicclassAppContextextendsApplication { protectedstaticAppContextinstance; publicvoidonCreate(){ super.onCreate(); instance=this; Thread.setDefaultUncaughtExceptionHandler(restartHandler);//程序崩溃时触发线程以下用来捕获程序崩溃异常 } //创建服务用于捕获崩溃异常 privateUncaughtExceptionHandlerrestartHandler=newUnc

  • aws申请ec2实例后如何用root用户登录

    ec2默认禁用root用户登录,我们创建ec2实例后如何知道使用什么用户登录,有两种方法?复制 方法一:根据我们选择的镜像来判断用什么用户登录:镜像:centos  用户centos镜像:aws    用户:ec2-user镜像:ubuntu  用户:ubuntu复制 方法二:不知道是什么镜像,那我们就默认使用root用户,在ssh连接的时候会提示:请使用xx用户登录,禁用root用户登录复制 案例: 镜像:centos     当我们使用centos用户登录时怎么修改使用root用户登录复制 第一步:   设置root密码(为什么要设置root密码,我们初始化实例的时候使用的是密钥对,只有设置root密码后才可以切换用户,默认不知道root的密码是什么)复制      [ec2-user@ip-172-31-33-45~]$sudopasswdroot      Changingpasswordforuserroot.      Newpassword:      Retypenewpassword:     passwd:allauthenticationtoken

  • CAC的Debian-8-64bit安装BBR正确打开方式

    装过三台debian64bit,CAC,2欧,KVM虚拟机 做法都一样---下面说下正确安装方式   0.有装锐速记得先删除,免得换核心后,锐速在扯后腿。   1.换4.9版kernel有正式版別装啥rc版,4.9是LTS(LongTermSupport),稳定性杠杠的。 debian864bit可装ubuntu核心,自己编译会哭,cac不理想。。。 wgethttp://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9/linux-image-4.9.0-040900-generic_4.9.0-040900.201612111631_amd64.deb   2.安装 dpkg-ilinux-image-4.9.0*.deb   3.删旧核心(不刪也行,用grub调整),我是直接刪 dpkg-l|greplinux-image 这边注意一下,应该会至少有3个,除了4.9刚装的以外,大概会有以下两组,全看你原本用啥核心 root@localhost:~#dpkg-l|greplinux-image

  • CodeReview 规范

    目标和原则 提高代码质量,及早发现潜在缺陷,降低修改/弥补缺陷的成本 促进团队内部知识共享,提高团队整体水平 评审过程对于评审人员来说,也是一种思路重构的过程,帮助更多的人理解系统 是一个传递知识的手段,可以让其它并不熟悉代码的人知道作者的意图和想法,从而可以在以后轻松维护代码 可以被用来确认自己的设计和实现是一个清楚和简单的 鼓励相互学习对方的长处和优点 高效迅速完成CodeReview   CodeReview的步骤 代码编写者和代码审核者坐在一起,由代码编写者按照UC依次讲解自己负责的代码和相关逻辑,从Web层->DAO层; 代码审核者在此过程中可以随时提出自己的疑问,同时积极发现隐藏的bug;对这些bug记录在案。 代码讲解完毕后,代码审核者给自己安排几个小时再对代码审核一遍。代码需要一行一行静下心看。同时代码又要全面的看,以确保代码整体上设计优良。 代码审核者根据审核的结果编写“代码审核报告”,“审核报告”中记录发现的问题及修改建议,然后把“审核报告”发送给相关人员。 代码编写者根据“代码审核报告”给出的修改意见,修改好代码,有不清楚的地方可积极向代码审

  • 填坑备忘录(二)

    2019年填坑备忘录(二) 1.css隐藏滚动条 场景:做tab滑动效果时,可采用css的溢出滚动实现,但怎么隐藏掉那个自带的滚动条呢? 解决办法:.inner-container::-webkit-scrollbar{display:none;} 关键代码:::-webkit-scrollbar{display:none;} 2.移动端点击链接触发颜色块 场景:但移动端有点击事件,点击的瞬间会有一个色块,长按也会出现。 解决办法:在html样式下加入-webkit-tap-highlight-color:rgba(0,0,0,0); 关键代码:-webkit-tap-highlight-color:rgba(0,0,0,0); 3.js倒计时切换窗口时间偏差 场景:现在浏览器,除了ie8及以下的浏览器,当你切换标签页面时,浏览器会自动清除本页面的js缓存 解决办法:```document.addEventListener("visibilitychange",function(){ if(document.hidden){ //这里写切换到后台的时候要保存的东西 }else{ /

  • Java 架构笔记整理(P6+)

    开通语雀(云端知识库),关注我的云笔记:《架构笔记》,文章内容更新,更全。   1. Java 核心技术   1.1. 基础知识     1.1.1. 进制转换     1.1.2. 异常处理     1.1.3. List分批代码     1.1.4. 字符串分割     1.1.5. 编码风格   1.2. 并发编程     1.2.1. 参考文章     1.2.2. 并发编程基础     1.2.3. 线程的安全性问题     1.2.4. 处理器内存模型     1.2.5. Java 内存模型(JMM)     1.2.6. volatile关键字     1.2.7. synchronized关键字     1.2.8. waitnotify     1.2.9. Lock     1.2.10. 同步器使用     1.2.11. 同步器原理分析    

相关推荐

推荐阅读