JDBC操作

2023-11-17

在IDEA中用java中驱动数据库,并使用Java语言操作数据库

10.1 数据库驱动

驱动:比如:声卡、显卡、数据库

在这里插入图片描述

我们的程序会通过数据库驱动和数据库打交道

10.2 JDBC

sun公司为了简化开发人员的(对数据库的统一)操作,提供了一个(java操作数据库的)规范,俗称JDBC

这些规范的实现有具体的厂商去做

对于开发人员来说,我们只需要掌握JDBC操作即可

在这里插入图片描述

java中调用数据库需要java.sql、javax.sql包(java自带)

还需要一个数据可驱动包

10.3 第一个JDBC程序

创建测试数据库

在sql yog里创建新数据库

CREATE DATABASE `jdbcStudy` CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `jdbcStudy`;

CREATE TABLE `users`(
 `id` INT PRIMARY KEY,
 `NAME` VARCHAR(40),
 `PASSWORD` VARCHAR(40),
 `email` VARCHAR(60),
 birthday DATE
);

 INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)
VALUES('1','zhangsan','123456','zs@sina.com','1980-12-04'),
('2','lisi','123456','lisi@sina.com','1981-12-04'),
('3','wangwu','123456','wangwu@sina.com','1979-12-04')

1、下载mysql-installer-community-8.0.28.0:https://dev.mysql.com/downloads/connector/j/5.1.html(什么数据库版本就下对应版本)

版本不是最新版可选https://mvnrepository.com/artifact/mysql/mysql-connector-java

2、创建一个新项目

把下载的mysql-connector-java-8.0.28.jar拖进lib,并Add as Library

在这里插入图片描述
3、连接数据库

package com.jdbc.lesson01;

import java.sql.*;

// 我的第一个JDBC程序
public class JdbcDemo01 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1、加载驱动
        Class.forName("com.mysql.jdbc.Driver");//固定写法,加载驱动
        //2、用户信息和url
        //useUnicode=true支持中文编码   characterEncoding=utf8 设定中文字符集为utf8  useSSL=true  使用安全连接
        String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
        String username = "root";
        String password = "123456";

        //3、连接成功,数据库对象 Connection 代表数据库
        Connection connection = DriverManager.getConnection(url,username,password);

        //4、执行SQL的对象  statement 执行sql的对象
        Statement statement = connection.createStatement();

        //5、执行SQL的对象 去执行SQL,可能存在结果查看但会结果
        String sql = "SELECT * FROM `users`";

        ResultSet resultSet = statement.executeQuery(sql);//返回的结果集,结果集中封装了我们全部的查询结果

        while (resultSet.next()){
            System.out.println("id=" +resultSet.getObject("id"));
            System.out.println("name=" +resultSet.getObject("NAME"));
            System.out.println("password=" +resultSet.getObject("PASSWORD"));
            System.out.println("email=" +resultSet.getObject("email"));
            System.out.println("birth=" +resultSet.getObject("birthday"));
            System.out.println("==============================");
        }
        //6、释放连接
        resultSet.close();
        statement.close();
        connection.close();
    }
}

步骤总结:

1、加载驱动

2、连接数据库 DriverManager

3、获得执行sql的对象 Statement

4、获得返回的结果集

5、释放连接

DriverManager

//DriverManager.registerDriver(new com.mysql.jdbc.Driver());//这样写太复杂,下面简化
Class.forName("com.mysql.jdbc.Driver");//固定写法,加载驱动
Connection connection = DriverManager.getConnection(url,username,password);

//connection 代表数据库
//数据库设置自动提交
//事务提交
//事务回滚
connection.rollback();
connection.commit();
connection.setAutoCommit();

URL

String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";

//mysql -- 3306  默认端口号
//jdbc:mysql://localhost:3306/数据库名?参数1&参数2&参数3
//协议://主机地址:端口号、数据库名?参数1&参数2&参数3

//oralce --1521  默认
//jdbc:oracle:thin:@localhost:1521:sid

Statment 执行SQL的对象 prepareStatement执行对象

String sql = "SELECT * FROM `users`";//编写SQL

statement.executeQuery();//查询操作,返回ResultSet
statement.execute();//执行任何SQL,比起下面需要判断,效率更低
statement.executeUpdate();//更新、插入、删除。都是这个,返回一个受影响的行数

ResultSet 查询的结果集,封装了所有的查询结果

