首页 > 数据库 >数据库连接

数据库连接

时间:2023-07-08 16:24:26浏览次数:54  
标签:String rs 数据库 update sql null 连接 conn

数据库连接:

原始方式:

原始的方式:getConnection()===>connection===>statement===>**statement*(executeQuery(sql);executeUpdate(sql);)

通过statement来获取结果rs或者int。
public static void main(String[] args) {
        //把它们提出来是为了下面能关闭资源,代码的作用范围{}    
	   	Connection connection=null;
		Statement statement=null;
		ResultSet rs=null;
		try {
			//1、加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			
			//2、建立连接
			String url="jdbc:mysql://localhost:3306/javatest";
			String user="root";
			String password="root";
			//自动创建对象ctrl+1
			connection = DriverManager.getConnection(url, user, password);
			
			//3、创建对象
			statement = connection.createStatement();
			
			//4、执行sql语句
			String sql="SELECT * FROM test";
			
			
//			1、select
			rs = statement.executeQuery(sql);
			while(rs.next()) {//这里返回的是一个boolean类型的值
				//两种方式标志,一是行数从1开始,二是列名。
				System.out.println(rs.getInt(1)+rs.getString(2)+" "+rs.getString("psd"));
				
			}
            
//            2、insert、update、delect
             修改+删除+插入:statement.executeUpdate(sql);。插入的话如果有自增的的属性(id),换成null。
			 int n = statement.executeUpdate(sql);//n表示受影响的行数;
           
            
            
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
				try {
					if(rs!=null)
						rs.close();
					if(statement!=null)
						statement.close();
					if(connection!=null)
						connection.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			
		}
	}

进步方式:防止SQL注入

方式:getConnection()===>connection===>PreparedStatement===>
**PreparedStatement(executeQuery(sql);executeUpdate(sql);)

通过PreparedStatement来获取结果rs或者int。
public static void main(String[] args) {
        //把它们提出来是为了下面能关闭资源,代码的作用范围{}    
	   	Connection connection=null;
		PreparedStatement ps=null;
        ResultSet rs=null;

    
		try {
			//1、加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			
			//2、建立连接
			String url="jdbc:mysql://localhost:3306/javatest";
			String user="root";
			String password="root";
			//自动创建对象ctrl+1
			connection = DriverManager.getConnection(url, user, password);
			
            String sq3="SELECT dothing,dotime FROM dothing WHERE carnumber=?";
            ////////////////////////////////////////////精华
			ps = connection.prepareStatement(sq3);
            /////////////////////////////////////////////
			ps.setString(1, carnumber);
			
            
//            1、select
			rs = ps.executeQuery();
			while(rs.next()) {
				dothing=dothing+rs.getString(2)+"\n"+rs.getString(1)+"\n";
			}
            
//            2、insert、update、delect
            int i=ps.executeUpdate();
            
            
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
				try {
					if(rs!=null)
						rs.close();
					if(ps!=null)
						ps.close();
					if(connection!=null)
						connection.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			
		}
	}

关闭类:解决后面的繁琐关闭流程

public class Utils {
	//Closeable是一个接口实现了所有的流类,Closeable 是可以关闭的数据源或目标。调用 close 方法可释放对象保存的资源(如打开文件)。 
	public static void close(Closeable...closeables) {
		for(Closeable closeable:closeables) {
			if(closeable!=null)
				try {
					closeable.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
 
}

配合数据库连接池(druid)来配置jdbc:

文件配置:

image-20230702213310988

    //1. 获取Connection
    //3. 加载配置文件
    Properties prop = new Properties();
    prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
    //4. 获取连接池对象
    DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
    //5. 获取数据库连接 Connection
    Connection conn = dataSource.getConnection();
public void testUpdate() throws Exception {
    // 接收页面提交的参数
    
    //1. 获取Connection
    //3. 加载配置文件
    Properties prop = new Properties();
    prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
    //4. 获取连接池对象
    DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
    //5. 获取数据库连接 Connection
    Connection conn = dataSource.getConnection();
    //2. 定义SQL
    String sql = " update tb_brand\n" +
        "         set brand_name  = ?,\n" +
        "         company_name= ?,\n" +
        "         ordered     = ?,\n" +
        "         description = ?,\n" +
        "         status      = ?\n" +
        "     where id = ?";

    //3. 获取pstmt对象
    PreparedStatement pstmt = conn.prepareStatement(sql);

    //4. 设置参数
    pstmt.setString(1,brandName);
    pstmt.setString(2,companyName);
    pstmt.setInt(3,ordered);
    pstmt.setString(4,description);
    pstmt.setInt(5,status);
    pstmt.setInt(6,id);

    //5. 执行SQL
    1、select
    int count = pstmt.executeUpdate(); // 影响的行数
    
    2、insert、update、delect
    ResultSet rs = pstmt.executeQuery();
    while (rs.next()){
        //获取数据
        int id = rs.getInt("id");
        
    }
    
    
    
    //6. 处理结果
    System.out.println(count > 0);

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

事务java代码:

一般对于增删改

语法:

  • 开启事务

    START TRANSACTION;
    或者  
    BEGIN;
    
  • 提交事务

    commit;
    
  • 回滚事务

    rollback;
    
SELECT * FROM shiwu_test;

update shiwu_test set money=1000 where name='zwk';
update shiwu_test set money=1000 where name='zcm';

BEGIN

update shiwu_test set money=money-500 where name='zwk';

update shiwu_test set money=money+500 where name='zcm';

--ROLLBACK;//连接时try-catch,该行代码放到catch里面,MySQL如果中间语句出错了,下面的代码不会执行

--COMMIT;

优秀博客:

https://blog.csdn.net/qq_34577961/article/details/128944768

Java代码:


    @Test
    public void updateTest(){
        Connection conn = null;
        try{
            conn = ConnectUtil.getConnection();
            conn.setAutoCommit(false);////////////////////////精华
            String sql1 = "UPDATE Scores set score = score - 100 where  id = ?;";
//            System.out.println(10 / 0);//////////////////////精华
            String sql2 = "UPDATE Scores set score = score - 100 where  id = ?;";
            update(conn,sql1,1);///////////////////////////////精华,update方法在下面,弄成一个方法方便执行多行SQL语句
            update(conn,sql2,2);
            conn.commit();/////////////////////////////////精华,语句出现问题了就不会执行下去了Java异常和MySQL都是
            System.out.println("事务处理成功");
        }catch (Exception exception){
            exception.printStackTrace();
            try{
                conn.rollback();////////////////////////////精华
            }catch (Exception e){
                e.printStackTrace();
            }
        }finally {
            try {
                // 针对连接池可能使用到同个连接,因此需要重新将连接设置会自动提交,避免影响其他操作
                conn.setAutoCommit(true);/////////////////////////////////////精华
            }catch (Exception e){
                e.printStackTrace();
            }
            
            ConnectUtil.closeConnection(conn,null,null);
            System.out.println("资源关闭");
        }
    }



public int update(Connection conn, String sql, Object... args){
        PreparedStatement ps = null;
        try{
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i+1,args[i]);
            }
            return ps.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            ConnectUtil.closeConnection(null,ps,null);
        }
        return 0;
    }

在这里注意上面代码的优美:
    update(conn,sql1,1);
    for (int i = 0; i < args.length; i++) {  //这行代码的作用是一下设置sql语句里的??(update传入的第三个和以后的参数,这里的Object... args也很优美)
                ps.setObject(i+1,args[i]);
            }

标签:String,rs,数据库,update,sql,null,连接,conn
From: https://www.cnblogs.com/zhouliu6/p/17537396.html

相关文章

  • 麒麟V10服务器PHP连接MySQL报错PHP Warning: mysqli_connect(): Unexpected server r
     1.问题描述这个警告表示在进行缓存的caching_sha2认证过程中,服务器返回了一个意外的响应码99。这是由于MySQL服务器的配置或版本与使用的客户端库不兼容导致的。2.解决办法a.检查MySQL客户端版本:确保你使用的MySQL客户端版本与服务器版本兼容。如果......
  • 香橙派ubuntu连接wifi
    一、使用nmcli命令1.首先搜索附近wifi:nmclidevwifiesp32是我要连接的wifi2.连接wifinmclidevwificonnectxxxpassword***//xxx为wifi名,***为密码,nmclidevwificonnectesp32password15016474776连接成功手机查看:......
  • 解决远程主机的默认 shell 为 fish 时,vscode remote 无法连接的问题
    问题描述我主要用的shell就是fish,主打一个开箱即用,虽然也配置过zsh,但是感觉配置好的zsh在易用性上也就是fish的水平。此前,一直以来默认的shell都是bash,ssh或者vscoderemote远程连接上去之后,再输入fish来进行手动切换,后来嫌麻烦,就执行chsh-s/usr/bin/fish将......
  • 手把手教学小型金融知识图谱构建:量化分析、图数据库neo4j、图算法、关系预测、命名实
    手把手教学小型金融知识图谱构建:量化分析、图数据库neo4j、图算法、关系预测、命名实体识别、CypherCheetsheet详细教学等效果预览:1.知识图谱存储方式知识图谱存储方式主要包含资源描述框架(ResourceDescriptionFramework,RDF)和图数据库(GraphDatabase)。1.1资源描述框......
  • 查看sql server数据库连接情况
    SELECT*FROM[Master].[dbo].[SYSPROCESSES]WHERE[DBID]IN(SELECT[DBID]FROM[Master].[dbo].[SYSDATABASES]WHERENAME='你的数据库名称')系统存储过程SP_WHO提供关于当前 Microsoft?SQLServer?  用户和进程的信息。可以筛选返回的信......
  • 从“存算一体”到“存算分离”:金融核心数据库改造的必经之路
    科技云报道原创。近年来,数据库国产化趋势愈发明显,上百家金融业试点单位在数据库国产化的进程中,进一步增强信心,向50%国产化率大步迈进。但随着数据库国产化的深入,一些金融机构采用国产数据库+服务器本地盘的“存算一体”部署策略,逐渐在实践中暴露出短板,难以满足金融核心的场景需求。......
  • 数据库-八股文
    索引的基本原理-√1.索引对应列进行排序2.将排序结果建立倒排表3.将数据地址链拼接到倒排表上4.查询的时候,拿到倒排表,查询到数据地址链,最后取到需要的数据索引的设计原则1.类型不多的列没必要建索引,占空间,效果还不好2.由于索引也是要占空间的,而且索引建立完毕以后,之后......
  • PostgreSQL向量数据库pgvector之ivfflat实践
    前言ChatGPT、OpenAI和大型语言模型(LLM)应用的不断普及,将近似近邻搜索(ANN)的概念推向了前沿,并由于嵌入的使用,引发了人们对向量数据库的重新关注。嵌入是短语的数学表示,它将语义捕捉为数值的向量量,鉴于嵌入通常由一千多个维度组成--OpenAI的维度为1,536,因此必须开发新的技术。目前还没......
  • SQL数据库-新增字段时,默认值依然为NULL
    SQL数据库-新增字段时,给默认值的方法代码如下:altertable表名ADD字段intNOT NULLDEFAULT 0alter table表名 ADD 字段 numeric(18, 4) NOT NULL DEFAULT 0;注:特点是:notnull ,如果是null,是不会赋默认值0的,如果是notnull,就会赋默认值0......
  • 恢复oracle数据库DROP表误删除的数据 注意此时的表名称已经被重新命名,table_name和obj
    恢复oracle数据库DROP表误删除的数据注意此时的表名称已经被重新命名,table_name和object_name就是回收站中的存放表名。https://blog.csdn.net/qq_34253619/article/details/124434357数据恢复方法的原理是因为oracle数据库在删除表时会将删除信息存放于某虚拟“回收站”中而......