第六周总结

11-28

1.UDP发送端可以不断键盘录入数据,接收端不断展示数据,发送端可以自定义结束条件

package com.qf.text1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

//1.UDP发送端可以不断键盘录入数据,
// 接收端不断展示数据,发送端可以自定义结束条件 (课堂练习)
public class UdpSend {
    public static void main(String[] args) {
        //udp发送端可以不断键盘录入数据
        //创建发送端的socket
        DatagramSocket ds=null;
        try{
            ds=new DatagramSocket();
        //键盘录入可以使用BufferedReader--->读一行
            BufferedReader br=new BufferedReader(
                    new InputStreamReader(System.in));
            String line=null;
            //一次读一行内容
            System.out.println("请你输入一个数据:");
            while ((line= br.readLine())!=null){
                //输入over,结束程序
                if ("over".equals(line)){
                    break;
                }
                //创建数据报包,将数据存储在数据包中
                DatagramPacket dp = new DatagramPacket(line.getBytes(),
                        line.getBytes().length,
                        InetAddress.getByName("10.35.162.122"),
                        3333);
                //发送数据报包
                ds.send(dp);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (ds!=null){
                ds.close();
            }
        }
    }
}
package com.qf.text1;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

//接收端不断接收数据
public class UdpReceive {
    public static void main(String[] args) {
        //创建socket对象
        try{
            DatagramSocket ds=new DatagramSocket(3333);
            while (true){
                //创建一个接收容器
                //自定义一个字节数组缓冲去
                byte[] buffer=new byte[1024];
                int bufferLength=buffer.length;
                DatagramPacket dp=new DatagramPacket(buffer,bufferLength);
                //接收数据容器
                ds.receive(dp);
                //读取接收容器中的真实内容

                byte[]bytes= dp.getData();
                int length = dp.getLength();
                //每次从0开始读取字节数---转成String
                String receiveMsg=new String(bytes,0,length);
                //获取ip地址字符串
                String ip=dp.getAddress().getHostAddress();
                //展示数据
                System.out.println("数据来自:"+ip+",接收到:"+receiveMsg);
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.TCP客户端和服务端的代码实现

1.)TCP 客户端使用步骤

创建客户端的Socket对象,指定ip和接口

获取客户端通道内字节输入流对象,写数据

释放资源

package com.qf.text2;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class TcpClientDemo {
    public static void main(String[] args) throws IOException {
        //创建Socket对象,指定ip和端口
        Socket s=new Socket("10.35.162.122",2222);
        //获取客户端通道内容字节输入流对象,写数据
        OutputStream outputStream = s.getOutputStream();
        outputStream.write("hello,TCP我来了!".getBytes());
        //客户端获取通道内字节输入流对象,读服务器端的反馈的数据
        InputStream inputStream= s.getInputStream();
        byte[]bytes=new byte[1024];
        int length= inputStream.read(bytes);
        //转换成字符串类型
        String fkMsg=new String(bytes,0,length);
        System.out.println(fkMsg);
        //释放资源
        outputStream.close();

    }
}

2.)TCP服务器端的代码实现

创建服务器端的Socket

监听客户端的连接

获取监听到的客户端的通道内的字节输入流对象,读数据

释放服务器端的资源

package com.qf.text2;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

//服务器端
public class TcpServerDemo {
    public static void main(String[] args) throws IOException {
        //创建Socket对象
        ServerSocket ss=new ServerSocket(2222);
        System.out.println("服务器正在等待客户端连接请求...");
        //监听客户端的连接
        //阻塞方法,没有客户端连接,一直等待
        Socket socket = ss.accept();
        System.out.println("客户端已经连接");
        //获取监听到的字符流对象,读数据
        InputStream in=socket.getInputStream();
        //一次读取一个数组
        byte[]bytes=new byte[1024];
        int length=in.read(bytes);
        //转换成String
        String receiveMsg=new String(bytes,0,length);
        //获取IP地址对象,同时ip地址字符串形式
        String ip=socket.getInetAddress().getHostAddress();
        System.out.println("数据来自:"+ip+",接收到:"+receiveMsg);
        OutputStream outputStream=socket.getOutputStream();
        //反馈
        outputStream.write(bytes);
        //释放资源
       ss.close();

    }
}

3.TCP三次握手原理--->SYNC+ACK

SYNC同步序列编号

ACK:消息确认字符(当客户端发送数据到服务器端,服务器需要确认并反馈)

4.TCP的应用

4.1TCP方式,客户端可以不断键盘录入数据,服务器端不断展示数据

public class TcpClient {
    public static void main(String[] args) throws IOException {
        //1)创建客户端Socket
        Socket socket  = new Socket("10.35.162.121",8888) ;

        //2)可以创建BufferedReader 一次读取一行,录入数据
        BufferedReader br=  new BufferedReader(new InputStreamReader(System.in)) ;
        //获取通道字节输出流对象,写数据--->字节输出流---->包装字符流
        OutputStream out = socket.getOutputStream();
        //可以使用字符流把上面的通道内的字节数出流包装
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out)) ;
        String line = null ;
        while((line=br.readLine())!=null){
            /*if("886".equals(line)){
                break;
            }*/
            //录入一行,给封装到通过的字符流写一行进去
            bw.write(line) ;
            bw.newLine();
            bw.flush();
        }

        socket.close();

    }
}
public class TcpServer {
    public static void main(String[] args) throws IOException {

        //创建服务器端的Socket
        ServerSocket ss = new ServerSocket(8888) ;
        System.out.println("服务器正在等待连接");
       // int i= 0 ;
        while (true){//监听多个客户端了解
         //   i++;
            //监听客户端连接
            Socket socket = ss.accept();
          //  System.out.println("第"+i+"个客户端已连接");
            //获取监听客户端所在的通道内的字节输入流
            InputStream in = socket.getInputStream();
            //将桶内的字节输入流封装成字符流读
            BufferedReader br = new BufferedReader(new InputStreamReader(in)) ;
            //一次读取一行
            String line = null ;
            while((line=br.readLine())!=null){
              if("886".equals(line)){
                  break;
              }
                System.out.println(line) ;//展示数据
            }
        }

        //模拟真实场景,服务器端不关

    }
}

4.2 TCP客户端的读取文本文件(将文本文件写入通道中)_,

服务器端复制文本文件到指定路径中(将文本文件写入指定文件中)

package com.qf.text3;

import java.io.*;
import java.net.Socket;

//	3)TCP客户端图片文件,服务器端对图片文件复制
public class TcpClientDemo {
    //客户端
    public static void main(String[] args) throws IOException {
        //创建客户端的socket对象
        Socket socket=new Socket("10.35.162.122",2222);
        //创建字符缓冲流输入对象
        BufferedReader br=new BufferedReader(new FileReader("夕阳.jpg"));
        //创建客户端通道的字节输出流---->包装成BufferWriter:字节缓冲输出流
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        //读取
        String line=null;
        while ((line= br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        socket.shutdownOutput();
        //客户端读取并反馈数据
        //获取通道内的字节输出流
        InputStream inputStream=socket.getInputStream();
        //读取一个字节数组的方式
        byte[] bytes=new byte[1024];
        int len=inputStream.read(bytes);
        System.out.println("客户端接受到了反馈数据"+new String(bytes,0,len));
        //释放资源
        br.close();
        bw.close();
    }
}
package com.qf.text3;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpSeverDemo {
    //服务端
    public static void main(String[] args) throws IOException {
        //创建服务器端的Socket对象
        ServerSocket ss=new ServerSocket(2222);
        Socket s= ss.accept();
        BufferedReader br=new BufferedReader(
                new InputStreamReader(s.getInputStream())
        );
        BufferedWriter bw=new BufferedWriter(new FileWriter("E:\\idea_project\\day31\\copy.jpg"));
        String line=null;
        while ((line= br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        OutputStream out =s.getOutputStream();
        out.write("hello,文件复制完毕".getBytes());
        out.flush();
        bw.close();
        ss.close();

    }
}

4.3 TCP客户端读取文本文件,服务器端复制文本文件,现在服务器端反馈给客户端,"已经复制完毕"

public class Tcp_ClientTest2 {
    public static void main(String[] args) throws IOException {
        //创建客户端的Socket对象
        Socket s = new Socket("10.35.162.121",2222) ;
        //创建字符缓冲输入流对象
        BufferedReader br = new BufferedReader(
                new FileReader("UdpReceive.java")) ;

        //获取客户端通道的字节输出流---->包装成BufferedWriter:字符缓冲输出流
        BufferedWriter bw = new BufferedWriter(
                new OutputStreamWriter(s.getOutputStream())) ;

        //每次从.java文件读取一行,给通道流的流中写一行
        String line = null ;
        while((line=br.readLine())!=null){//阻塞式方法.一直等待为null文件完毕
            bw.write(line) ;
            bw.newLine();
            bw.flush();
        }

        //写一个数据
        //通道内的流写一句
       /* bw.write("over");
        bw.newLine();
        bw.flush();*/


        //方案2: public void shutdownOutput()   throws IOException
        s.shutdownOutput();


        //客户端要读取服务器反馈数据
        //获取通道内的字节输入流
        InputStream inputStream = s.getInputStream();
        //读取一个字节数组
        byte[] bytes = new byte[1024] ;
        int len = inputStream.read(bytes);
        System.out.println("客户端接收到了反馈数据:"+new String(bytes,0,len));


        //释放资源
        br.close();
        s.close();
    }

}
public class Tcp_ServerTest2 {
    public static void main(String[] args) throws IOException {
        //创建服务器端的Socket对象
        ServerSocket ss = new ServerSocket(2222) ;
        //监听客户端连接
        Socket s = ss.accept();
        //获取监听客户端所在的通道内字节输入流对象---->包装成字符缓冲输入流
        BufferedReader br = new BufferedReader(
                new InputStreamReader(s.getInputStream())) ;

        //将监听客户端的通道内的字节流(已经被包装了字符缓冲输入流)的内容----通过的字符缓冲输出流写入到文件中
        BufferedWriter bw = new BufferedWriter(
                new FileWriter("D:\\EE_2211\\day27_code_resource\\copy.java")) ;
        //一次读取一行,写一行到文件中
        String line = null ;
        while((line=br.readLine())!=null){//阻塞式,null也是表示客户端的通道内的字节输入流读完了

          /*  if("over".equals(line)){
                break;
            }*/
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        //加入反馈,服务器端反馈给客户端数据
        //获取字节输出流,写
        OutputStream out = s.getOutputStream();
        out.write("hello,文件复制完毕".getBytes());
        out.flush();

        //释放资源
        bw.close();
        ss.close();


    }
}

5.反射

反射获取构造器并创建当前类实例

public class Person {
    private String name ; //私有的成员班里
    public int age ; //年龄
    String gender ; //性别

    //构造方法
    public Person(){}//无参构造方法
    private Person(String name,int age){
        this.name = name ;
        this.age = age ;
    }
    Person(String name,int age,String gender){
        this.name = name ;
        this.age = age ;
        this.gender = gender ;
    }

    //成员方法
    //没有返回值,无参
    public void show(){
        System.out.println("show Person");
    }
    //没有返回值,带参
    private void method(String str){
        System.out.println(str);
    }
    //有返回值.不带参
    private String function(){
        return "helloJavaEE" ;
    }
    //有返回值,带参
     String myFunction(int num){
        return "今晚韩国对阵加纳总球数是"+num ;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

通过反射方式获取类的字节码文件之后,创建当前类对象!

1.)获取类的字节码文件

2.)获取类的Constructor所在的构造器对象

3.)通过它创建当前类的实例

public class ReflectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //之前的写法:通过无参构造方法创建对象
        //类名 对象名  = new 类名() ;
       // Person person = new Person() ;
       // System.out.println(person);
        System.out.println("-----------------------------------------------");

        //通过反射获取构造器(Constructor)对象--->创建当前类实例
        //1)获取类的字节码文件对象
        Class clazz = Class.forName("com.qf.reflect_06.Person") ;
        //2)获取类的Constructor所在的构造器对象
       // public Constructor<?>[] getConstructors()获取这个类中所有的公共的构造函数
       // Constructor[] constructors = clazz.getConstructors();
        //public Constructor<?>[] getDeclaredConstructors()获取这个类中所有的构造函数
       /* Constructor[] constructors = clazz.getDeclaredConstructors();
        for(Constructor con:constructors){
            System.out.println(con);
        }*/

        //2)获取指定的构造方法所在的Constructor类对象
        //public Constructor<T> getConstructor(Class<?>... parameterTypes)
        //获取指定的公共的构造方法所在Constructor实例,参数--->参数类型的Class字节码文件对象
        //参数是String----->String.class----结果 java.lang.String
        Constructor con = clazz.getConstructor();// clazz.getConstructor(String.class)
        //System.out.println(con);
        //3)通过它创建当前类实例
        //public T newInstance(Object... initargs):参数就给构造函数中参数进行实际赋值
        Object obj = con.newInstance();
        System.out.println(obj);

    }
}

给成员赋值

public class ReflectDemo3 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {

        //Person p = new Person("高圆圆",44) ;  //之前的代码不行,私有构造方法不能new
        //现在反射方式通过构造方法赋值
        //1)获取当前类的字节码文件对象
        Class clazz = Class.forName("com.qf.reflect_06.Person");
        //2)获取构造器Constructor类对象--->带两个参数的
        //public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
        //参数里面是参数类型的字节码文件对象
        Constructor con = clazz.getDeclaredConstructor(String.class, int.class);
       // System.out.println(con);//private com.qf.reflect_06.Person(java.lang.String,int)

        //AccessibleObject类提供Field(成员变量的类对象)/Method(成员方法类对象)/Constructor(构造器类对象)的基类
        //提供功能:取消Java语言访问检查,暴力访问
        //public void setAccessible(boolean flag) true:就是抑制Java语言访问检查功能
        con.setAccessible(true);

        //通过它创建当前类实例
        Object obj = con.newInstance("高圆圆", 44);//IllegalAccessException:当前构造器私有不能访问
        System.out.println(obj);
    }
}

反射获取成员方法并调用

public class ReflectDemo4 {
    public static void main(String[] args) throws Exception {
        //之前的写法
       // Person p = new Person();
        //p.show() ;
        System.out.println("----------------------------------");

        //反射的写法
        //1)获取类的字节码文件对象
        Class clazz = Class.forName("com.qf.reflect_06.Person") ;



        //2)通过无参构造器创建器Constructor创建当前类实例
        //如果你这个类没有提供任何构造方法(系统提供无参)或者无参构造方法是公共的---->此时可以直接使用Class类的newInstacne()创建当前类实例
        //等价于下面这个写法
        Object obj = clazz.newInstance();
        System.out.println(obj);
        //System.out.println(obj);

        /*Constructor con = clazz.getConstructor();
        Object obj = con.newInstance() ;*/
       // System.out.println(obj);


        // Method getMethods() ;//获取本类中所有的成员的method
        // Method getDeclaredMethods() ;//获取本类中所有的成员的method以及父类的Object

        //3)获取指定的成员方法所在的Method类对象
       // public Method getDeclaredMethod(String name, Class<?>... parameterTypes)获取指定的成员方的method类对象
       // public Method getMethod(String name, Class<?>... parameterTypes):获取指定的公共的成员方法的Method对象
       //第一个参数都是方法名
        //第二个参数是可变参数,方法的形式参数类型的Class(字节码文件对象)

        Method method = clazz.getMethod("show");//方法本身就是空参
        System.out.println(method);
        //调用方法,Method类---提供的invoke
        //public Object invoke(Object obj, Object... args)
        //第一个参数:当前类实例
        //第二个参数:给方法的形式参数赋的实际参数
        //调用方法到时候将指定的方法实际参数作用在当前类实例上
        method.invoke(obj) ; //本身这个方法没有返回值,单独调用

        System.out.println("----------------------------------------------------------");
        /**
         * 反射调用这个
         * private void method(String str){
         *         System.out.println(str);
         *     }
         */
        Method m1 = clazz.getDeclaredMethod("method", String.class);
       // System.out.println(m1);//private void com.qf.reflect_06.Person.method(java.lang.String)
        //私有方法取消Java语言检查
        m1.setAccessible(true) ;
        m1.invoke(obj,"hello,高圆圆") ;


    }
}

11-29

1.什么是数据库?

数据库就是存储数据的一种仓库!

早期存储数据---->临时变量(局部变量)---->随着方法调用而存在,随着方法调用结束而消失

后面-------->成员变量(非静态) ----->随着方法对象的创建而存在,随着对象的创建完毕等待垃圾回收器回收而消失 容器---->数组---->长度固定(弊端) 

--->StringBuffer--->字符串缓冲区存储各种字符序列,它长度可变,但StringBuffer使用完毕等待回收

--->集合--->长度可变,它可以存储任何引用类型的数据,使用完毕--->也要被回收掉

--->IO流--->永久存储,但是IO流太耗时了

数据库存储数据

1.)存储空间非常大,用户可以对数据库中的内容进行增删查改

2.)数据独立性高