获得指定的数据类型

resultSet.getObject();//在不知道列类型的情况下使用
//俄国知道列的类型就使用指定的
resultSet.getString();
resultSet.getInt();
resultSet.getFloat();
......

遍历指针

resultSet.beforeFirst();//移动到最前面,从第一个数据开始查
resultSet.afterLast();;//移动到最后面
resultSet.next();//移动到下一个数据
resultSet.previous();//移动到前一行
resultSet.absolute(row);//移动到指定行

释放资源

//6、释放连接
resultSet.close();
statement.close();
connection.close();//耗资源,用完关掉

10.4 Statement 对象

JDBC中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过对这个对象向数据库发送增删改查语句即可。

Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,**executeUpdate执行完后,将会返回一个整数(**即增删改语句导致了数据库几行数据发生了变化)

Statement、executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象

create 操作

使用executeUpdate(String sql)方法完成数据添加操作

Statement statement = connection.createStatement();
String sql ="insert into user(...)values(...)";
int num = st.executeUpdate(sql);
if (num>0){
    System.out.println("插入成功")
}

delete 操作

Statement statement = connection.createStatement();
String sql ="delete from user where id=1";
int num = st.executeUpdate(sql);
if (num>0){
    System.out.println("删除成功")
}

update 操作

Statement statement = connection.createStatement();
String sql ="update user set  name=''where name=''";
int num = st.executeUpdate(sql);
if (num>0){
    System.out.println("修改成功")
}

read

Statement statement = connection.createStatement();
String sql ="select *from user where id=1";
ResultSet rs= st.executeQuery(sql);
while (rs.next()){
   //根据获取列的数据类型,分别调用rs的相应方法映射到java对象中
}

代码实现

1、提取工具类

配置文件:db.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true
username=root
password=123456

JdbcUtils类:

package com.jdbc.lesson02.utils;

import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.io.InputStream;


