java使用jdbc操作数据库

2023-11-13

一、概述

为了持久化&方便管理数据,出现了mysql、sqlserver等多种数据库,我们可以直接这些数据库中使用sql语言增删改查管理数据。但是对于业务人员来说不懂sql,没法通过sql直接在数据库操作,所以我们要通过程序提供对数据库的操作;

这些数据库厂商为了让编程语言操作自身数据库,提供了支持不同语言的驱动包、比如mysql驱动包、sqlserver包等

而编程语言也提供了对接驱动包的接口,java中就是java.sql接口包,几个关系如下

二、基本使用

1、连接

public void con(){
		//把几个用于连接数据库的字符串定义成常量,不必每次去创建,这些字符串也可以通过配置文件方式读取
		String USER = "root";//数据库用户名
		String UPWD = "root";//数据库密码
		//本地数据库shop
		String URL = "jdbc:mysql://localhost:3306/db_book";
		//驱动
		String DRIVER = "com.mysql.jdbc.Driver";
		Statement st = null;
		Connection con = null;
		try {
			//加载驱动
			Class.forName(DRIVER);
			//获取连接对象
			con = DriverManager.getConnection(URL, USER, UPWD);
			//获取执行对象
			st = con.createStatement();
			String sqlString = "create table stu(id int,name varchar(25),age int)";
			//执行sql
			int row = st.executeUpdate(sqlString);
			System.err.println(row);
			
		} catch (Exception e) {
			try {
				if(st != null) {
					st.close();
				}
			} catch (SQLException e2) {
				e2.printStackTrace();
			}
			try {
				if(con != null) {
					con.close();
				}
			} catch (SQLException e3) {
				e3.printStackTrace();
			}
		}
	}

2、api

int executeUpdate(String sql) throws SQLException;//执行insert update delete
ResultSet executeQuery(String sql) throws SQLException;用于执行sql语句
boolean execute(String sql) throws SQLException;//执行create drop 等ddl语句


boolean  next():判断是否有下一行数据,若有,则向下移动一行指针
getXxx(int columnIndex):获取当前行中,第几列.(从1开始):不推荐,
getXxx(String columnName):获取当前行中的,指定列名的列的值.columnName是列名/列的别名,若列的类型是VARCHAR/CHAR/TEXT,都使用getString来获取列的值.若列的类型是int/integer/-->getInt来获取列的值.
对于上面的getint  getstring()都可以使用getObject  或者都使用getString()

3、查询

  • 查询一个数

  • 查询一行数据

  • 查询多行数据

4、sql注入原理

select * from user where name = '123' and pass = '234' or 1=1
上面模拟登录 不管用户名密码对不对都能查到结果

5、Statement和Preparement(获取自动生成的主键)

statement

String sqlString = "insert into stu(name,age)value('123',20)";
			//执行sql
			st.executeUpdate(sqlString,st.RETURN_GENERATED_KEYS);
			
			ResultSet resultSet = st.getGeneratedKeys();
			if(resultSet.next()) {
				int id = resultSet.getInt(1);
				System.out.println(id);
			}

Preparement

String sqlString = "insert into stu(name,age)value(?,?)";
			
			PreparedStatement pStatement = con.prepareStatement(sqlString,Statement.RETURN_GENERATED_KEYS);
			pStatement.setString(1, "123");
			pStatement.setInt(2, 20);
			pStatement.executeUpdate();
			ResultSet resultSet = pStatement.getGeneratedKeys();
			if(resultSet.next()) {
				int id = resultSet.getInt(1);
				System.out.println(id);
			}

三、工具类

package pojo;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;

/**
 * 封装的jdbc工具类
 * 
 * @author Administrator
 *
 */
public class MyJDBCUtil {
	// 定义数据库连接对象
	private static Connection con;
	// 定义执行sql对象
	private static PreparedStatement ps;
	// 定义结果集对象
	private static ResultSet rs;
	private static String driver;
	private static String url;
	private static String username;
	private static String password;

	// 工具类的构造器私有了,不让外部调用
	private MyJDBCUtil() {
	}

