2020 10.27曾宇欣

心得体会:

找到工作很开心,但是不能把学习给落下了。

做了几道基础编程题,感觉还是有难度。

知识点:

总结:

建库

  • 创建数据库

    create database if not exists db_name;
    create database db_name;
    
  • 使用数据库

    use db_name;
    
  • 删除数据库

    drop database db_name;
    

创建表

  • 创建表

    create table tab_name(
    col_name data_type dafault null/number comment '注释',
    col_name data_type
    )character set 编码格式;
    create table dept(
    deptno int default 1,
    deptname varchar(20)
    )character set utf8;
  • 查看表结构

    describe dept;
    
  • 创建和某表一样的结构的表

    create table d like dept;
    
  • 删除表

    drop table table_name;
    
  • 添加列

    alter table d add id int;
    
  • 修改列

    alter table d modify id varchar(20);
    
  • 修改列名

    alter table d change id ss varchar(20);
    
  • 删除列

    alter table d drop ss;
    
  • 重命名表

    rename table d to dd;
    

CRUD操作(增删查改)

  • 添加数据

    -- 不推荐
    insert into dept value(1,'研发部');
    -- 2
    insert into dept values(2,'销售部'),(3,'技术部');
    -- 3
    insert into dept(deptno,deptname)values(5,'安保部');
  • 查询数据

    -- 查询所有数据
    select *from dept;
    -- 查询某列的数据
    select deptname from dept;
    -- 根据条件查询*
    select deptno from dept where deptname='销售部';
  • 修改数据

    -- 全部修改为6
    update dept set deptno=6;
    -- 根据条件修改
    update dept set deptno=1 where deptname='销售部';
  • 删除数据

    -- 删除数据, 一定要加where
    delete from dept where deptno=5;
    -- 全部删除
    delete from dept;
  • 创建主键

    -- 创建表时
    create table tb_name(
    col_name int primary key,
    col_name1 varchar(20)
    );
    -- 创建表时第二种
    create table tb_name(
    col_name1int,
    col_name varchar(20),
    primary key(col_name1)
    );
    -- 创建表时设置复合主键
    create table tb_name(
    col_name1 int,
    col_name2 varchar(20),
    primary key (col_name1,col_namee2)
    );
    -- 修改表时添加主键
    alter table tb_name add primary key(col_name);
  • 自增长列

    CREATE TABLE emp(
      empNo INT PRIMARY KEY AUTO_INCREMENT,
    job VARCHAR(10),
    mgr INT,
    sal DOUBLE,
    comm DOUBLE, deptno INT
    )CHARACTER SET utf8;

    一、内部类基础

    在java中,可以将一个类定义在 另一个类里面 或者 方法 里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类,局部内部类,匿名内部类和静态内部类。

    1. 成员内部类:

      成员内部类是最普通的内部类。它的定为位于另外一个类中。

      class Circle{
       private double radius = 0;
      static int count = 1;

      public Circle(double radius){
      this.radius = radius;
      }

      class Draw{ //内部类
      public void drawShape(){
      System.out.print("drawshape");
      System.out.print(radius);
      System.out.print(count);
      }
      }
      }

      这样看起来,类Draw像是Circle的一个方法,Circle称为外部类。成员内部类可以无条件访问外部类所有成员属性和成员方法(包括private成员和静态成员)。

      如果,当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的时成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问。

      外部类.this.成员变量
      外部类.this.成员方法
      

      虽然成员内部类可以无条件访问外部类的成员,而外部类想访问成员内部类的成员却不能随便访问,必须先创建一个成员内部类的对象,而通过指向这个对象的引用。

      class Circle{
       private double radius = 0;
      static int count = 1;

      public Circle(double radius){
      this.radius = radius;
      getDrawShape().drawShape(); //第一种调用方式
      }

      public Draw getDrawShape(){
      return new Draw();
      }

      class Draw{ //内部类
      public void drawShape(){
      System.out.print("drawshape");
      System.out.print(radius);
      System.out.print(count);
      }

      Public static void main(String[] args){
      Circle c = new Circle();
      c.getDrawShape().drawShape(); // 第二种调用方式

      }
      }
      }

      内部类可以有private访问权限、protect 访问权限、public访问权限以及包访问权限。个人理解:成员内部类看起来像一个外部类的成员,所以可以想类的成员一样拥有多种权限修饰符。

    2. 局部内部类

      局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问权限在于方法内或者该作用域内。

      class People{
       public People{}
      }
      class Man{
      public Man(){}

      public People getWoman(){
      class Woman extends People{
      int age = 0;
      }
      return Woman;
      }
      }

      注意 局部内部类就像是方法里面的一个局部变量一样,是不能有public、protect、以及static修饰的

    3. 匿名内部类

      匿名内部类应该是平常我们写代码用的最多的了,在编写实践监听的时候使用匿名内部类不但方便,而且会使代码更加方便维护。

      scan_bt.setOnClickListener(new OnClickListener() {
                
      @Override
      public void onClick(View v) {
      // TODO Auto-generated method stub

      }
      });

      history_bt.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
      // TODO Auto-generated method stub

      }
      });

      这段代码为两个按钮设置了监听器,这里面就使用了匿名内部类,这段代码中:

      new OnClickListener() {
                
      @Override
      public void onClick(View v) {
      // TODO Auto-generated method stub

      }
      }

      就是匿名内部类的使用。代码中需要给按钮设置监听器对象,使用匿名内部类能够在实现父类或者接口中的方法情况下同时产生一个相应的对象,但是这个前提是这个父类或者接口必须先存在才能这样使用。下面这种写法也是可以的,和匿名内部类的效果相同。

      private void setListener()
      {
      scan_bt.setOnClickListener(new Listener1());
      history_bt.setOnClickListener(new Listener2());
      }
      class Listener1 implements View.OnClickListener{
      @Override
      public void onClick(View v) {
      // TODO Auto-generated method stub

      }
      }
      class Listener2 implements View.OnClickListener{
      @Override
      public void onClick(View v) {
      // TODO Auto-generated method stub

      }
      }

      这种写法达到的效果一样,但是冗长难以维护,所以一般使用匿名内部类的方法来编写事件的监听,同样的匿名内部类也不能有访问修饰符以及static来修饰。

      匿名内部类是唯一一种没有构造器的类。正因为没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class 。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

    4. 静态内部类

      静态内部类也是定义在一个其他类中的类。只不过在类的前面加了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部的非static成员变量或者方法。因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。

      public class Test {
       public static void main(String[] args)  {
      Outter.Inner inner = new Outter.Inner();
      }
      }
      class Outter {
      public Outter() {

      }

      static class Inner {
      public Inner() {

      }
      }
      }

    二、深入理解内部类

    1. 为什么成员内部类可以无条件访问成员类的变量?

      当我们反编译字节码文件的时候,会将成员内部类单独编译成一个字节码文件。

      反编译时我们可以发现,内部类的文件中有一个指向外部类的指针。

    三、内部类的使用场景和好处

    1. 每个内部类都能独立的继承一个接口的实现。无论外部类是否已经继承了某个接口实现,对于内部类都没有影响。内部类使得多继承解决方案变得完整。
    2. 方便将存在一定的逻辑关系的类组织在一起,又可以对外界隐藏。
    3. 方便编写事件驱动程序
    4. 方便编写线程代码

    新知识:

    在MySQL中,只要不是查询就是修改。 executeUpdate:用于执行增删改 executeQuery:用于

    执行查询

Statement stat = conn.createStatement();//用来执行sql语句
stat.executeUpdate(sql);
ResultSet resultSet = stat.executeQuery(sql);//用来查询
ResultSet resultSet = stat.executeQuery(sql);
ResultSetMetaData rsmd = resultSet.getMetaData();//用来修改数据

事务的创建,事务的提交,事务的回滚

标签

评论

this is is footer