public class JdbcUtils {
    private static String driver=null;
    private static String url=null;
    private static String username=null;
    private static String password=null;
    static {
        try{
            InputStream in=JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
            Properties properties = new Properties();
            properties.load(in);

            driver=properties.getProperty("driver");
            url=properties.getProperty("url");
            username=properties.getProperty("username");
            password=properties.getProperty("password");

            //1、驱动只要加载一次
            Class.forName(driver);

            //properties.getProperty("driver");

        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //获取连接
    public static Connection getConnection()throws SQLException{
        return DriverManager.getConnection(url,username,password);
    }

    //释放连接资源
    public static void release(Connection conn, Statement st, ResultSet rs){
        if(rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(st!=null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

2、编写增删改的方法

增:

package com.jdbc.lesson02.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestInsert {
    public static void main(String[] args) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

        try{
            conn = JdbcUtils.getConnection();//获取数据库连接
            st = conn.createStatement();//获取SQL的执行对象
            String sql = "INSERT INTO users(id,`NAME`,`PASSWORD`,`email`,`birthday`)" +
                    "VALUES(4,'kuangshen','123456','2475654@qq.com','2020-01-01')";
            int i =st.executeUpdate(sql);
            if(i>0){
                System.out.println("插入成功");
            }

        }catch(SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,rs);
        }
    }
}

删:

package com.jdbc.lesson02.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestDelete {
    public static void main(String[] args) {
        Connection coon = null;
        Statement st = null;
        ResultSet rs = null;

        try{
            coon = JdbcUtils.getConnection();//获取数据库连接
            st = coon.createStatement();//获取SQL的执行对象
            String sql = "delete from users where id=4";
            int i =st.executeUpdate(sql);
            if(i>0){
                System.out.println("删除成功");
            }

        }catch(SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(coon,st,rs);
        }
    }
}

改:

package com.jdbc.lesson02.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestUpdate {
    public static void main(String[] args) {
        Connection coon = null;
        Statement st = null;
        ResultSet rs = null;

        try{
            coon = JdbcUtils.getConnection();//获取数据库连接
            st = coon.createStatement();//获取SQL的执行对象
            String sql = "update users set NAME='Kuangshen' where id=1";
            int i =st.executeUpdate(sql);
            if(i>0){
                System.out.println("更新成功");
            }

        }catch(SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(coon,st,rs);
        }
    }

}

查询

package com.jdbc.lesson02.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestSelect {
    public static void main(String[] args) {
        Connection conn=null;
        Statement st = null;
        ResultSet rs = null;

        try{
            conn = JdbcUtils.getConnection();
            st=conn.createStatement();

            //SQL
            String sql ="select * from users where id=1";
            rs = st.executeQuery(sql);//查询完毕会返回一个结果集
            while(rs.next()){
                System.out.println(rs.getString("NAME"));
            }
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,rs);}
    }
}

SQL 注入问题

sql存在漏洞,会被攻击导致数据泄露,SQL会被拼接

package com.jdbc.lesson02.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SQLzhuru {
    public static void main(String[] args) {
       // login("Kuangshen","123456");
        login("'or'1=1","'or'1=1");//SQL会被拼接,注入漏洞
    }
    //登录业务
    public static void login(String username,String password){
        Connection conn=null;
        Statement st = null;
        ResultSet rs = null;

        try{
            conn = JdbcUtils.getConnection();
            st=conn.createStatement();

            //SQL
            String sql ="select * from users where `NAME`='"+username+"' and `PASSWORD`='"+password+"'";
            rs = st.executeQuery(sql);//查询完毕会返回一个结果集
            while(rs.next()){
                System.out.println(rs.getString("NAME"));
                System.out.println(rs.getString("password"));

            }
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,rs);}
    }
}

会直接查出数据库所有内容,不安全!

在这里插入图片描述

Statement不安全,要使用PrepareStatement

10.5 PrepareStatement对象

PrepareStatement可以防止SQL注入,并且效率更高!

1、增

package com.jdbc.lesson03;

import com.jdbc.lesson02.utils.JdbcUtils;
import java.util.Date;
import java.sql.*;

public class TestInsert {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;
//        ResultSet rs = null;

        try{
            conn = JdbcUtils.getConnection();

            //区别
           //使用?占位符代替参数

            String sql = "insert into users(id,`NAME`,`PASSWORD`,`email`,`birthday`)values(?,?,?,?,?)";

            st = conn.prepareStatement(sql);//预编译SQL,先写SQL,然后不执行
            //手动给参数赋值
            st.setInt(1,4);
            st.setString(2,"qingjiang");
            st.setString(3,"1234567");
            st.setString(4,"41321345@qq.com");
            //注意点:sql.Date 数据库 java.sql.Date
            //util.Date Java    new Date.getTime()获得时间戳
            st.setDate(5,new java.sql.Date(new Date().getTime()));

            //执行
            int i = st.executeUpdate();
            if(i>0){
                System.out.println("插入成功");
            }

        }catch(SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,null);
        }

    }
}

2、删

package com.jdbc.lesson03;

import com.jdbc.lesson02.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;

public class TestDelete {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;
//        ResultSet rs = null;

        try{
            conn = JdbcUtils.getConnection();

            String sql = "delete from users where id=?";

            st = conn.prepareStatement(sql);//预编译SQL,先写SQL,然后不执行
            //手动给参数赋值
            st.setInt(1,4);

            //执行
            int i = st.executeUpdate();
            if(i>0){
                System.out.println("删除成功");
            }

        }catch(SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,null);
        }
    }
}

3、改

package com.jdbc.lesson03;

import com.jdbc.lesson02.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TestUpdate {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;
//        ResultSet rs = null;

        try{
            conn = JdbcUtils.getConnection();

            //区别
            //使用?占位符代替参数
            String sql = "update users set `NAME`=? where id=?";

            st = conn.prepareStatement(sql);//预编译SQL,先写SQL,然后不执行
            //手动给参数赋值
            st.setString(1,"狂神");
            st.setInt(2,1);

            //执行
            int i = st.executeUpdate();
            if(i>0){
                System.out.println("更新成功");
            }

        }catch(SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,null);
        }
    }
}

4、查

package com.jdbc.lesson03;

import com.jdbc.lesson02.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TestSelect {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;

        try{
            conn = JdbcUtils.getConnection();


            String sql = "select * from users where id=? ";

            st = conn.prepareStatement(sql);//预编译SQL,先写SQL,然后不执行

            st.setInt(1,1);

            //执行
            rs = st.executeQuery();

            if(rs.next()){
                System.out.println(rs.getString("NAME"));
            }


        }catch(SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,null);
        }
    }
}

5、防止SQL注入

package com.jdbc.lesson03;

import com.jdbc.lesson02.utils.JdbcUtils;

import java.sql.*;

