精华内容
下载资源
问答
  • ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java0531?characterEncoding=utf-8&useSSL=true"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).set...
     public static void main(String[] args) throws SQLException {
            Scanner scan1 = new Scanner(System.in);
            System.out.println("需要更改的学生ID");
            int id = scan1.nextInt();
            System.out.println("更改学生姓名为");
            String name = scan1.next();
            System.out.println("更改的学生班级为");
            int classId = scan1.nextInt();
            DataSource dataSource = new MysqlDataSource();
            ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java0531?characterEncoding=utf-8&useSSL=true");
            ((MysqlDataSource)dataSource).setUser("root");
            ((MysqlDataSource)dataSource).setPassword("******");
            Connection connection = dataSource.getConnection();
            String sql =  "update student set name = ?, classId = ? where id = ?";
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setString(1,name);
            statement.setInt(2,classId);
            statement.setInt(3,id);
            int ret = statement.executeUpdate();
            if(ret == 1) {
                System.out.println("更改成功");
            } else {
                System.out.println("更改失败没有找到该用户");
            }
            statement.close();
            connection.close();
        }
    
    展开全文
  • 楼主使用的 sqlserver 数据库,不支持 insert or uodate,但是楼主需要完成批量的数据操作,从前端拿到数据集合,从数据库拿到已...这里说明一下,由于是因为使用了sqlerver 数据库,数据相同的情况下进行update 会...

    楼主使用的 sqlserver 数据库,不支持 insert or uodate,但是楼主需要完成批量的数据操作,从前端拿到数据集合,从数据库拿到已有的数据集合,进行比对,如果主键相同并且其他字段不同,则进行更新,如果所有字段都相同即忽略,其他情况就都是插入,以下的图是数据示例:

     

    【方法一】

    这里说明一下,由于是因为使用了sqlerver 数据库,数据相同的情况下进行update 会返回1 也就是数据库仍然会进行一次操作。在mysql里则会返回0,所以如果是使用的mysql,就不用考虑数据相同的情况了,直接update即可

    		for (Map data : incomeData) { //遍历从前端拿到的数据
    			boolean bo_insert = false;  //标记是否做插入操作
    			boolean bo_update = false; //标记是否需要更新
    			boolean bo_nothing = false;
    			String staff_id2 = (String)data.get("staff_id");
    			String yearmon2 = (String)data.get("yearmon");
    			BigDecimal ratio2 ;
    			if (data.get("ratio") instanceof Double) {
    				 ratio2 = new BigDecimal((Double)data.get("ratio"));
    			}else{
    				ratio2 = new BigDecimal((Integer)data.get("ratio"));
    			}
    			for (Map map : ratioList) { //遍历从数据库拿到的数据
    				String staff_id = (String)map.get("staff_id");
    				String yearmon = (String)map.get("yearmon");
    				BigDecimal ratio = (BigDecimal)map.get("ratio");
    				//主键相同且其他字段不相同,标记为 更新
    				if (staff_id.equals(staff_id2)&&yearmon.equals(yearmon2)&&ratio2.compareTo(ratio)!=0) {bo_update = true;}
    				//全部字段相同,标记为 忽略
    				if (staff_id.equals(staff_id2)&&yearmon.equals(yearmon2)&&ratio2.compareTo(ratio)==0) {bo_nothing = true;}
    			}
    			//不是更新操作 也不是忽略操作,标记为插入
    			if (!bo_update&&!bo_nothing) {bo_insert = true;}
    			
    			if (bo_insert) {//插入操作
    
    			} 
    			
    			if(bo_update){//修改操作
    
    			}
    		}

     

    【方法二(推荐)】

     

    原本的数据结构(示例):

    [{rdproj_id:1001,yearmon:201801,staff_id:2001,ratio:0.5},{rdproj_id:1001,yearmon:201802,staff_id:2001,ratio:0.8}]

    现在将其改造成以下结构

    {1001:{{201801:{2001:0.5}},{201802:{2001:0.8}}}}

    这样我们就可以通过一层一层的 map.get("")方法来进行比较,比如,我现在想要比较的数据是

    {rdproj_id:1002,yearmon:201801,staff_id:2001,ratio:0.5}

    那么,很明显在第一层 map.get("1002")时就会返回null,那么,这一组数据可以直接判定为insert操作。

    注意:在这个方法里,我没有再去忽略完全相同的记录。将其归为了update

    public class MemoryContainer {
    
            //准备一个内存容器
    	public static Map<String, Map<String, Map<String, Double>>> staffRatioMap = new HashMap<String, Map<String, Map<String, Double>>>();
    	//准备一个将list转为map
    	public static void putStaffRatioMap(List<Map> ratioList){
            for (Map map : ratioList) {
                String project_id = (String) map.get("rdproj_id");
                String ym = (String) map.get("yearmon");
                String staff_id = (String) map.get("staff_id");
                Double ratio ;
    			if (map.get("ratio") instanceof Double) {
    				ratio = (Double)map.get("ratio");
    			}else if (map.get("ratio") instanceof Integer) {
    				int r = (Integer)map.get("ratio");
    				if (r==0) {ratio = 0.0;}else{ratio = 1.0;}
    			}else {
    				BigDecimal r = (BigDecimal)map.get("ratio");
    				ratio = r.doubleValue();
    			}
    			
                Map<String, Map<String, Double>> ymmap;
    			
                Map<String, Double> smap;
    			
                if (CMYUtils.isEmpty(ymmap = MemoryContainer.staffRatioMap.get(project_id))){
                    smap = new HashMap<String, Double>();
                    smap.put(staff_id, ratio);
                    ymmap = new HashMap<String, Map<String, Double>>();
                    ymmap.put(ym, smap);
                    MemoryContainer.staffRatioMap.put(project_id, ymmap);
                } else {
                    if (CMYUtils.isEmpty(smap = ymmap.get(ym))) {
                    	smap = new HashMap<String, Double>();
                    	smap.put(staff_id, ratio);
                        ymmap.put(ym, smap);
                    } else {
                        if(CMYUtils.isEmpty(smap.get(staff_id))){
                            smap.put(staff_id,ratio);
                        }
                    }
                }
            }
    	}
    }
    
    		Map<String, Map<String, Map<String, Double>>> menoryRec = MemoryContainer.staffRatioMap;
    		if (menoryRec.size()==0) {//如果内存中没有,查数据库,并且存入内存
    				List<Map> ratioList = businessMapper.selectStaffRatio(inDto);
    				MemoryContainer.putStaffRatioMap(ratioList);
    				menoryRec = MemoryContainer.staffRatioMap;
    		}
    	   Map<String, Map<String, Double>> rec = menoryRec.get(incomeData.get(0).get("rdproj_id"));
    	   if (CMYUtils.isEmpty(rec)) { //如果第一层比对就为null,做插入操作
    		   MemoryContainer.putStaffRatioMap(incomeData);
    		   for (Map webData : incomeData) {
                         //insert方法
                       }
    	   }else{
    		   for (Map webData : incomeData) { //遍历 前台拿到的数据
    			   boolean bo_insert = true;
    			   String webStaff = (String)webData.get("staff_id");
    			   String webYearMon = (String)webData.get("yearmon");
    			   Double ratioDouble;
    			   if (webData.get("ratio") instanceof Double) {
    				   ratioDouble = (Double)webData.get("ratio");
    			   }else {
    				   if ((Integer)webData.get("ratio")==1) {
    					   ratioDouble = 1.0;
    				   }else{
    					   ratioDouble = 0.0;
    				   }
    			   }
    			   if (CMYUtils.isNotEmpty(rec.get(webYearMon))) {
    				   Map<String, Double> staff = (Map) rec.get(webYearMon);
    				   if (CMYUtils.isNotEmpty(staff.get(webStaff))) {bo_insert = false;}//标记为更新操作
    				   staff.put(webStaff, ratioDouble);//往内存存入数据,有则覆盖(修改),无则添加
    			   }else{
    				   Map<String,Double> sMap = new HashMap<String, Double>();
    				   sMap.put(webStaff, ratioDouble);
    				   rec.put(webYearMon, sMap);//往内存添加数据。
    			   }
    			   
    			   if (bo_insert) {
                                   //insert方法
    			   }else {
                                  //更新方法
    			   }
    		   }
    	   }

    我在做更新或者插入操作的同时,内存容器 staffRatioMap 也在做同样的动作,所以,在下一次调用这个方法时,staffRatioMap里的数据和数据库是同步的,在项目重启前完全不需要再访问数据库了。


     

    展开全文
  • 一,基本 SQL语句:增:INSETRInsert into 表名 (name,age) values (‘luoge’,25)删:DeleteDelete from 表名 where id=6查:Query select * from 表名改:updateUpdate 表名 set age=26 where id=1二,用单元测试...

    一,基本 SQL语句:

    增:INSETR

    Insert into 表名 (name,age) values (‘luoge’,25)

    :Delete

    Delete from 表名 where id=6

    查:Query

     select * from 表名

    改:update

    Update 表名 set age=26 where id=1

    二,用单元测试测试SQL增,删,改,查功能代码

    1.定义一个类(例:Testxxx)

    2.添加junit支持(右键工程项目,选择add build path--junit--junit4)

    3.在方法上面添加注释,其实就是一个标记;

    @Testpublic void testxxx() {---------}

    4.在光标处选中方法名字,然后右键执行单元测试,或者在控制面板outline选中方法运行;(window--show vie)

    如图所示:

    942b99cd0cb44c6f9efec7c2374c786e.png

    三,测试类的增,删,改,查测试代码

    1.查询测试

    package com.luo.jdbc.test;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;import com.luo.jdbc.util.JDBCUtil;public class TestDemo { //执行查询操作 public void testQuery() { Connection conn=null; Statement st=null; ResultSet rs=null; try { //1.获取连接对象 conn = JDBCUtil.getConn(); //2.创建Statement对象 st = conn.createStatement(); //3.执行SQL语句,返回ResultSet String sql="select * from t_student1"; rs = st.executeQuery(sql); //4.遍历查询,输出结果集 while(rs.next()) { int id=rs.getInt("id");//id String name=rs.getString("name");//姓名 int age=rs.getInt("age");//年龄 String gender=rs.getString("gender");//性别 System.out.println("编号:"+id+";姓名:"+name+";年龄:"+age+";性别:"+gender); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally { //5.释放资源 JDBCUtil.release(conn, st, rs); } }

    2.添加数据测试

     @Test //执行添加操作 public void testInsert(){ Connection conn=null; Statement st=null; //ResultSet rs=null; try { //1.获取连接对象 conn = JDBCUtil.getConn(); //2.创建Statement对象 st = conn.createStatement(); //3.执行SQL添加语句 String sql="insert into t_student1 values (3,'胡颖',26,'女')"; int rs= st.executeUpdate(sql); if(rs > 0) { System.out.println("数据添加成功!"); }else { System.out.println("数据添加失败!"); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally { //5.释放资源 JDBCUtil.release(conn, st); } }

    3.删除数据测试

     @Test public void testDelete(){ Connection conn=null; Statement st=null; //ResultSet rs=null; try { //1.获取连接对象 conn = JDBCUtil.getConn(); //2.创建Statement对象 st = conn.createStatement(); //3.执行SQL删除语句, String sql="delete from t_student1 where name='伦纳德'"; //影响的行数 int result= st.executeUpdate(sql); if(result > 0) { System.out.println("数据删除成功!"); }else { System.out.println("数据删除失败!"); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally { //5.释放资源 JDBCUtil.release(conn, st); } }

    4.更改数据测试

    @Test //执行更改操作 public void testUpdate(){ Connection conn=null; Statement st=null; try { //1.获取连接对象 conn = JDBCUtil.getConn(); //2.创建Statement对象 st = conn.createStatement(); //3.执行SQL更改语句, String sql="update t_student1 set age=25 where name='王洋'"; //影响的行数 int result= st.executeUpdate(sql); if(result > 0) { System.out.println("数据更新成功!"); }else { System.out.println("数据更新失败!"); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally { //5.释放资源 JDBCUtil.release(conn, st); } }}
    展开全文
  • java实现mysql行级锁

    2020-05-20 00:22:53
    1.mysql中的行级锁是由以下sql语句产生: select * from job_info where id = 1 for update; 主要加上了for update,其中id为主键。 如果查询条件不是主键,则会成为表锁。 2.悲观锁和乐观锁 悲观锁虽然能保证数据...

    1.mysql中的行级锁是由以下sql语句产生:
    select * from job_info where id = 1 for update;
    主要加上了for update,其中id为主键。
    如果查询条件不是主键,则会成为表锁。

    2.悲观锁和乐观锁
    悲观锁虽然能保证数据一致,可是如果进程从读取到更新的时间太长,会导致其他进程等待时间较长,使得系统效率降低。如有重试机制,也可能会耗光数据库连接数。

    乐观锁,是为数据库表增加一个标识数据版本的version字段来实现的,读取数据时把version字段一同读出,写入数据库时比对version字段就知道数据是否被更改过,如果version不相等就说明持有的是过期数据,不能写入,如果相等就可以写入,并把version加一。

    所以,悲观锁和乐观锁各有特色,视具体业务选择。

    3.Spring Data JPA和锁
    @Version – 实体类中用在version字段(类型必须为long/int/short/java.sql.Timestamp)
    @Lock – 用在CrudRepository接口中的方法上,
    LockModeType有以下枚举值:
    NONE: No lock.
    OPTIMISTIC: Optimistic lock.
    OPTIMISTIC_FORCE_INCREMENT: Optimistic lock, with version update.
    PESSIMISTIC_FORCE_INCREMENT: Pessimistic write lock, with version update.
    PESSIMISTIC_READ: Pessimistic read lock.
    PESSIMISTIC_WRITE: Pessimistic write lock.
    READ: Synonymous with OPTIMISTIC.
    WRITE: Synonymous with OPTIMISTIC_FORCE_INCREMENT.
    参考:Spring Boot2+JPA之悲观锁和乐观锁实战

    4.SpringBoot使用@Transactional

    • mysql默认引擎MyISAM不支持事务,需要指定InnoDB
    • 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,
    • 应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。
    • 不要在接口上声明@Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。
    • 不要图省事,将@Transactional放置在类级的声明中,放在类声明,会使得所有方法都有事务。故@Transactional应该放在方法级别,不需要使用事务的方法,就不要放置事务,比如查询方法。否则对性能是有影响的。
    • 使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。
    • spring的事务在抛异常的时候会回滚,如果是catch捕获了,事务无效。可以在catch里面加上throw new RuntimeException();
    • 最后有个关键的一点:和锁同时使用需要注意:由于Spring事务是通过AOP实现的,所以在方法执行之前会有开启事务,之后会有提交事务逻辑。而synchronized代码块执行是在事务之内执行的,可以推断在synchronized代码块执行完时,事务还未提交,其他线程进入synchronized代码块后,读取的数据不是最新的。所以必须使synchronized锁的范围大于事务控制的范围,把synchronized加到Controller层或者大于事务边界的调用层!
      参考文章:SpringBoot 使用 @Transactional 注解配置事务
    展开全文
  • 2019年8月6日17:28:07 sql 不知道怎么写,也没去...直接用jdbc实现。 查询出来的值,直接根据update条件更新,写在一个方法里 public static void GetWeiLiaoMsg(String day) { try { conn = MysqlJdbc_sys...
  • 以下讨论全部针对Mysql数据库:)通常业务上至少需要两种类型的不重复插入记录的需求:如果某些关键字段已经在Mysql中存在了,不要重复插入,而是改为更新某些字段。... on duplicate key update ... 语法(Mysql自己...
  • public classJDBCTest {public static voidmain(String[] args){//add(uname, ...//update("李诗诗","lishishi@com","666");//show();del("王小五");}//插入操作public static intadd(String uname,String uemail,S...
  • 行锁mysql实现行级锁的两大前提就是,innodb引擎并且开启事务。由于MySQL/InnoDB的加锁分析,一般日常中使用方式为: select .... from table where ..... for update 语句并且在 Repeatable Read 事务隔离级别下。...
  • 倒回去再重试验一把《Netty 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》...
  • mysql行级锁 java 实现

    千次阅读 2019-06-27 21:04:05
    mysql行级锁: 数据库引擎: InnerDB,其他的不支持行锁 所在方法要加上事务注解, 必须加上: @Transactional(isolation = Isolation.READ_COMMITTED) 查询sql举例: select * from global_lock where ...
  • package study.java; import java.util.List; import java.util.Map; public interface DatabaseFactory { /** * 查询数据 * @param sql * 查询SQL * @return * 结果集 */ public List, Object>> ...
  • 一直认为mysql更新操作会返回实际修改数量(affected rows), 但是最近在mybatis项目中发现... 不管什么orm框架其底层都是使用mysql官方提供的驱动jar包实现的与数据库的通讯, 所以我们要研究下关于驱动的文档. mysq...
  • package study.java; import java.util.List; import java.util.Map; public interface DatabaseFactory { /** * 查询数据 * @param sql * 查询SQL * @return * 结果集 */ public List, Object>> ...
  • Java+MySQL小项目(实现登录、注册、删除用户以及修改密码功能) 没错!!!我刚开始写报了一堆错 先是这个 然后我一搜这个问题 发现了错误在 因为一个这个例子 于是 我!把注册 删除等等都用了这个executeQuery...
  • JAVA连接mysql简单例子

    2019-06-04 20:34:36
    使用java连接mysql数据库,实现insert,delete,update,select基本功能。 二.主要步骤 加载驱动 Class.forName(JDBC_DRIVER); 连接数据库 Connection conn = DriverManager.getConnection(DB_URL,USER,PASS); ...
  • 1. mysql jdbcsql语言分类: 数据定义语言(DDL):create,alert,drop 数据操作语言(DML):insert,update,delete等语句 数据查询语言(DQL):select 等 数据控制语言(DCL):grant,revoke,commit,...
  • 场景如下: ...这里如果发生并发问题,那么会造成用户余额和实际交易的不一致,这对公司和客户来说都... 当需要变更余额时,通过代码在事务中对当前需要更新的记录设置for update行锁,然后开始正常的查询和更新操作 ...
  • 本想通过sql语句实现发现不行,参考语句如下: update mo_indexes a,mo_paf_indexmid_indexname b set a.index_name='2' where a.index_id=b.index_id and b.index_id in(106749314,106749317); update mo...
  • 目录 1.使用Navicat进行表结构同步1.Navicat连接SqlServer2.进行表结构同步3.使用工具类优化SqlServer建表语句1.id自增长2....因某些原因最近需要把mysql转换为SqlServer数据库,以下为进行转换的过程及遇到的坑
  • MySQL悲观锁 select for update实现秒杀案例(jfinal框架)发布时间:2018-08-17作者:laosun阅读(4287)为了方便测试,博主使用最新的jfinal框架,里边的东西就修改了一下a_little_config.txt,配置数据库链接的,启动...
  • 批量更新操作批量更新逻辑:底层真正的批量更新(一次请求发送批量更新语句)底层循环发送语句(假批量更新)—本质上就是一条一条更新批量更新逻辑判断... batchUpdate(Stringsql,finalBatchPreparedSt...
  • package com.yh.mysql;import java.io.File;.../*** @Description: 执行mysql的数据导出* @Author: yh* @CreateDate: 2018/4/28 11:39* @UpdateUser: yh.z* @UpdateDate: 2018/4/28 11:39* @Update...
  • package com.yh.mysql;import java.io.File;.../*** @Description: 执行mysql的数据导出* @Author: yh* @CreateDate: 2018/4/28 11:39* @UpdateUser: yh.z* @UpdateDate: 2018/4/28 11:39* @Update...
  • java连数据库实现删除用户信息功能和更改用户信息功能 类: Delete类、 UpDate类、 Main类、 Delete类: public class Delete { public ArrayList<Join> delete(String name) { ArrayList<Join> list...
  • /*** 过滤SQL参数,防止特殊字符引发的异常和SQL注入* 只适用于MySQL数据库* @author sodarfish* @since 2008.1.21* @update 2008.1.24*/public class SQLFilter{ public static final int NUMBER_FOR_QUERY=0;...
  • mysql服务器的数据复制到一个或者多个从服务器上,从而实现灾难恢复,水平扩展, 统计分析,远程数据分发等一些功能。 二进制日志文件中的存储的内容被称之为事件,数据库在每次进行(update,add,delete)时候...
  • 1、什么是JavaBean JavaBean是一种Java语言写成的

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 266
精华内容 106
关键字:

java实现mysqlupdate

java 订阅
mysql 订阅