3.)实现数据共享

4.)减少数据的冗余度

5.)通过数据库里面的"事务"--->实现数据的一致性以及维护性;

2.市面上常见的数据库

关系型数据库

MySQL,SqlSever,Oracle,MariaDB

非关系型数据库

Redis,Memcache,MongoDb,HBase

3.DDL语句的基础语法---库的操作

1.)查询所有库  show databases;

2.)创建库

create  database  if not  exists  库名;如果没有这个库,则创建库

直接创建库   create  database  库名;

3.)查询指定库的信息--包括它的字符集

show  create database  库名;

4.)修改库的字符集

alter  database  库名  default  character set  字符集格式;

5.)删除库

drop database if exists   库名;如果存在库名,则删除

drop database  库名;直接删除库

4.DDL语句的基础语法---表的操作 

创建表的前提----->必须使用库(库就是文件夹)

use   库名;

mysql常见的数据类型

int   varchar(字符长度)  date:日期类型--->仅仅表示日期

datetime:日期+时间

timestap:修改时间数据

double:小数类型

clob:大字符类型,某个表中某个字段--->使用clob来存储大文本!

blob:大字节类型:存储大图片文件--->大字节类型

查询库中有那些表

show tables;

创建表的语法
create table  表名(

字段名称1   字段类型1,

字段名称2,字段类型2

);

