JDBC

人工智能51

JDBC连接数据库的方式

方式一:

  public void test1() {
    try {
        Driver driver = new Driver();  //获得一个驱动
                 //连接数据看所需url,其中myemployees是所要连接的数据库
        String url = "jdbc:mysql://localhost:3306/myemployees";
        Properties properties = new Properties();
        properties.setProperty("user", "root"); //user:用户名
        properties.setProperty("password", "123456"); //password:密码
        Connection conn = driver.connect(url,properties);
        System.out.println(conn);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

方式二

public void test1() {
    try {
        //1.获取driver,通过反射实现
        Class clazz = Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) clazz.newInstance();
        //2.连接数据库
        String url = "jdbc:mysql://localhost:3306/myemployees";
        Properties properties = new Properties();
        properties.setProperty("user", "root");
        properties.setProperty("password", "123456");
        Connection conn = driver.connect(url,properties);
        System.out.println(conn);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

方式三

public void test1() {
    try {
        //通过DriverManager类获得connection
        String url = "jdbc:mysql://localhost:3306/myemployees";
        Properties properties = new Properties();
        properties.setProperty("user", "root");
        properties.setProperty("password", "123456");
        Connection conn = DriverManager.getConnection(url,properties);
        System.out.println(conn);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

方式四(推荐)

编写jdbc.properties配置文件
JDBC

//通过配置文件方式
public void test1() {
    try {
        //通过当前类 获得类加载,进而加载文件
        InputStream is = Conn.class.getClassLoader()
                          .getResourceAsStream("jdbc.properties");
        Properties properties = new Properties();
        properties.load(is);
        // 读取配置文件信息
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");
        // 加载驱动
        Class.forName(driver);
        //获取连接
        Connection conn = DriverManager.getConnection(url,user,password);
        System.out.println(conn);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

增删改查(CRUD)

所用表
JDBC

编写连接数据库的工具类

public class CRUDUtils {
    //获取连接
    public static Connection getConnection() {
        Connection conn = null;
        //1.加载文件
        InputStream is = ClassLoader.getSystemClassLoader()
                .getResourceAsStream("jdbc.properties");
        Properties pro = new Properties();
        try {
            pro.load(is);
            //2. 读取配置文件,获取数据
            String user = pro.getProperty("user");
            String password = pro.getProperty("password");
            String url = pro.getProperty("url");
            String driver = pro.getProperty("driver");
            // 3.加载驱动
            Class.forName(driver);
            //4.获取连接
            conn = DriverManager.getConnection(url, user, password);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    //关闭资源
    public static void closeResource(Connection conn, PreparedStatement ps) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

增加数据的写法

    /**
     * 增加用户
     */
    public void addUser() {
        // 1. 获取连接
        Connection conn = CRUDUtils.getConnection();
        PreparedStatement ps = null;
        // 2. INSERT INTO USER VALUES(4,'user4','123',NOW())
        String sql = "INSERT INTO USER VALUES(?,?,?,NOW())"; //所有字段
        String sql2 = "INSERT INTO USER(id, birthday) values(?,?)"; //选择两个字段
        try {
//          PreparedStatement ps = conn.prepareStatement(sql);
//          ps.setInt(1, 4);
//          ps.setString(2, "user4");
//          ps.setString(3, "123");
//          ps.execute();
            //3. 获取prepareStatement对象
            ps = conn.prepareStatement(sql2);
            //4. 设置值
            ps.setInt(1, 4); //插入id
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date date = sdf.parse("2000-1-1");
                        //插入birthday,涉及java.util.date和java.sql.date日期转换
            ps.setDate(2, new java.sql.Date(date.getTime()));
            //5.提交
            ps.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }finally {
            //6.关闭
            CRUDUtils.closeResource(conn, ps);
        }
    }

修改数据的写法

public void updateUser() {
        //1. 获取连接
        Connection conn = CRUDUtils.getConnection();
        PreparedStatement ps = null;
        try {
            //2.预编译SQL语句,返回preparedStatement实例
            String sql = "update user set username=? where id=?";
            ps = conn.prepareStatement(sql);
            //3.填充占位符
            ps.setString(1, "abc");
            ps.setInt(2, 1);
            //4.提交
            ps.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
                       //资源关闭
            CRUDUtils.closeResource(conn, ps);
        }
    }

查询数据
编写一个Use人类

import java.sql.Date;

public class User {

    private int id;
    private String username;
    private String password;
    private Date birthday;
    public User() {
    }
    public User(int id, String username, String password, Date birthday) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
        this.birthday = birthday;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password=" + password + ", birthday=" + birthday + "]";
    }

}

通用查询

/**
  通用查询
  Java属性和数据库列不一致时,可以为数据库列起别名
  同时获取列的别名时可以用md.getColumnLabel()方法。
*/
public User queryUser(String sql, Object... args) {
    // 1.获取连接
    Connection conn  = CRUDUtils.getConnection();
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
        // 2.预编译sql,获取preparedStatement实例
        ps = conn.prepareStatement(sql);
        // 填充占位符
        for(int i=0;i

preparedstatement相较于statement的好处

  • SQL注入问题, SQL语句写法不繁琐
  • PreparedStatement操作 B1ob的数据,而 Statement做不到。
  • PreparedStatement可以实现更高效的批量操作。

存储blob类型数据

  • Blob:二进制对象。用于存储图片视频等
public void blob() {
    //1.获取连接
    Connection conn = CRUDUtils.getConnection();
    PreparedStatement ps = null;
    try {
        //2.获取PreparedStatement对象
        String sql = "insert into user(id,username,password,photo)"
                + "values(?,?,?,?)";
        ps = conn.prepareStatement(sql);
        //填充占位符
        ps.setInt(1, 5);
        ps.setString(2, "aaa");
        ps.setString(3, "123");
        FileInputStream fis = new FileInputStream(new File("1.jpg"));
        ps.setBlob(4, fis); // 该方法存储二进制对象
        //提交
        ps.execute();
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }finally {
        CRUDUtils.closeResource(conn, ps, null);
    }
}

批量操作

mysql默认不支持批量操作需要在url后面加上代码:rewriteBatchedStatements=true
url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true

/*
* 批量操作
 */
public void batch() {
    //获取连接
    Connection conn = CRUDUtils.getConnection();
    PreparedStatement ps =  null;
    //获取 实例
    String sql = "insert into test1(name) values(?)";
    try {
                conn.setAutoCommit(false); //设置不允许自动提交
        ps = conn.prepareStatement(sql);
        for(int i=0;i

事务的处理

  • DDL:数据定义语言,(创建 create,删除 truncaate/drop,修改 alter表)
    set autocommit=false不起作用
  • DML:数据操作语言,(增 insert,删 delete,改 update记录)
    天然的自动提交事务,一旦执行就提交,可以通过 SQL语句: set autocommit=false,设置 不需要自动提交
  • 默认关闭连接 数据也会自动提交
/**
 * 操作score表,实现AA向BB转账100
 */
public void updateMoney(Connection conn, String sql, Object... args) {
    PreparedStatement ps = null;
    try {
        //获取PreparedStatement实例
        ps = conn.prepareStatement(sql);
        for(int i=0;i

事务并发问题

  • 脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的。
  • 不可重复读:对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段。之后,T1再次读取同一个字段,值就不同了。
  • 幻读:对于两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行。之后,如果T1再次读取同一个表,就会多出几行。

隔离级别

  • READ UNCOMMITTED(读而未提交数据)
  • READ COMMITED(读已提交数据): 解决了脏读问题
  • REPEATABLE READ(可重复读): 解决了脏读和不可重复读问题
  • SERIALIZABLE(串行化): 解决了脏读,不可重复读,幻读的问题,但是性能十分低下。
    *Oracle 只支持②和④的隔离级别,默认是②,而MySQL支持①,②,③,④的隔离级别,默认③

数据库连接池

看文档写代码

//获取c3p0连接池
ComboPooledDataSource cpds = new ComboPooledDataSource();
//设置基本信息
cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver
cpds.setJdbcUrl( "jdbc:mysql://localhost:3306/test" );
cpds.setUser("root");
cpds.setPassword("123456");
//获取连接
Connection connection = cpds.getConnection();
System.out.println(connection); //com.mchange.v2.c3p0.impl.NewProxyConnection@75412c2f

Original: https://www.cnblogs.com/huyuqing/p/14419114.html
Author: 先生胡
Title: JDBC



相关阅读

Title: 利用anaconda创建tensorflow环境并在jupyter和pycharm中使用

利用anaconda创建tensorflow环境并在jupyter和pycharm中使用

Anaconda官网下载即可

https://www.anaconda.com/products/individual

清华镜像网站下载更快https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
安装完成后 conda --version 查看安装版本
JDBC
注意:装anaconda,就不需要单独装python了。

anaconda 是一个python的发行版,包括了python和很多常见的软件库, 和一个包管理器conda
百度搜索任意安装教程即可,例: https://zhuanlan.zhihu.com/p/75717350
TensorFlow for Windows只支持Python3.5和Python 3.6,所以尽量下载高版本Anaconda

; cudnn和cuda下载安装(GPU版本的Tensorflow需要此步骤)

tensorflow-gpu和cudnn、cuda对应关系:
https://tensorflow.google.cn/install/source_windows

安装教程: https://blog.csdn.net/sinat_23619409/article/details/84202651

tensorflow环境创建

  1. 采用命令行的方法 ,管理员身份运行Anaconda Prompt(Anaconda3)
    JDBC
  2. 添加清华镜像的方法
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes
  1. 新建Tensorflow环境
conda create -n tensorflow python=3.6.2

查看python版本 python --version
检测目前安装了哪些环境变量: conda info --envs
JDBC
4. 启动tensorflow环境

activate tensorflow

正式安装tensorflow

1.进入tensorflow环境,输入命令: pip install tensorflow_gpu==2.6.0
2.测试tensorflow是否安装成功:
输入命令: python

>>>import tendorflow as tf
>>>from tensorflow.python.client import device_lib
>>>print(device_lib.list_local_devices())
>>>tf.config.list_physical_devices('GPU')

在tensorflow环境中安装jupyter

  1. 进入tensorflow环境
    conda install ipython
    conda install jupyter
    conda install -n tensorflow ipykernel
    最后将此kernel链接到jupyter notebook中 python -m ipykernel install --user --name tensorflow --display-name "Python (tensorflow)" 此时发现多了一个jupyter notebook(tensorflow)

JDBC

  1. 在jupyter中使用tensorflow
    JDBC将kernel改为刚建立的tensorflow环境

; 在pycharm中使用tensorflow环境

在新建的项目中,点击file->settings...->Python Interpreter.

将这里的路径改为tensorflow环境下的python路径

JDBC
JDBC

参考

https://zhuanlan.zhihu.com/p/75717350
https://blog.csdn.net/sinat_23619409/article/details/84202651

Original: https://blog.csdn.net/weixin_44457451/article/details/122859084
Author: xianhjj
Title: 利用anaconda创建tensorflow环境并在jupyter和pycharm中使用