public class SQLzhuru {
    public static void main(String[] args) {
       // login("Kuangshen","123456");
        login("lisi","123456");//SQL会被拼接,注入漏洞
    }
    //登录业务
    public static void login(String username,String password){
        Connection conn=null;
        PreparedStatement st = null;
        ResultSet rs = null;

        try{
            conn = JdbcUtils.getConnection();

            //preparedStatement 防止SQL注入的本质,把传递进来的参数当做字符
            //假设其中存在转义字符,就直接忽略,比如说'会被直接转义
            String sql ="select * from users where `NAME`=? and `PASSWORD`=?";

            st=conn.prepareStatement(sql);
            st.setString(1,username);
            st.setString(2,password);

            rs = st.executeQuery();//查询完毕会返回一个结果集
            while(rs.next()){
                System.out.println(rs.getString("NAME"));
                System.out.println(rs.getString("password"));
                System.out.println("===========");

            }
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,rs);}
    }
}

10.6 使用IDQEA连接数据库

在这里插入图片描述

连接

在这里插入图片描述

连接成功后,可以选择数据库

在这里插入图片描述

双击可打开表

在这里插入图片描述

可打开Console编写数据库SQL代码

在这里插入图片描述

10.7 事务

代码实现

1、开启事务conn.setAutoCommit(false);

2、一组业务执行完毕,提交事务

3、可以在catch语句中显示地定义回滚语句,但默认失败就会回滚

package com.jdbc.lesson04;

import com.jdbc.lesson02.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TestTransaction {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;

        try{
            conn = JdbcUtils.getConnection();
            // 关闭数据库的自动提交,自动会开启事务
            conn.setAutoCommit(false);//开启事务

            String sql1 = "update account set money =money -100 where name ='A' ";
            st = conn.prepareStatement(sql1);
            st.executeUpdate();
            //int x=1/0;//报错

            String sql2 = "update account set money =money +100 where name ='B' ";
            st=conn.prepareStatement(sql2);
            st.executeUpdate();

            //业务完毕,提交事务
            conn.commit();
            System.out.println("成功!");

        }catch (SQLException e){
            try{
                conn.rollback();//如果失败则回滚
            }catch (SQLException e1){
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,rs);
        }
    }
}

10.9 数据库连接池

数据库连接—执行完毕—释放

连接—释放十分浪费系统资源

池化技术:准备一些预先的资源,过来就连接预先准备好的

----开门–业务员:等待–服务–

常用连接数10个

最小连接数:10

最大连接数:15,业务最高承载上限。超过15的人,排队等待

等待超时:100ms,超过就告诉异常

编写连接池,只需要实现一个接口DataSource

开源数据源实现(用架构包直接用)

DBCP

C3P0

Druid:阿里巴巴

编写连接池,实现一个接口 DataSource

使用了这些数据库连接池之后,我们在

项目开发中就不需要编写连接数据库的代码里

DBCP

需要用到Java包,commons-dbcp2-2.9.0、commons-pool2-2.11.1(Java1.8)

dbcp2.0以上,还要导入commons-logging-1.2

网址:

https://blog.csdn.net/legend_x/article/details/8779510

https://commons.apache.org/proper/commons-logging/download_logging.cgi

db.properties文件配置:

#连接设置   这里面的名字,是DBCP数据源中定义好的
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true
username=root
password=123456


#<!-- 初始化连接 -->
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60-->
maxWait=60000

#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:【属性名=property;】
#注意:"user""password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=utf8

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_COMMITTED

JdbcUtils_DBCP文件配置:

package com.jdbc.lesson05.utils;

import org.apache.commons.dbcp2.BasicDataSourceFactory;