查询表的结构

desc 表名;

修改表的字段类型

alter  table  表名  modify 字段名称  修改后字段类型;

修改字段名称

alter  table  表名 change  以前的字段名称  现在的字段名称  以前的字段类型;

修改表--->添加一个新的字段

alter  table  表名  add  字段名称  字段类型;

修改表---删除表中某个字段

alter  table  表名  drop  字段名称;

修改表名

alter  table  表名 rename  to 新表名;也可以rename table 以前表名  to  新表名;

查询表的字符集

show  create table  表名;

修改表的字符集

alter  table  表名  character set 字符集格式;

create  table  新表名  like   旧表名

删除表

drop  table  if  exits  表名;如果存在,就删除

drop table  表名;直接删除

12-1

1.MySQL的DQL语句--->数据库查询语句(带条件查询分类)

模糊查询

select  字段列表 from  表名   where   like  '%xx%';

%:代表任意多个字符

_:代表任意一个字符

聚合查询

count(字段名称)

max(列名称):求最大值

min(列名称):求最小值

avg(列名称):求当前列的平均值

sum(列名称):求当前列的总和

排序查询

select  字段列表  from  表名  order  by  字段名称  排序规则;

默认asc  升序

desc  降序

分组查询

select  字段列表  from  表名  group  by  分组字段名称;