	// 下面的数据可以通过配置文件读取
	static {
		try {
			readConfig();
			Class.forName(driver);
			con = DriverManager.getConnection(url, username, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 读取配置文件
	private static void readConfig() {
		InputStream in = MyJDBCUtil.class.getClassLoader().getResourceAsStream("database.properties");
		System.out.println(in);
		Properties properties = new Properties();
		try {
			properties.load(in);
			driver = properties.getProperty("driver");
			url = properties.getProperty("url");
			username = properties.getProperty("username");
			password = properties.getProperty("password");
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	// 提供获取连接对象的公共方法
	public static Connection getConnection() {
		return con;
	}

	// 查询操作
	public static ResultSet excuteQuery(String sql, List params) throws SQLException {
		if (con == null || con.isClosed())// 连接对象是空 或者已经打开了就重新开启
		{
			getConnection();
		}
		ps = con.prepareStatement(sql);
		if (params != null && params.size() > 0) {
			for (int i = 0; i < params.size(); i++) {
				ps.setObject(i + 1, params.get(i));
			}
		}
		rs = ps.executeQuery();
		return rs;
	}

	// 更新操作
	public static int excuteUpdate(String sql, List params) throws SQLException {
		if (con == null || con.isClosed())// 连接对象是空 或者已经打开了就重新开启
		{
			getConnection();
		}
		ps = con.prepareStatement(sql);
		if (params != null && params.size() > 0) {
			for (int i = 0; i < params.size(); i++) {
				ps.setObject(i + 1, params.get(i));
			}
		}
		return ps.executeUpdate();
	}

	// 关闭资源
	public static void closeAll() {
		try {
			if (rs != null && !rs.isClosed()) {
				rs.close();
			}
			if (ps != null && !ps.isClosed()) {
				ps.close();
			}
			if (con != null && !con.isClosed()) {
				con.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

测试

public static void main(String[] args){
    String sql = "select * from tb_stu";
    ResultSet rs = MyJDBCUtil.excuteQuery(sql,null);
    while(rs.next()){
        System.out.priint(rs.getInt("id);
    }
    MyJDBCUtil.closeAll();
}
  

四、使用连接池操作数据库

1、不使用连接池缺点

每次CRUD操作都要使用数据库的时候,都要创建一个数据库连接对象;普通的JDBC数据库连接使用 DriverManager 来获取;每次向数据库建立连接的时候都要将 Connection 加载到内存中;然后再验证用户名和密码花费时间0.05s~1s左右;每次CRUD操作就向数据库要要一个连接

执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。

2、连接池原理

数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。与数据库连接

3、连接池分类

java中使用javax.sql.DataSource接口来表示连接池,DataSource和jdbc一样,也是只提供一个接口,由第三方组织来提供,DataSource数据源和连接池Connection Pool是同一个东西,只是叫法不一样而已

DBCP:Spring推荐,Tomcat的数据源使用的就是DBCP,也就是tomcat内置dbcp,单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar

C3P0:C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布;从2007年就没有更新了,性能比较差。

Druid:阿里巴巴提供的连接池-德鲁伊-号称最好的连接池,它里面除了这些, 还有更多的功能。

4、使用连接池

DBCP连接池

导入jar包

  • mysql-connector-java-5.0.4-bin.jar
  • commons-pool-1.5.6.jar
  • commons-dbcp-1.4.jar

src下编写database.properties文件

driverClassName

数据库名称

必填

url

数据库地址

必填

username

用户名

必填

password

密码

必填

maxActive

最大连接数量

选填

minldle

最小空闲连接

选填

maxldle

最大空闲连接

选填

initialSize

初始化连接

选填

工具类

package pojo;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;


public class DBCPUtils {
	private static DataSource dataSource;
	static{
		try {
			//1.加载找properties文件输入流
			InputStream is = DBCPUtils.class.getClassLoader().getResourceAsStream("database.properties");
			//(也可以使用流的方式加载)
			//FileInputStream is=  new FileInputStream("database.properties");
			//2.加载输入流
			Properties props = new Properties();
			props.load(is);
			//3.创建数据源
			dataSource = BasicDataSourceFactory.createDataSource(props);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	public static DataSource getDataSource(){
		return dataSource;
	}
	
	public static Connection getConnection(){
		try {
			return dataSource.getConnection();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

测试
public class Test {
	public static void main(String[] args) {
		System.out.println(DBCPUtils.getDataSource());
		System.out.println(DBCPUtils.getConnection());
	}
}

C3p0连接池

c3p0-0.9.2.1.jar  
mysql-connector-java-5.1.10-bin.jar  
mchange-commons-java-0.2.3.4.jar

src下编写配置文件properties和xml两种,建议xml,文件名称(固定)c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<!-- 默认配置 -->
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
	<property name="jdbcUrl">jdbc:mysql:///db_jdbcdemo</property>
	<property name="user">root</property>
	<property name="password">root</property>
	<property name="initialPoolSize">5</property>
	<property name="maxPoolSize">20</property>
  </default-config>
  <!-- 命名配置 -->
  <named-config name="lph"> 
    <property name="driverClass">com.mysql.jdbc.Driver</property>
	<property name="jdbcUrl">jdbc:mysql:///db_jdbcdemo</property>
	<property name="user">root</property>
	<property name="password">root</property>
  </named-config>
</c3p0-config>

属性

解释

acquireIncrement

当连接池中的连接耗尽的时候c3p0一次同时获取的连接数 默认为:3

acquireRetryAttempts

定义在从数据库获取新连接失败后重复尝试的次数 默认为:30

acquireRetryDelay

两次连接中间隔时间,单位毫秒 默认为:1000

autoCommitOnClose

连接关闭时默认将所有未提交的操作回滚 默认为:false

automaticTestTable

c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么

属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试使用 默认为:null

breakAfterAcquireFailure

获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效

保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试

获取连接失败后该数据源将申明已断开并永久关闭 默认为:false

checkoutTimeout

当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出

SQLException,如设为0则无限期等待。单位毫秒 默认为:0

connectionTesterClassName

通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径

默认为:com.mchange.v2.c3p0.impl.DefaultConnectionTester

factoryClassLocation

指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可 默认为:null

idleConnectionTestPeriod

每60秒检查所有连接池中的空闲连接 默认为:0

initialPoolSize

初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间 默认为:3

maxIdleTime

最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃 默认为:0

maxPoolSize

连接池中保留的最大连接数 默认为:15

maxStatements

JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements

属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。

如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭 默认为:0

maxStatementsPerConnection

maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数 默认为:0

numHelperThreads

c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能

通过多线程实现多个操作同时被执行 默认为:3

overrideDefaultUser

当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0

的数据源时 默认为null

overrideDefaultPassword

与overrideDefaultUser参数对应使用的一个参数 默认为:null

user

用户名 默认为: null

password

密码 默认为:null

preferredTestQuery

定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:

测试的表必须在初始数据源的时候就存在 默认为:null

propertyCycle

-用户修改系统配置参数执行前最多等待300秒 默认为:300

testConnectionOnCheckout

因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的

时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable

等方法来提升连接测试的性能 默认为:false

testConnectionOnCheckin

如果设为true那么在取得连接的同时将校验连接的有效性 默认为:false

工具类

package c3p0;

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

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Utils {
	//使用默认配置
	//private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
	//使用命名配置
	private static ComboPooledDataSource dataSource = new ComboPooledDataSource("lph");
	//获得连接池(数据源)
	public static DataSource getDataSource() {
		return dataSource;
	}
	//获得连接
	public static Connection getConn() {
		try {
			return dataSource.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException("连接获取错误");
		}
	}
}

测试
public class Test {
	public static void main(String[] args) {
		//获取连接池
		System.out.println(C3P0Utils.getDataSource());
		//获取连接对象
		System.out.println(C3P0Utils.getConn());
	}
}

Druid连接池

导入druid-1.1.2.jar

五、dbutils操作数据库

dbutils是Apache公司编写的数据库操作实用的工具,小巧,简单,实用,封装了对JDBC的操作,简化了JDBC操作;需要导入驱动包和commons-dbutils-1.6.jar

1、核心功能

QueryRunner中提供对sql语句操作的api

ResultSetHandler接口用于定义select操作后怎么封装结果集

DbUtils类,工具类 定义了关闭资源与事务处理方法

2、QueryRunner

QueryRunner(DataSource ds)或者QueryRunner();如果使用带参数的是提供数据源连接池,会自动帮你创建连接,没有参数是不用连接池的

2.1 Update(String sql,Object...obj)执行更新数据

添加

删除

修改

2.2 执行查询query(String sql, ResultSetHandler<T> rsh,Object...params)params数组可有可无 、可多可少  、可直接写或者传数组

3、ResultSetHandler查询操作和处理

第一种:new ArrayHandler()

第二种:new ArrayListHandler()

第三种:new BeanHandler<User>(User.class)

第四种new BeanListHandler<User>(User.class)

第五种new ColumnListHandler<>(“列名”)

第六种query(sql, new ScalarHandler())

第七种new MapHandler()

第八种new MapListHandler()

总结

query参数是连接对象、 sql语句、 ResultHandler接口的实现类、参数数组(一个/多个/没有/传递);query返回值 泛型,根据结果集处理类变化;说明:如果参数中有con就是没有使用连接池的

  • ArrayHandler:把结果集中的第一行数据转成对象数组。
  • ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
  • BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
  • BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。//重点
  • MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。//重点**
  • MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
  • ColumnListHandler:将结果集中某一列的数据存放到List中。
  • KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List),再把这些map再存到一个map里,其key为指定的列。
  • ScalarHandler:将结果集第一行的某一列放到某个对象中。//重点

4、DbUtils

DbUtils.closeQuietly(con);关闭资源

六、dbutils结合连接池操作数据库

导入jar以及配置文件

编写工具类

选择连接池中的工具列(工具类中的getConn方法可以去掉 只留下获取数据源的即可)

举例:不使用配置文件的德鲁伊工具类
import com.alibaba.druid.pool.DruidDataSource;
public class Pool {
	private static DruidDataSource dataSource = null;
	static {
		dataSource = new DruidDataSource();
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql://localhost:3306/1808?characterEncoding=utf-8");// 设置连接的数据库
		dataSource.setUsername("root");// 设置用户名
		dataSource.setPassword("");// 设置密码
	}

	public static DruidDataSource getDataSource() {
		return dataSource;
	}
}

测试

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayListHandler;

public class Test {
	//使用有参数的方法传递数据源
	private  static QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
	//插入操作
	public static void insert() {
		String sql = "insert into user(name,pass)values(?,?)";
		Object[] params  = {"xixi","345"};
		try {
			//此时不必要串连接对象
			int row  =qr.update(sql,params);
			System.out.println(row);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
	public static void select() {
		String sql = "select * from user";
		try {
			List<Object[]> list = qr.query(sql, new ArrayListHandler());
			for(Object[] ojbs:list) {
				for(Object obj:ojbs) {
					System.out.println(obj);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {	
		insert();
		select();
	}	
}

总结

QueryRunner里面要传递数据源对象,由工具类获取,操作和不用连接池一样,知识参数不再传递连接对象,操作数据库建议使用这种dbutils和和连接池结合的方式

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

java使用jdbc操作数据库 的相关文章

  • SQL Server Like 查询不区分大小写

    Query SELECT from Table 2 WHERE name like Joe Output 1 100 Joe 2 200 JOE 3 300 jOE 4 400 joe 为什么不区分大小写 Problem 查询不区分大小写
  • 唯一约束与唯一索引?

    之间有区别吗 CREATE TABLE p product no integer name text UNIQUE price numeric and CREATE TABLE p product no integer name text
  • 如何将 sql 数据输出到 QCalendarWidget

    我希望能够在日历小部件上突出显示 SQL 数据库中的一天 就像启动程序时突出显示当前日期一样 在我的示例中 它是红色突出显示 我想要发生的是 当用户按下突出显示的日期时 数据库中日期旁边的文本将显示在日历下方的标签上 这是我使用 QT De
  • 合并sql中的列

    我正在使用 SQL Server 2017 有一个存储过程 其中我有一个带有连接的简单选择 例如 SELECT p legacyKey AS JobNumber p Name AS JobName G Label AS DesignStat
  • 通过 SQLAlchemy 获取随机行

    如何使用 SQLAlchemy 从表中选择一个或多个随机行 这在很大程度上是一个特定于数据库的问题 我知道 PostgreSQL SQLite MySQL 和 Oracle 具有通过随机函数排序的能力 因此您可以在 SQLAlchemy 中
  • SQL Server 2012:有条件地增加计数器用户 ROW_NUMBER()

    我正在尝试申请ROW NUMBER 根据特定条件增加计数器 我的数据如下所示 目标计数器是Prep column id DSR PrepIndicator Prep 1662835 1 1 1 1662835 14 2 2 1662835
  • Extbase - 从查询中获取创建的sql

    我想从我的typo3 扩展中获取一些数据库表 该扩展基于 extbase 查询总是不返回任何内容 但数据存在 我试过这个 query this gt createQuery query gt statement SELECT FROM my
  • Magento --“SQLSTATE[23000]:违反完整性约束..”客户更新

    迁移服务器后 每次尝试更新客户信息时都会出现错误 我正在使用一个客户激活插件 http www magentocommerce com magento connect vinai extension 489 customer activat
  • 在 PostgreSql 中计算百分比

    例如我有一个这样的表 string adm A 2 A 1 B 2 A 1 C 1 A 2 通过 SQL 查询 我想要这样的结果 string perc adm A 50 B 100 C 0 我想要每个字符串中数字 2 出现的百分比 我可以
  • 如何连续添加起始行和下一行的值

    我只想创建一个 sql 查询 结果就像图片上的那样 类似于 SQL 中的斐波那契数列 Ex Column 1 10 则 Result 列的值为 Result 10 因为这是第一行 然后假设column1第二行的值为50 那么Result第二
  • SQL Server 2008 错误 233

    我正在使用以下 sql 脚本在 SQL Server 2008 中创建新登录名 CREATE LOGIN xyz WITH PASSWORD xyz DEFAULT DATABASE master DEFAULT LANGUAGE us e
  • 选择多列 按一列分组 按计数排序

    我在Oracle中有以下数据集 c1 c2 c3 1A2 cat black 1G2 dog red B11 frog green 1G2 girl red 试图得到以下结果 基本上我首先尝试获取具有重复 c1 的行 c1 c2 c3 1G
  • 带有可变 WHERE 子句的批量 UPDATE 表

    我有一堆值对 foo1 bar1 foo2 bar2 我想做一堆更新 将 foo 列设置为 foo1 其中 bar 列为 bar1 我正在使用 psycopg2 在 Python 中执行此操作 我可以executemany与查询UPDATE
  • Snowflake 中的动态 SQL

    当我在雪花中运行动态 SQL 时 遇到以下错误 未完成对 SQL MAIN 的分配 因为值超出了变量的大小限制 它的大小是263 限制为 256 内部存储大小以字节为单位 这是代码 SET v G 1 SET v G1 v G VARCHA
  • 3 个表的 SQL 查询(或联接)

    第一次在 Stack Overflow 上问问题 很棒的资源 但是只有一件事真正让我作为 SQL 新手感到困惑 我有三个表 我想获取与鲍勃的学生相关的所有导师的姓名 表 1 教师 ID Name 1 Bob 表 2 学生 STUDENT I
  • SQL Server:为什么 ISO-8601 格式的日期依赖于语言?

    我需要一些帮助来理解 SQL Server 中的日期格式处理 如果您尝试以下操作 它将返回正确的结果 SET LANGUAGE English SELECT CAST 2013 08 15 AS DATETIME 2013 08 15 00
  • SQL - 需要查找重复记录但排除反向事务

    我有一张交易表 偶尔会有 重复条目 如果 当管理员发现这些重复条目时 他们将撤销交易 从而创建负值 但由于监管要求 原始重复条目仍然保留 我想创建一个 SQL 查询 并使用 Crystal Reports 来制作报告 以便管理员轻松查找重复
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 更改mysql数据库表中的日期格式

    大家早上好 只是一个简单的问题 在我现有的 MySql 数据库中 我几乎没有包含日期 的列 目前这些是年 月 日格式 但现在我需要将其全部更改为年 月 日格式 我试过了select date format curdate d m Y 但它不
  • 在Oracle中使用IW和MM

    我使用 IW 表示每周结果 使用 MM 表示每月结果 但我总是收到错误 ORA 00979 not a GROUP BY expression 00979 00000 not a GROUP BY expression 我的疑问是这些 We

随机推荐

  • GoLang之”奇怪用法“实践总结

    2013 11 23 wcdj 0 摘要 本文通过对A Tour of Go的实践 总结Go语言的基础用法 1 Go语言 奇怪用法 有哪些 1 go的变量声明顺序是 先写变量名 再写类型名 此与C C 的语法孰优孰劣 可见下文解释 http
  • 销售心理学

    销售中的心理学 影响你一生的销售心理学书籍 要想钓到鱼 就要像鱼一样思考 在生活中 如果想钓到鱼 你就得像鱼那样思考 而不是像渔夫那样思考 当你对鱼了解得越多 你也就越来越会钓鱼了 这样的想法用在销售中同样适用 要知道 销售的过程其实就是销
  • 【Redis17】Redis进阶:管道

    Redis进阶 管道 管道是啥 我们做开发的同学们经常会在 Linux 环境中用到管道命令 比如 ps ef grep php 在之前学习 Laravel框架时的 Laravel6 4 管道过滤器https mp weixin qq com
  • Latex使用

    问题 在使用latex的过程中插入图片 在某些条件下 图片可能会出现越过后续的文字出现在下一页的页首 解决办法 在该tex文件首部加上 usepackage stfloats 然后参数设置成H如下 begin figure H center
  • 使用frp 实现内网穿透 & 将私人电脑变成一个服务器

    使用frp 实现内网穿透 frp 是什么 frp 是一个可用于内网穿透的高性能的反向代理应用 支持 tcp udp 协议 为 http 和 https 应用协议提供了额外的能力 且尝试性支持了点对点穿透 作用 比如你需要用到云服务器部署你的
  • 阅读GFS论文

    GFS论文发表距今已经十几年了 据之开源的hdfs也已经在业界得到了广泛应用 为了取得分布式系统的真经 拜读一下这篇经典论文 重要假设 软硬件失败乃家常便饭 我们写大文件 不屑小文件 文件改动的主流是追加新数据 随机写是非主流 一旦写完 仅
  • Neon Instruction C支持的向量运算

    转载请标明出处 https blog csdn net u013752202 article details 92008843 文章目的 快速索引到需要的向量运算 vadd gt ri ai bi 1 Vector add 正常指令 r a
  • pagehelper使用方法及参数说明

    pagehelper使用方法及参数说明 使用方法 Override public PageInfo
  • spring源码--10--IOC高级特性--autowiring实现原理

    spring源码 10 IOC高级特性 autowiring实现原理 1 Spring IoC容器提供了2种方式 管理Bean的依赖关系 1 1 显式管理 通过BeanDefinition的属性值和构造方法实现Bean依赖关系管理 1 2
  • vue学习笔记:在vscode中使用@提示路径

    在vscode中输入 后如果可以智能提示路径 可以有效防止路径名称输入错误 减少不必要的麻烦 效果如下图所示 安装 Path Autocomplete 插件后可以实现路径的智能提示 步骤如下 1 在vscode中查找Path Autocom
  • 关于shell运行python文件中的错误——shell脚本换行

    问题 https ask csdn net questions 7900411 spm 1001 2014 3001 5505 问题由来 由于工程需要在本地window中写 当需要比较少的算力时在本地跑 当需要比较大的算力时就需要在auto
  • K8S调用GPU资源配置指南

    06 09 K8S调用GPU资源配置指南 时间 版本号 修改描述 修改人 2022年6月9日15 33 12 V0 1 新建K8S调用GPU资源配置指南 编写了Nvidia驱动安装过程 2022年6月10日11 16 52 V0 2 添加K
  • 基于pytorch的手势识别

    本次实验主要是使用pytorch完成手势识别 网络包含两个隐藏层 第一层隐藏层有576个节点 第二层隐藏层有144个节点 输入784个节点 图片大小为28 28 输出10个节点 10种手势 目录 1 数据集处理 2 神经网络的建立 3 神经
  • 利用ajax添加到购物车代码,Woocommerce添加到购物车链接Ajax在其他帖子或页面中启用...

    要在自定义添加到购物车按钮中启用ajax 至少有3种方法 A simple HTML Ajax add to cart link Add to cart Using Woocommerce existing add to cart id 1
  • Axios 入门教程

    Axios Get Post 别名方式 Get Post Axios 引入 axios 的 js 文件 使用 axios 发送请求 并获取响应结果axios method get url then function resp alert r
  • 【NOIP2012】开车旅行(倍增)

    题面 Description 小A 和小B决定利用假期外出旅行 他们将想去的城市从1到N 编号 且编号较小的城市在编号较大的城市的西边 已知各个城市的海拔高度互不相同 记城市 i的海拔高度为Hi 城市 i 和城市 j 之间的距离 d i j
  • var、let、const的区别

    var let const的区别 大体区别 const定义的变量不可以修改 而且必须初始化 var定义的变量可以修改 如果不初始化会输出undefined 不会报错 var定义的变量没有块的概念 可以跨酷爱访问 不能跨函数访问 let是块级
  • 【华为OD机试真题】投篮大赛(C++&java&python)100%通过率 超详细代码注释 代码优化

    华为OD机试真题 2022 2023 真题目录 点这里 华为OD机试真题 信号发射和接收 试读 点这里 华为OD机试真题 租车骑绿道 试读 点这里 投篮大赛 知识点字符串 时间限制 1s空间限制 256MB限定语言 不限 题目描述 你现在是
  • dbnet训练_1215

    https blog csdn net hhhhhhhhhhwwwwwwwwww article details 123904386 ops request misc 257B 2522request 255Fid 2522 253A 25
  • java使用jdbc操作数据库

    一 概述 为了持久化 方便管理数据 出现了mysql sqlserver等多种数据库 我们可以直接这些数据库中使用sql语言增删改查管理数据 但是对于业务人员来说不懂sql 没法通过sql直接在数据库操作 所以我们要通过程序提供对数据库的操