import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JdbcUtils_DBCP {
        private static DataSource dataSource=null;

        static {
            try{
                InputStream in= JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("db.properties");
                Properties properties = new Properties();
                properties.load(in);

                //创建数据源 工厂模式 -->创建对象
                dataSource = BasicDataSourceFactory.createDataSource(properties);

                //properties.getProperty("driver");

            }catch (Exception e){
                e.printStackTrace();
            }
        }
        //获取连接
        public static Connection getConnection()throws SQLException {
            return dataSource.getConnection();//从数据源中获取
        }

        //释放连接资源
        public static void release(Connection conn, Statement st, ResultSet rs){
            if(rs!=null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(st!=null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn!=null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

}

测试:

package com.jdbc.lesson05.utils;

import com.jdbc.lesson02.utils.JdbcUtils;
import com.jdbc.lesson05.utils.JdbcUtils_DBCP;

import java.sql.*;

public class TestDBCP {
    public static void main(String[] args) {


        Connection conn = null;
        PreparedStatement st = null;
//        ResultSet rs = null;

        try {
            conn = JdbcUtils_DBCP.getConnection();

            //区别
            //使用?占位符代替参数

            String sql = "insert into users(id,`NAME`,`PASSWORD`,`email`,`birthday`)values(?,?,?,?,?)";

            st = conn.prepareStatement(sql);//预编译SQL,先写SQL,然后不执行
            //手动给参数赋值
            st.setInt(1, 4);
            st.setString(2, "qingjiang");
            st.setString(3, "1234567");
            st.setString(4, "41321345@qq.com");
            //注意点:sql.Date 数据库 java.sql.Date
            //util.Date Java    new Date.getTime()获得时间戳
            st.setDate(5, new java.sql.Date(new java.util.Date().getTime()));

            //执行
            int i = st.executeUpdate();
            if (i > 0) {
                System.out.println("插入成功");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils_DBCP.release(conn, st, null);
        }
    }

}

结论

无论使用什么数据源,本质是一样的,DataSource接口不会变,方法就不会变

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

JDBC操作 的相关文章

  • Java 区域设置区分大小写

    我有以下代码来显示当前区域设置 System out println Locale getDefault System out println new Locale en US 上面给出的输出如下 en US en us 如何构造一个 Lo
  • 在 Spring 中使用事务时创建提交后

    由于某些原因 我使用 Spring PlatformTransactionManager 手动执行事务提交和回滚 我需要做的是设置一个钩子 以便在提交事务后发生提交后操作 通过查看 void commit TransactionStatus
  • 最佳实践:在 PHP 中导入 mySQL 文件;分割查询

    我遇到了一种情况 我必须更新共享托管提供商上的网站 该网站有一个 CMS 使用 FTP 上传 CMS 文件非常简单 我还必须导入一个大的 相对于 PHP 脚本的范围 数据库文件 未压缩时大约 2 3 MB Mysql 已关闭 无法从外部访问
  • 原型 Bean 未按预期自动装配

    测试控制器 java RestController public class TestController Autowired private TestClass testClass RequestMapping value test me
  • Java Swing 自定义形状(2D 图形)

    我需要绘制自定义形状 现在 当用户单击面板上的几个点时 我使用多边形创建一个形状 public void mouseClicked MouseEvent e polygon addPoint e getX e getY repaint 但我
  • 同步不同数据库的2个表-MySQL

    我在数据库表中有一个包含某些医疗信息的表 我每天抓取并解析它们并将其存储在本地数据库的表中 假设最初有 1500 条记录 今天我的本地计算机上又添加了 100 条记录 现在 我有一个服务器 我需要在其中推送这些记录 因此数据库是不同的 我昨
  • CreationException:无法在 Play 2.5.18 中创建注入器错误,以使用 com.google.inject.AbstractModule 替换 GlobalSettings Java 代码

    我正在将 Play 应用程序从 2 5 12 升级到 2 5 18 当我启动该应用程序时 使用sbt 我收到此错误 CreationException 无法创建注入器 看到以下错误 1 Error injecting constructor
  • Bean 属性不可读或具有无效的 getter 方法

    因此 我的任务是为注册表路由编写一个简单的 Web 应用程序 使用 Spring MVC 所以我有 路线 类 我想在其中保留起点 终点和中间点列表 但我不明白如何将值从 jsp 放入列表 例如使用 jstl 所以我决定解析一个字符串 pub
  • 如何从网上获取源代码?

    我正在尝试从 Web 获取 HTML 源代码 我尝试这样做 u new URL url URLConnection con u openConnection con setRequestProperty User Agent Mozilla
  • MySQL中的字符串分割函数

    谁能告诉我如何在 mysql 中实现 split 函数 其行为类似于 Javascript split 我想要一个这样的功能 SELECT Split a b c d AS splitted 结果如下 splitted a b c d 有谁
  • 将 mysql 查询输出存储到 shell 变量中

    我需要一个变量来保存从数据库检索的结果 到目前为止 这基本上是我正在尝试但没有成功的事情 myvariable mysql database u user p password SELECT A B C FROM table a 正如你所看
  • 调用本机方法时返回 java.lang.UnsatisfiedLinkError

    我正在尝试为第三方 DLL 制作 Java 包装器 我创建了自己的 DLL 充当 JNI 和第三方 DLL 之间的中间人 在java中我加载这个DLL很好但是错误java lang UnsatisfiedLinkError sixense
  • Spring Hibernate中的@Transient方法调用

    我有一个 Pojo 类 在其中创建一个未与数据库表映射的字段 所以我必须声明字段Declaration和setter和getter方法 Transient 否则会显示错误 Transient private String docHistor
  • 为什么对象可以改变类变量的值?

    由甲骨文提供定义 http docs oracle com javase tutorial java javaOO classvars html 有时 您希望拥有所有对象共有的变量 这是通过 static 修饰符来完成的 声明中带有 sta
  • 错误:找不到符号 ArrayList

    我正在尝试创建某种列表来存储数组 表 中的值 我在这里使用数组列表 但我应该使用列表吗 但是 每次我尝试编译时 它都会引发以下错误 找不到标志 符号 ArrayList类 位置 玩家类 TablePlayer 代码如下 public cla
  • 解析XML文件以获取所有命名空间信息

    我希望能够从给定的 XML 文件中获取所有名称空间信息 例如 如果输入 XML 文件类似于
  • java中的Anagram算法

    我想做字谜算法但是 这段代码不起作用 我的错在哪里 例如 des 和 sed 是字谜 但输出不是字谜 同时我必须使用字符串方法 不是数组 public static boolean isAnagram String s1 String s2
  • 从java小程序获取正确的本地IP地址

    我想从我的 java 小程序确定本地 IP 地址 问题是当同一台机器上有多个 IP 地址时 该机器具有 LAN 和互联网连接 掌上电脑 VMWare 这是我的测试 public static void main String args tr
  • 应用程序中 GC 长时间暂停

    我当前运行的应用程序需要最大堆大小为 16GB 目前我使用以下标志来处理垃圾收集 XX UseParNewGC XX UseConcMarkSweepGC XX CMSInitiatingOccupancyFraction 50 XX Di
  • JVM锯齿状空闲进程

    我目前正在进行一项涉及 JVM 及其内存使用工作原理的研究 我不明白的是 JVM在空闲时用什么填充它的内存 只是为了在堆几乎达到时释放它 为什么使用的内存不只有一条平线 顺便说一句 这个 java 应用程序托管在 glassfish 上 但

随机推荐

  • OpenAI不能访问有什么方法解救呢?试试这方法吧

    最近发现国内不挂代理是不能访问到openAI的接口的 为了解决这个问题 我一直在github上需在解决方案 今天终于被我找到一个大神开源了一个解决方案 下面就来看看如何做吧 整个项目的代码很简单只有几行代码 rewrites source
  • chatgpt赋能Python-pythonmul

    Pythonmul 让Python更加高效的优化工具 Python是一种被广泛应用于数据分析 科学计算 人工智能等各个领域的高级编程语言 由于其简单易学 灵活多样的编程风格以及庞大的社区支持 Python成为了许多开发者的首选语言 但是 P
  • https网站打不开怎么办?解决方法看这里

    https网站 即安装了SSL证书的网站 打不开的情况也会经常出现 不论是什么网站 只要长时间打不开就会影响到用户体验度和网站本身的流量情况 对于网站的优化也是非常不利的 如果出现了这种情况该怎么解决呢 https网站打不开可能是由多种原因
  • js 保留6位有效数字,直接舍去,不四舍五入

    function sixNum num return Math floor num 1000000 1000000 sixNum 12 123456789 12 123456
  • PCB阻焊层太近了会不会有问题?

    绘制pcb双层板 进行DCR检查 发现如下报错 于是回到pcb的界面去查看 原来是我的组焊层靠的很近 小于规则的6mil 这个报错有必要修改嘛 规则的设置如下 最小组焊层裂口是6mil 但是封装就是官网上下载下来的 是芯片封装引脚的问题 过
  • AttemptID:attempt_1557891872692_0001_r_000000_0 Timed out after 3600 secs

    背景 做kylin 的时候 执行了 hive的命令 是hive数据的重新分布 结果在reduce的时候阻塞了 查看原因为 AttemptID attempt 1557891872692 0001 r 000000 0 Timed out a
  • 公有云、私有云、混合云

    云的部署方式有很多种 如公有云 私有云 混合云等 部署在云上的SaaS主要分为公有云SaaS和私有云SaaS 行业主流的SaaS部署模式是公有云SaaS 私有云部署模式 适用于某些有特殊要求的行业和企业业务 要求有较大的私有化和定制化空间的
  • python case when用法_SQL之CASE WHEN用法详解

    简单CASE WHEN函数 CASE SCORE WHEN A THEN 优 ELSE 不及格 END CASE SCORE WHEN B THEN 良 ELSE 不及格 END CASE SCORE WHEN C THEN 中 ELSE
  • angular蚂蚁_angular4 调用api

    angular2 问题请教 angular2 通过http服务进行对后端api的远程调用 我简单的尝试了一下 发现了几个问题 记录一下 以方便查找问题 angular2 http服务的跨域问题 跨域本身就是一个很复杂的问题 angular2
  • 剑指 Offer 27. 二叉树的镜像 -- 递归

    0 题目描述 leetcode原题链接 剑指 Offer 27 二叉树的镜像 1 递归算法 根据二叉树镜像的定义 考虑递归遍历 d f s mathrm dfs dfs 二叉树 交换每个节点的左 右子节点 即可生成 二叉树的镜像 递归解析
  • Qt入门-文本框类QLineEdit和QTextEdit

    QLineEdit是单行文本框 QTextEdit是多行文本框 1 单行文本框QLineEdit 常用的方法和属性 a 获取和设置文本对齐方式 Qt Alignment alignment const void setAlignment Q
  • MT6739的Android9.0 Camera kernel 驱动

    文章目录 Kernel 层驱动的实现 Camera 开机流程 Camera 驱动的文件结构 Camera 驱动初始化流程 Camera 入口函数 imgsensor init 注册的平台驱动结构体 gimgsensor platform d
  • Linux文本处理工具和正则表达式

    Linux文本处理工具和正则表达式 一 查看 截取和修改文本的工具 1 查看文本的工具 cat 最常用的文件查看命令 当不指明文件或者文件名为一杠 时 读取标准输入 cat OPTION FILE A 显示所有控制符 tab键 I 行结束符
  • 用户变量与系统变量的区别

    用户变量仅对当前用户生效 若有其他用户登录 对其无效 系统变量对所有用户生效 其中 引用已经设置的其他环境变量 使用 变量名 如 MyJAVA PATH C JAVA TheBin MyJAVA PATH Bin 那么 TheBin实际为
  • 电脑调分辨率黑屏了怎么办_电脑屏幕分辨率调节失败的解决方法

    在之前 我们讲到了电脑屏幕分辨率的问题 更加自己电脑的尺寸 来调节出最合适的屏幕分辨率 但有些网友在反映到电脑屏幕分辩率调了却没有反映 遇到这样的情况 我们该如何解决 电脑屏幕分辨率 调节分辨率的三种方法 方法一 右键单击桌面空白处 选择
  • 在linux中如何创建进程,如何在Linux中创建进程?

    加载到内存中并执行的程序称为进程 简单来说 一个进程就是一个正在执行的程序 让我们检查一下如何在Linux中创建进程 可以通过fork 系统调用创建一个新进程 新进程包含原始进程的地址空间的副本 fork 从现有流程创建新流程 现有进程称为
  • Springmvc3+Spring3+Freemarker整合异常

    Springmvc3 Spring3 Freemarker整合异常 提示缺少ui等类 主要异常信息如下 org springframework beans factory BeanCreationException Error creati
  • INFO zookeeper.ClientCnxn: Opening socket connection to server***/192.168.80.151:2181. Will not

    at org apache zookeeper ClientCnxnSocketNIO doTransport ClientCnxnSocketNIO java 361 at org apache zookeeper ClientCnxn
  • win10查看端口号是否被占用及解除占用的常用命令

    netstat ano 查看所有端口号占用情况 netstat ano findstr XXX 查看端口号为XXX的占用情况 如下 得到进程号为12160的进程正在占用本地的9090端口号 如果只是想释放9090端口到这一步就可以了 我们可
  • JDBC操作

    在IDEA中用java中驱动数据库 并使用Java语言操作数据库 10 1 数据库驱动 驱动 比如 声卡 显卡 数据库 我们的程序会通过数据库驱动和数据库打交道 10 2 JDBC sun公司为了简化开发人员的 对数据库的统一 操作 提供了