where条件和group by,where条件的在group by的前面

group by的后面不能使用where,先满足where条件,才参与分组!

筛选

having的后面可以跟聚合函数,having在group  by后面,where在group by前面

分页查询

select  字段列表  from  表名  limit  起始行数,每页显示的条数

2.数据库约束

默认约束 default

非空约束  not  null

唯一约束 unqiue

主键约束  primary key--->非空且唯一

自增长约束+ 上面的约束--->每一张表的id

级联操作:需要上面的有关联关系需要用级联
        部门表  和 员工表      
            操作主表的数据,从表数据随之更改

3.关于表和表的关系/数据库的三大范式(设计数据库)

第一范式1NF  :表中的每一列是单独的,不能再拆分
第二范式2NF:在满足1NF的基础上
                     非主键字段必须完全依赖于主键字段
第三范式3NF:在满足2NF的基础上
                    非主键字段中间不能产生传递依赖

4.多表查询

1.)子查询

select  嵌套 select.....

 情况1:单行单列的数据

情况2:多行多列

情况3:通过两个表的关系----查询出结果集--->当作虚表在和其他之间关联拆线呢!

笛卡尔乘积:多表查询语法select 字段列表 from 表名1,表名2;

这个就是笛卡尔乘积,针对A表的记录 和B的记录数,两个表的记录相乘
 出现笛卡尔乘积的原因:没有设置连接条件!  

多表查之内连接()
   隐式内连接:where条件---多去使用这种查!
    select    
        字段列表 
        from 
        表名1,表名2...表名n
    where      
        这些表之间的连接条件;

内连接---显示内连接   (inner可以省略) join
    select
        字段列表
    from 表名1
    (inner) join
    表名2
    on  连接条件;

外连接
左外连接(通用)
将A表(左表)的和B表(右表)的交集以及A表(左表)中所有数据全部查询!
    select 
    字段列表
    from
        左表名
    left (outer) join    -- outer可以省略   
              -- righter (outer) join 可以右外连接
    表名2
    on
        连接条件;


12-3

什么是事务(Transaction)

在一个业务中执行多个SQL(多张表的SQL),这多个SQL语句要么同时执行成功,要么同时执行失败

事务特点 ACID (关系型数据库传统事务)

原子性,一致性,隔离性,持久性!

原子性:在使用事务管理的时候,执行多个sql增删改,要么同时执行成功,要么同时失败
一致性:高并发的时候,需要保证事务多次读写,保证数据一致性!
隔离性:事务和事务是独立的,相互不影响!
            举例
                购物车业务--->购物车表和购物车项表同时添加数据
                订单业务---->订单表和订单项表同时添加数据
持久性:    事务一旦提交,对数据的影响是永久性,即使关机了,数据还是要更新的!

事务的隔离级别

四个级别:从小到大,安全性---从低到高,效率性:从高到低!

 read uncommitted :读未提交   
  
  read committed :读已提交
  repeatable read :可重复读   (mysql的默认隔离级别)
  serializable : 串行话

设置隔离级别

set global transaction isoloation level 级别的名称;

第一种级别read uncommitted:读未提交 会造成问题"脏读"

"脏读":是事务管理最严重的问题:一个事务读取到另一个没有提交的事务!

第二种级别:read committed; 读已提交  有效防止脏读,出现了一个问题"不可重复读"
    事务(当前本身这个事务提交)多次读取另一个提交事务的前后得到的数据不一致!

mysql的默认级别 repeatable read 
        可重复读,有效脏读,不可重复读,出现幻读!(一般有更新操作影响了数据)

最高级别:serializable:串行话    (一个事务读取到另一个没提交事务,数据查不到的,这个必须提交,才能操作数据!)

Jdbc的引入

七大步骤

1.)导报驱动包

2.)注册驱动---加载驱动类

3.)获取数据库的连接对象java.sql.Connection

4.)准备sql语句

5.)通过Connection连接对象获取数据库的执行对象

6.)执行sql语句

7.)释放资源

public class JdbcDemo {
    public static void main(String[] args) throws Exception {
        
        //Jdbc的操作:java连接数据库
        //1)导入驱动jar包
        //2)注册驱动---加载驱动类
        Class.forName("com.mysql.jdbc.Driver") ; //mysql5.5或者5.1的jar包:都是这个全限定名称
                                                //mysql8.0jar包: com.mysql.cj.jdbc.Driver

        //3)获取数据库连接对象
        //DriverManager驱动管理类--->
        //public static Connection getConnection(String url, 连接库地址  (统一资源定位符)
        //                                       String user, mysql的用户名  root用户
        //                                       String password) 登录MySQL的密码
        //                                throws SQLException

        //url--->组成: 协议名称 ://域名:端口号/具体的路径
        /*
        * mysql的驱动jar包如果是8.0以后:url的后面           编码格式         是否启用证书登录     服务器时区         是否公钥模式
        * jdbc:mysql://localhost:3306/ee_2211_02?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
        * */

        //  jdbc:mysql://localhost:3306/库名
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/ee_2211_02",
                "root",
                "123456"
        );

        //4)准备sql语句
        String sql = "insert into account (name,balance) values('高圆圆',1000)" ;

        //5)通过数据库连接对象Connection获取数据库的执行对象
        //执行静态sql语句
        //Statement createStatement()throws SQLException创建一个Statement对象,用于将SQL语句发送到数据库
        Statement stmt = conn.createStatement();

        //6)执行sql语句
        //Statement--->
        //int executeUpdate(String sql)throws SQLException 通用的更新操作
        int count = stmt.executeUpdate(sql);
        System.out.println("影响了"+count+"行");

        //7)释放资源
        stmt.close();
        conn.close();

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个可能的计算机专业实习的实习总结,共10。请根据你的实习经历进行适当的修改和调整。 第1: 这我开始了我的计算机专业实习,我被分配到了开发团队,我很兴奋。我主要的任务是帮助团队开发一个新的Web应用程序,这个应用程序将帮助客户更好地管理他们的业务流程。 在这个星期,我学习了公司的开发流程和工具。我还学习了使用一些新的编程语言和工具,包括JavaScript和Git。我发现这个实习很有挑战性,但我也很享受学习新东西的过程。 第2: 这我开始着手进行一些实际的开发工作。我在公司的开发环境中设置了一个新的项目,我使用React编写了一个简单的用户界面。我也学会了如何使用Jest进行测试。 我的导师对我非常耐心地解释了一些编程问题,我对我的编程技能有了更深入的理解。这我也学到了很多关于敏捷开发的知识,这对于我的工作非常有帮助。 第3: 这我与其他团队成员一起合作编写代码。我负责一些小任务,比如创建表单和处理表单提交。我意识到我的工作与其他团队成员的工作紧密相关,我们需要相互协作才能成功地完成项目。 我还参加了一些团队会议,了解了一些关于公司业务的信息。这使我更加了解公司的目标和工作重点,这有助于我更好地完成我的工作。 第4: 这,我开始对我的代码进行调试。我发现有些错误很难找,但是我学到了如何使用调试工具来帮助我找到这些错误。 我还与我的导师一起进行了一些代码审核。他们对我的代码进行了审查,提出了一些建设性的意见。这对我来说是一个很好的经验,因为我学到了如何写更好的代码。 第5: 这我与另外一个开发团队合作,他们负责开发后端应用程序。我负责与他们协作,确保前端和后端代码能够顺利交互。这让我更好地了解了整个应用程序的架构和流程。 我还学习了一些关于代码部署的知识,包括如何将代码部署到生产环境中。这些知识对于我未来的工作非常有帮助。 第6: 这

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值