oracle 如何实现一个table,每个用户select * from 表名;查询的结果不同,注意没有where 条件 5C

oracle 如何实现一个table,每个用户进行查询看到的结果不同;只有管理员可以看到所有的内容
比如说:system用户(或sys)创建了一个表 test;
hr,scott,oe 等非dba权限的用户分别进行多次insert操作
scott用户执行 select * from 该表test;(注意没有where条件)只能看见自己dml后的结果,不能看到hr用户执行DML后的数据,只能update ,delete 自己的数据,
hr用户执行 select * from 该表test;(注意也没有where条件)也只能看见自己dml后的结果,不能看见scott用户的操作,只能update ,delete 自己的数据,
sys或system用户 select * from test; 能看见所有用户DML后的操作,
除sys或system用户外,所有的用户都不能drop table test ;只有sys或system才能drop table test
请问 如何实现上述问题,该用 oracle的什么技术实现??

4个回答

可以试一下临时表,两个会话不会相互影响,不知道对你有没有用

这个问题很好解决,当前最好的做法是将sql解析成语法树,然后根据你的逻辑改写sql,最后执行sql。
当前最好的工具是druid-parser,支持常用的数据库SQL

我认为,您应该需要这份资料:https://www.cnblogs.com/yzqm666/p/5886925.html
这是一份关于oracle的权限控制方面的资料,对于您的这个需求,我并不是很理解,如果不是必要的话,我还是推荐您分开建表,这样更安全些,效率也会更高,如果您非要这样使用的话,我推荐您在字段后面加一个权限字段,假设为a,根据每个用户执行的命令,去分开处理,如,管理员使用select * from test;时,实际代码为select * from test and a = '1';像是这样字,另一个用户可能就是=2,=3这样子,我们在他执行之前给他在sql命令后面加上一段关于权限的查找,算是有些自欺欺人,不过应该可以解决您的问题,不过,我还是推荐您分开建表。
如果我解决了您的问题,请您点击采纳,如果没有的话,请在下方留言,我会继续帮您解答

qq_39356813
王夜羽 很抱歉,才看到您的回复,这样的话,您可以额外在增加一个权限的表,在后端执行两次,第一次判断权限,第二次在执行查询的命令,但是要根据第一次的判断权限使第二次的命令不同即可
大约一年之前 回复
qq_31697187
qq_31697187 使用权限字段,必须要用where 条件,实现该功能的前提是不能使用where语句,只能使用固定的SQL, select * from 表名,
大约一年之前 回复
qq_31697187
qq_31697187 一个用户只有一个table,多个用户进行DML操作,每个用户select * from 表,在不使用where 语句的情况下 ,每个用户查询的结果都不同,如何实现这个功能
大约一年之前 回复

Oracle的表是属于用户的 每个用户都有自己的Schema (默认是当前用户名) 在程序里控制Schema 就会生成 select * from 用户名.表名

比如 用户zhangsan 就会生成 select * from zhangsan,test 这样应该就实现了你的需求

如果我解决了您的问题,请您点击采纳,如果没有的话,请在下方留言,我会继续帮您解答。

qq_31697187
qq_31697187 我知道一个用户只有一个schema,我是说 只有一个table,多个用户进行DML操作,每个用户select * from 表,在不使用where 语句的情况下 ,每个用户查询的结果都不同
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java将oracle一个表空间的数据同步到另一个表空间的数据,来看看有没有问题
代码如下: [code="java"] import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Date; import java.util.List; public class Bak { public static String shengchanku = "aaa";//生产库登录名 public static String shengchanku_pw = "1";//生产库密码 public static String shengchanku_serviceName = "127.0.0.1";//生产库服务名 public static String ceshiku = "aaatest";//测试库登录名 public static String ceshiku_pw = "1";//测试库密码 public static String ceshiku_serviceName = "127.0.0.1";//测试库服务名 /** * @param args * @throws SQLException */ public static void main(String[] args){ Date d = new Date(); long start = d.getTime(); String msg = ""; Connection conn = null; try { conn = getConnection(); } catch (Exception e1) { msg = "获取生产库链接失败"; } Connection connTest = null; try { connTest = getTestConnection(); } catch (Exception e1) { msg = "获取测试库链接失败"; } if("".equals(msg)){ try { //开启事务 conn.setAutoCommit(false); //查询出生产库所有表的名称 List<String> list_table_names = new ArrayList<String>(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select table_name from user_tables"); while(rs.next()){ list_table_names.add(rs.getString(1)); } rs.close(); stmt.close(); //查询测试库所有表的名称 List<String> list_table_names_test = new ArrayList<String>(); stmt = connTest.createStatement(); rs = stmt.executeQuery("select table_name from user_tables"); while(rs.next()){ list_table_names_test.add(rs.getString(1)); } //拼接往测试库每个表插数据的sql String table_name = ""; List<String> sql_create = new ArrayList<String>(); for(int i =0;i<list_table_names.size();i++){ table_name = list_table_names.get(i); sql_create.add("create table "+ceshiku+"."+table_name+" AS SELECT * FROM "+shengchanku+"."+table_name+""); } //拼接删除测试库表的sql List<String> sql_drop = new ArrayList<String>(); for(int i =0;i<list_table_names_test.size();i++){ table_name = list_table_names_test.get(i); sql_drop.add("drop table "+ceshiku+"." + table_name); } //删除测试库的数据 stmt = conn.createStatement(); for(int i = 0 ;i<sql_drop.size();i++){ stmt.addBatch(sql_drop.get(i)); } //执行删除sql int[] result = stmt.executeBatch(); System.out.println("执行删除表:" + result.length); stmt.close(); //重新创建测试库的数据 stmt = connTest.createStatement(); for(int i = 0 ;i<sql_create.size();i++){ stmt.addBatch(sql_create.get(i)); } //执行创建sql result = stmt.executeBatch(); System.out.println("执行创建表:" + result.length); stmt.close(); //提交事务 conn.setAutoCommit(true); } catch (SQLException e) { e.printStackTrace(); }finally{ try { conn.close(); connTest.close(); } catch (SQLException e) { e.printStackTrace(); } } }else{ System.out.println(msg); } d = new Date(); long end = d.getTime(); System.out.println("执行时间:" + (end-start) + "毫秒"); } //获取生产库链接 public static Connection getConnection() throws Exception{ Connection ct = null; Class.forName("oracle.jdbc.driver.OracleDriver"); ct = DriverManager.getConnection("jdbc:oracle:thin:"+shengchanku+"/"+shengchanku_pw+"@"+shengchanku_serviceName+":1521:orcl"); return ct; } //获取测试库链接 public static Connection getTestConnection() throws Exception{ Connection ct = null; Class.forName("oracle.jdbc.driver.OracleDriver"); ct = DriverManager.getConnection("jdbc:oracle:thin:"+ceshiku+"/"+ceshiku_pw+"@"+ceshiku_serviceName+":1521:orcl"); return ct; } } [/code] 大伙来看看这样写有没有什么问题,性能如何,我执行时间大概10秒多,数据量不是很大,不过有个附件表,表空间数据全部导出来大概有300多M
Oracle数据库建表语句连续执行的问题
我写了一个sql文件,里面是整个库的建表语句,用oracle的dba权限用户登录. 在执行每个表的建表语句的时候都是成功的,但放到一起连续执行就提示编译错误. 语句大概是这样的,执行到第一个 "end;"后就不执行了,整个文件有许多创建触发器的,也就有许多"end;", 郁闷. [code="java"]CREATE TABLE tb_a (SeqNo INTEGER , CarNumber NUMERIC(10, 0) , PRIMARY KEY(SeqNo)); create SEQUENCE s_tb_a INCREMENT by 1 start with 1 NOMAXVALUE NOCYCLE NOCACHE; CREATE TRIGGER t_tb_a BEFORE INSERT ON tb_a FOR EACH ROW --WHEN (NEW.SeqNo is null) BEGIN SELECT s_tb_a.nextval INTO:NEW.SeqNo from dual; END; --这以后的就不执行了 CREATE TABLE tb_b (SeqNo INTEGER , CarNumber NUMERIC(10, 0) , PRIMARY KEY(SeqNo)); ............. ..........[/code]请问有没有解决办法啊,还是我这样写不行啊.
oracle 中如何将游标中循环查出的结果集放到另外一个临时表中
## --包头 CREATE OR REPLACE PACKAGE TESTPACKAGE IS TYPE MYCURSOR IS REF CURSOR; -- 定义游标变量 -- 定义过程,用游标变量作为返回参数 PROCEDURE GETRECORDS( RET_CURSOR OUT MYCURSOR , P_BIZTYPE VARCHAR2:=NULL,-- 业务类型 P_DATE_START VARCHAR2:=NULL,-- 起始时间 P_DATE_END VARCHAR2:=NULL, -- 结束时间 P_CUSTOM_CODE VARCHAR2:=NULL--关区代码 ); END TESTPACKAGE; ## --包体 CREATE OR REPLACE PACKAGE BODY TESTPACKAGE IS /*过程体*/ PROCEDURE GETRECORDS( RET_CURSOR OUT MYCURSOR , --返回值 P_BIZTYPE VARCHAR2:=NULL,-- 业务类型 P_DATE_START VARCHAR2:=NULL,-- 起始时间 P_DATE_END VARCHAR2:=NULL, -- 结束时间 P_CUSTOM_CODE VARCHAR2:=NULL--关区代码 ) AS --ROW_DEPT CUR_CONNECTNO%ROWTYPE; --V_SQL VARCHAR2(3000);--sql语句 DAN VARCHAR2(2000); BEGIN --CUR_CONNECTNO 该游标用于存放每个业务查询出的结果集 --A业务 IF P_BIZTYPE='A' THEN CURSOR CUR_CONNECTNO IS SELECT A.ID AS GJ_NO FROM GJ_A A WHERE TO_CHAR(A.GDATETIME,'YYYY/MM/DD') >=P_DATE_START AND TO_CHAR(A.GDATETIME,'YYYY/MM/DD') >=P_DATE_END; END IF; --点击查询全部业务类型时,连接 /* IF P_BIZTYPE='' THEN V_SQL+=' UNION ALL ' END IF;*/ --B业务 IF P_BIZTYPE='B' THEN CURSOR CUR_CONNECTNO IS SELECT A.NO AS GJ_NO FROM GJ_B A WHERE A.I_E_MARK='1' AND TO_CHAR(A.GDATETIME,'YYYY/MM/DD') >=P_DATE_START AND TO_CHAR(A.GDATETIME,'YYYY/MM/DD') >=P_DATE_END; END IF; --M业务 IF P_BIZTYPE='M' THEN CURSOR CUR_CONNECTNO IS SELECT A.NO AS GJ_NO FROM GJ_M A WHERE SUBSTR(A.NO,3,1)='M' AND TO_CHAR(A.GDATETIME,'YYYY/MM/DD') >=P_DATE_START AND TO_CHAR(A.GDATETIME,'YYYY/MM/DD') >=P_DATE_END; END IF; /*IF P_BIZTYPE='' THEN V_STR+=' UNION ALL ' END IF;*/ --G IF P_BIZTYPE='G' THEN CURSOR CUR_CONNECTNO IS SELECT A.NO AS GJ_NO FROM GJ_G A WHERE TO_CHAR(A.GDATETIME,'YYYY/MM/DD') >=P_DATE_START AND TO_CHAR(A.GDATETIME,'YYYY/MM/DD') >=P_DATE_END; END IF; /*IF P_BIZTYPE='' THEN V_STR+=' UNION ALL ' END IF;*/ --E 业务 IF P_BIZTYPE='E' || P_BIZTYPE='' THEN CURSOR CUR_CONNECTNO IS SELECT A.NO AS GJ_NO FROM GJ_E A WHERE A.MARK='2' AND TO_CHAR(A.GDATETIME,'YYYY/MM/DD') >=P_DATE_START AND TO_CHAR(A.GDATETIME,'YYYY/MM/DD') >=P_DATE_END; END IF; -- 创建临时表 /* CREATE GLOBAL TEMPORARY TABLE TEMP_TBL(gj_no VARCHAR2(30),COL_A VARCHAR2(30),COL_A VARCHAR2(30)) ON COMMIT DELETE ROWS ;*/ FOR HAHA IN CUR_CONNECTNO LOOP --根据上述业务查出的数据 再在次记录表中是否 存在 ,若存在就把数据 取出来 -- 取出来 想保存到临时表中。 该怎么写 SELECT * FROM RD_Z Z WHERE BIZ_TYPE = P_BIZTYPE AND Z.NO=HAHA.GJ_NO ; END LOOP; --最后想用该游标来存放临时表中的数据集 来返回去 --OPEN RET_CURSOR FOR END GETRECORDS; END TESTPACKAGE;
oracle定时器的问题。。。。求大神解决
制作了表1,表2,当表1进行增删改的时候,触发触发器,对表2中的COUNNT值+1. 这是一个定时器,在目的是:每分钟定时查询表2中的COUNNT值。 但不知这里是有什么错误,报出了一下错误。(附代码、错误图) ``` declare jobno number; begin dbms_job.submit( jobno, 'select COUNNT from table2;', interval =>TRUNC(sysdate,'mi')+1/(24*60) ); end commit; ``` ![图片说明](https://img-ask.csdn.net/upload/201704/12/1491987335_408826.png)
oracle中求分组统计求总和与最大值
<p>有一张表tbinfo,关键字段部门dname,发布时间ctime </p> <p>数据类似如下:</p> <p> </p> <table style="width: 375px; height: 82px;" border="0"><tbody> <tr> <td>dname</td> <td>ctime</td> </tr> <tr> <td>部门1</td> <td>2012-11-20</td> </tr> <tr> <td>部门1</td> <td>2012-11-30</td> </tr> <tr> <td>部门2</td> <td>2012-11-30</td> </tr> </tbody></table> <p>现要求统计每个月的总信息量,与每个月内各部门之间相比最大信息量。</p> <p> </p> <p>本人想到的是</p> <p>select ym,sum(infocount) total,max(infocount) maxcount from (</p> <p>select to_char(ctime,'yyyymm') ym,dname,count(*) infocount from tbinfo group by to_char(ctime,'yyyymm'),dname</p> <p>) group by ym order by ym</p> <p> </p> <p> </p> <p>可以不使用用子查询查出相同结果吗?</p>
求一条SQL,建表语句已经写好(ORACLE)
create table t( name varchar2(20), socres number(10) ) name表示运动员的名字 socres表示这个运动员在一场比较里面的得分 insert into t(name,socres) values('backham',1); insert into t(name,socres) values('backham',2); insert into t(name,socres) values('backham',2); insert into t(name,socres) values('backham',3); insert into t(name,socres) values('batistuta',3); insert into t(name,socres) values('batistuta',3); insert into t(name,socres) values('baggio',2); insert into t(name,socres) values('baggio',3); insert into t(name,socres) values('ronaldo',3); 最后我想得到每个运行员的最多得分数 backham 3 batistuta 3 baggio 2 ronaldo 3 要求用一句SQL写出来,不能写成select xxx from (select xxx from xxxx); 主要去要去重复,然后得到最大值..
ORA-03001:未实施的功能 和 ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
我现在一个存储过程中报错“ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值”,我怀疑是clob限制的问题,但是做实验时遇到下面的错误 我是写了一个很简单的存储过程,准备验证普通表中clob字段存储有没有大小限制,查资料好像说最大4G,我想验证一下。但是写存储过程将大量数据插入clob字段时报标题错误: 版本: SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL/SQL Release 10.2.0.1.0 - Production CORE 10.2.0.1.0 Production TNS for 32-bit Windows: Version 10.2.0.1.0 - Production NLSRTL Version 10.2.0.1.0 - Production 语句: 建表: create table t_wll_clob(mobile clob); 建存储过程: create or replace procedure p_wll_clob as v_clob clob; begin for v_11 in(select allcode from T_BUSI_MAIN_PRESEND3 where main1status='0') loop --allcode字段为clob类型,存储的是用逗号分隔的手机号码。for一共500条记录,每条200个用逗号分隔的手机号 v_clob := v_11.allcode||','||v_clob; end loop; insert into t_wll_clob(mobile) values v_clob; end ; 报错: insert into t_wll_clob(mobile) values v_clob; ORA-03001:未实施的功能 求高手解答。 另外我想知道: 1.普通表中clob字段最大限制是多少 2.存储过程中clob变量最大限制是多少 3.如果clob有限制,那么超过限制报错一般是怎么解决,是限制数据的大小还是?
我想查询每个表中的数据有多少?
select a.talname,count(1) from (SELECT distinct 'ysj.'||table_name talname from all_tab_cols where table_name IN ('YZ_YBZHF','YZ_JYMX','YZ_JYHZ','YS_ZLXGFORICK','YS_ZKZL', 'YS_ZKLCZL','YS_ZKHPZL_SBSJ','YS_ZKHPZL2','YS_ZKHPZL','YS_ZKFFJL', 'YS_ZKBPZL','YS_ZHHRHP','YS_ZHHRBP','YS_KZLGXCL','YS_JYKZL','YS_JYKDYMX', 'X_YWLCJL','X_YWLC','X_BPWJ','NB_ZKZL','S_ZHCSOLD','S_ZHCS','NB_ZKJL', 'NB_SBHPERR','NB_SBHP','NB_PLZKJLXG','NB_PLZKJL','NB_GSHK','SYS_USER','X_ICKCZY','SYS_WSSB_USER') )a group by a.talname; 我想查询table_name中的表中的记录数,但是每次查询都只是下面显示的结果:到底改怎么修改?不胜感激1 1 dgsbsj.NB_ZKZL 1 2 dgsbsj.SYS_USER 1 3 dgsbsj.S_ZHCSOLD 1 4 dgsbsj.X_YWLCJL 1 5 dgsbsj.YS_JYKDYMX 1 6 dgsbsj.YS_ZKBPZL 1 7 dgsbsj.YS_ZLXGFORICK 1 8 dgsbsj.NB_ZKJL 1 9 dgsbsj.YS_ZHHRBP 1 10 dgsbsj.NB_SBHP 1 11 dgsbsj.X_YWLC 1 12 dgsbsj.YS_ZKHPZL2 1 13 dgsbsj.NB_PLZKJLXG 1 14 dgsbsj.SYS_WSSB_USER 1 15 dgsbsj.X_BPWJ 1 16 dgsbsj.YS_JYKZL 1 17 dgsbsj.YS_KZLGXCL 1 18 dgsbsj.YZ_YBZHF 1 19 dgsbsj.YZ_JYMX 1 20 dgsbsj.YS_ZKFFJL 1 21 dgsbsj.YS_ZKHPZL 1 22 dgsbsj.NB_GSHK 1 23 dgsbsj.NB_PLZKJL 1 24 dgsbsj.S_ZHCS 1 25 dgsbsj.YZ_JYHZ 1 26 dgsbsj.YS_ZHHRHP 1 27 dgsbsj.YS_ZKHPZL_SBSJ 1 28 dgsbsj.YS_ZKZL 1 29 dgsbsj.NB_SBHPERR 1 30 dgsbsj.YS_ZKLCZL 1
pl/sql的record问题
我是刚学pl/sql,遇到一个问题,首先我定义了三个变量, --这个是游标读取oracle数据库里边的数据; cursor emp_cursor is select empno, ename, sal from scott.emp; --这里我将table的每一行类型定义为与游标的rowtype; type emp_table is table of emp_cursor % rowtype index by BINARY_INTEGER; --定义当前table的位置; current_count INTEGER := 1; 然后我在接下来的模块读取emp_cursor: FOR t_emp in emp_cursor loop dbms_output.put_line('Loop :' || current_count); --接下来这句语句却通过不了,不知应该怎么写才行呢? emp_table(current_count).empno := t_emp.empno; current_count := current_count + 1; end loop; 这里的emp_table(current_count).empno := t_emp.empno为什么会出错?谁能告诉我?应该怎么写? 不好意思,原来我搞错了,type了一个类型应该多加个变量引用这个类型,然后使用这个变量就可以了。我直接使用这个类型才会出错。有谁要答的答了直接给分。
【mybatis generator的报错】前期配置问题!!!!!官方文件看了一直也一头雾水
错误如下 Description Resource Path Location Type The content of element type "context" must match "(property*,plugin*,commentGenerator?,(connectionFactory|jdbcConnection),javaTypeResolver?,javaModelGenerator,sqlMapGenerator?,javaClientGenerator?,table+)". generatorConfig.xml /oracle/generator line 4 XML Problem 指向的代码错误是这样的 ``` <generatorConfiguration> <context id="oracleTables" defaultModelType="hierachical" targetRuntime="MyBatis3"> ``` 错误指向context id 改了半天一直报错。。难道是pom.xml的代码顺序问题?? 补源代码 ``` <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <context id="oracleTables" defaultModelType="hierachical" targetRuntime="MyBatis3"> <!-- 自动识别数据库关键字段,默认false --> <property name="autoDelimitKeywords" value="false"/> <!-- 生成的Java文件的编码 --> <property name="javaFileEncoding" value="UTF-8"/> <!-- 格式化XML代码 --> <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/> <!-- 指明数据库的用于标记数据库对象名的符号 --> <property name="beginningDelimiter" value='"'/> <property name="endingDelimiter" value='"'/> <!-- 连接oracle --> <jdbcConnection connectionURL="jdbc:oracle:thin:@localhost:1521:orcl" driverClass="oracle.jdbc.driver.OracleDriver" password="S123456" userId="c##refeal" /> <!-- Java类型处理器 --> <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl"> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- Java模型创建器 --> <javaModelGenerator targetPackage="com.SJY.domain" targetProject="src/main/java" /> <!-- for mabatis3 自动为每个生成的类创建一个构造方法 --> <property name="constructorBased" value="false"/> <!-- 在targetPachage的基础上,根据数据库的schema再生成一层package,最终生成的类放到这个package下 --> <property name="enableSubPackages" value="true"/> <!-- for MyBatis3 是否创建一个不可变类 --> <property name="immutable" value="false"/> <!-- 设置是否在getter方法中,对String类型字段调用trim()方法 --> <property name="rootClass" value="com.sjy.domain"/> <!-- 生成SQLmap的XML文件生成器 --> <sqlMapGenerator targetPackage="com.SJY.dao" targetProject="src/main/resources" /> <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package --> <property name="enableSubPackages" value="true"/> <!-- 生成mapper接口 --> <javaClientGenerator targetPackage="com.SJY.domain" targetProject="src/main/java" type="XMLMAPPER" /> <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package --> <property name="enableSubPackages" value="true"/> <!-- 与数据库相对应 --> <table schema="" tableName="SJY_YH_YHXXB" domainObjectName="YH_YHXXB" mapperName="YH_YHXXBMapper" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true"> <generatedKey column="USERID" sqlStatement="SELECT SJY_YH_YHXXB_SEQUENCE.nextval AS USERID from DUAL"/> <columnOverride column="USERID" property="???" /> </table> </context> </generatorConfiguration> ``` 表字段暂时可以无视吧
MySQL的sql优化问题,求大神帮忙
我使用MySQL数据库的自定义函数实现了像Oracle一样的sequence序列功能,这个功能在项目中是做一个单号生成的模块, 目前是在测试并发访问1000的时候让每个请求响应的时间不超过100毫秒,但是目前的结果是只有三分之二的响应时间能达到要求。以下是我的代码以及sql自定义函数。求大神帮忙优化。 方法 @RequestMapping(value ="/testP.location") @ResponseBody public String testPolicyNo(){ String p_type="P"; String productNO="1999"; Date date=new Date(); SimpleDateFormat simple=new SimpleDateFormat("yyyy"); String sys_year=simple.format(date).toString(); String department="0101L"; String creator="aaa"; long startTime=System.currentTimeMillis(); String policyNo = iGenerateIDService.generatePolicyNo(p_type,productNO,sys_year,department,creator); long endTime=System.currentTimeMillis(); long t=endTime-startTime; String tt="w-----"+String.valueOf(t); log.debug(tt); //System.out.println("保单号"+policyNo); return null; } ```连接数据库代码 @Override public String generatePolicyNos(String p_type, String productNO, String sys_year, String department,String creator) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; String policyNo=""; try { Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root",""); ps=conn.prepareStatement("select lpad(nextval(?,?,?,?,?),?,'0')"); ps.setString(1, productNO); ps.setString(2, p_type); ps.setString(3, sys_year); ps.setString(4, department); ps.setString(5, creator); ps.setInt(6, 7); rs=ps.executeQuery(); while(rs.next()){ policyNo=p_type+productNO+sys_year+department+rs.getString(1); } return policyNo; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return ""; } ``` sql函数: 1:建表语句 CREATE TABLE `tbl_seq_mysql` ( `p_type` varchar(5) NOT NULL, `productNO` varchar(50) NOT NULL, `sys_year` varchar(5) NOT NULL, `department` varchar(5) NOT NULL, `currentValue` int(50) NOT NULL DEFAULT '2', `increment` int(11) NOT NULL DEFAULT '2', `creator` varchar(50) NOT NULL, `created_date` varchar(50) NOT NULL, PRIMARY KEY (`p_type`,`productNO`,`sys_year`,`department`,`currentValue`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 2:函数1 nextval CREATE DEFINER=`shopdev`@`%` FUNCTION `next_value`(m varchar(50),a varchar(5),b varchar(5),c varchar(5),d varchar(50)) RETURNS int(11) begin UPDATE tbl_seq_mysql SET currentValue = currentValue + increment WHERE p_type = a AND productNO = m AND sys_year = b AND department = c AND creator=d; return current_value(m,a,b,c,d); end 3:函数currentval CREATE DEFINER=`shopdev`@`%` FUNCTION `current_value`(n varchar(50),e varchar(5),f varchar (5),g varchar(5),h varchar(50)) RETURNS int(11) BEGIN DECLARE _cur int; DECLARE _curr int; select COUNT(1) INTO _cur from tbl_seq_mysql where creator=h and department=g and productNO= n and p_type=e and sys_year=f; IF _cur=0 THEN insert into tbl_seq_mysql (p_type,productNO,sys_year,department,creator,created_date) VALUES (e,n,f,g,h,NOW()); END IF; set _curr=(select currentValue from tbl_seq_mysql where creator=h and department=g and productNO= n and p_type=e and sys_year=f); return _curr; end
PreparedStatement 预编译原理
<p><strong><span>preparedStatement 有三大优点:</span></strong></p> <p><span><span>一.代码的可读性和可维护性. </span></span></p> <p><span><span>二.PreparedStatement尽最大可能提高性能. </span></span></p> <p><span><span>三.最重要的一点是极大地提高了安全性. </span></span></p> <p> </p> <p><span><span>其中一和三的确很易理解。 关于性能的提高也是最有价值的这点, 我对其原理还有些质疑。 </span></span></p> <p> </p> <p> </p> <div class="quote_title">网上一:</div> <div class="quote_div">SQL 语句被预编译并且存储在 PreparedStatement 对象中,其后可以使用该对象高效地多次执行该语句。 <br> </div> <p><span style="color: #ff0000;">问题:</span>预编译在JDBC中完成的?还是数据库中?即便存在preparedStatement中,如果这个preparedStatement 对象不被缓存起来,其后又如何重复使用,多次执行? (一些webserver会缓存preparedStatement)</p> <p>我想关于其性能的提高主要得需要数据库的支持。 </p> <div class="quote_title">oracle 性能优化 写道</div> <div class="quote_div">共享SQL语句 <br>  为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中。 <br>可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询。 <br> </div> <p><span><span><span><span><span><span style="font-size: x-small;"><span style="color: #008000;">个人理解:</span>预编译是利用数据库的SQL共享来实现的,因为当使用preparedStatement 的时候,尽管参数不同,但是在语句中用?来替代。 因此很多语句就完全相同。(这个道理和J2EE的server缓存preparedStatement 的道理应该是一样的)</span></span></span></span></span></span></p> <p> </p> <p><span><span><span><span><span><span><span style="font-size: x-small;"><span style="color: #ff0000;">问题:</span>但是如果是这样的话,那么oracle的多表查询岂不是并无预编译效果?</span></span></span></span></span></span></span></p> <p> </p> <p><span><span><span><span><span><span style="font-size: x-small;"><span><span><span><span><span><span><span style="color: #ff0000;">问题:</span></span></span></span></span></span></span>关于缓存:是否根据创建preparedStatement的语句来做为Key来map的?例如以下:是否检查匹配insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)来确定是否用已经有的执行路径来执行? </span></span></span></span></span></span></p> <p><span><span><span><span style="font-size: x-small;"><span>perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)"); </span></span></span></span></span></p> <p><span> </span></p> <p><span><strong>以下几篇从网络上搜索到的三篇文章:</strong></span></p> <p><span> </span></p> <div class="quote_title"><span>CSDN 写道</span></div> <div class="quote_div"><span>一.代码的可读性和可维护性. <br>虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次: <br><br>stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); <br><br>perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)"); <br>perstmt.setString(1,var1); <br>perstmt.setString(2,var2); <br>perstmt.setString(3,var3); <br>perstmt.setString(4,var4); <br>perstmt.executeUpdate(); <br><br>不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心. <br><br>二.PreparedStatement尽最大可能提高性能. <br>每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是<span style="color: #0000ff;">对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.</span>比如: <br>insert into tb_name (col1,col2) values ('11','22'); <br>insert into tb_name (col1,col2) values ('11','23'); <br>即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次. <br><br>当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句. <br><br>三.最重要的一点是极大地提高了安全性. <br><br>即使到目前为止,仍有一些人连基本的恶义SQL语法都不知道. <br>String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'"; <br>如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么? <br><br>select * from tb_name = '随意' and passwd = '' or '1' = '1'; <br>因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者: <br>把[';drop table tb_name;]作为varpasswd传入进来,则: <br>select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行. <br><br>而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.(前提是数据库本身支持预编译,但上前可能没有什么服务端数据库不支持编译了,只有少数的桌面数据库,就是直接文件访问的那些)只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑. </span></div> <p><span> </span></p> <p> </p> <div class="quote_title"><span>论坛 写道</span></div> <div class="quote_div"> <span><span style="font-size: x-small;">1,执行效率:Statement 采取直接编译 SQL 语句的方式,扔给数据库去执行,而 </span></span><span><span><span style="font-size: x-small;"><span style="color: #0000ff;">PreparedStatement 则先将 SQL 语句预编译</span>一遍,再填充参数,这样效率会高一些。JDK 文档说:SQL 语句被预编译并且存储在 PreparedStatement 对象中,其后可以使用该对象高效地多次执行该语句。 <br><br>2,代码可读性:Statement 中 SQL 语句中需要 Java 中的变量,加就得进行字符串的运算,还需要考虑一些引号、单引号的问题,参数变量越多,代码就越难看,而且会被单引号、双引号搞疯掉;而 PreparedStatement,则不需要这样,参数可以采用“?”占位符代替,接下来再进行参数的填充,这样利于代码的可读性,并且符合面向对象的思想。 <br><br>3,安全性:Statement 由于可能需要采取字符串与变量的拼接,很容易进行 SQL 注入攻击,而 PreparedStatement 由于是预 <br>编译,再填充参数的,不存在 SQL 注入问题。 <br></span></span></span> </div> <p><span> </span></p> <div class="quote_title"><span>Oracle 优化 写道</span></div> <div class="quote_div"><span>3. 共享SQL语句 <br>  为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中。这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径。 ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用。 <br><br>  可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询。 </span></div><br /><strong>问题补充:</strong><br />感谢geeksun的回答,我的理解是: <br />问题1, PreparedStatement是jdbc 驱动包里的一个类,并不是说存储在jdbc中。 <br />问题2, 我认为多表查询不支持预编这是不可能的。 <br />问题3, 我想这样提问可能更好一些。 <br />java 方法如下: <br />protected boolean updateSalary(Connection conn,BigDecimal x,String ID) throws SQLException{ <br /> PreparedStatement pstmt = null; <br /> try { <br /> pstmt = conn.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?"); <br /> pstmt.setBigDecimal(1, x); <br /> pstmt.setString(2, ID); <br /> return true; <br /> } finally{ <br /> if (pstmt!=null){ <br /> pstmt.close(); <br /> } <br /> } <br /> <br /> } <br /> <br /> <br />第一次调用以后,是否会缓存PreparedStatement, 这个在用weblogic这种server的时候是可以肯定的。因为从数据源的来connection是一个包装类,不是jdbc驱动的connection,而用connection来创建的PreparedStatement也是封装类。因此尽管pstmt.close().但是实际被封装的PreparedStatement并未关闭。 <br />但是是第二次调用这个方法,会重新conn.prepareStatement, 这个时候我想应该是根据语句来作为key来寻找缓存的preparedStatement,但是尽管取到缓存。 如果没有Database的配合,效率也很难提高多少。 <br /><strong>问题补充:</strong><br />谢谢geeksun的帮忙,Sql的共享我想肯定是支持多表的。 至于高速缓存应该讲的是结果的缓存。 <br />但是你对PreparedStatement的观点我认为是不对的。 因为这个对象肯定是在WebServer端的, 不可能跑到数据库那端。K-V对应的K值应该就是创建这个对象的那条语句,只是需要一个精通人士的肯定。
setResultTransformer(Transformers.aliasToBean(..))
以前一直用jdbc做开发,取出的数据放在为每个表建立的数据类中,想放表的哪几个字段就放哪几个 现在想学学hibernate,用oracle的原生sql想取出一个表中的两列: String selectTopicSql = "select topic,sectorname from article order by topic desc"; query = session.createSQLQuery(selectTopicSql1).setResultTransformer(Transformers.aliasToBean(Article.class)); Article.java就是hibernate对表ARTICLE的映射类,其配置文件如下: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="test"> <class name="Article" table="ARTICLE" > <meta attribute="sync-DAO">false</meta> <id name="topic" column="TOPIC" type="string"> <generator class="native"/> </id> <property name="Sectorname" column="SECTORNAME" type="string" not-null="true" length="40" /> <property name="Contents" column="CONTENTS" type="string" /> <property name="Keyword" column="KEYWORD" type="string" length="40" /> <property name="Source" column="SOURCE" type="string" length="100" /> <property name="Pageview" column="PAGEVIEW" type="integer" length="10" /> <property name="Score" column="SCORE" type="big_decimal" length="2" /> <property name="Createtime" column="CREATETIME" type="date" length="7" update="false" /> <property name="Updatetime" column="UPDATETIME" type="date" length="7" update="false" /> </class> </hibernate-mapping> 该配置文件在执行全字段检索没有问题,现在只取topic,sectorname就报错: Exception in thread "main" org.hibernate.PropertyNotFoundException: Could not find setter for TOPIC on class test.Article at org.hibernate.property.ChainedPropertyAccessor.getSetter(ChainedPropertyAccessor.java:68) at org.hibernate.transform.AliasToBeanResultTransformer.transformTuple(AliasToBeanResultTransformer.java:87) at org.hibernate.hql.HolderInstantiator.instantiate(HolderInstantiator.java:92) at org.hibernate.loader.custom.CustomLoader.getResultList(CustomLoader.java:353) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125) at org.hibernate.loader.Loader.list(Loader.java:2120) at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:312) at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1722) at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165) at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:175) at com.struts_learn.dao.ArticleDAO.selectTopic(ArticleDAO.java:58) at com.struts_learn.dao.ArticleDAO.main(ArticleDAO.java:206) 看了源码没看明白,如果另外再写一个jdbc那种数据类,何必用hibernate的映射类,如果不这样是不是就不能只取两个字段?我那个表的其他字段有很大的,不想全取出来,一直听说hibernate是持久层牛X框架,今日一见实在是失望,搞这么个东西在jdbc不用10分钟,竟然在hibernate里搞了半天也没能用映射类Article.java实现! 希望有对hibernate老手指点下! package test; import test.base.BaseArticle; import java.math.*; public class Article extends BaseArticle { private static final long serialVersionUID = 1L; /*[CONSTRUCTOR MARKER BEGIN]*/ public Article () { super(); } /** * Constructor for primary key */ public Article (java.lang.String topic) { super(topic); } /** * Constructor for required fields */ public Article ( java.lang.String topic, java.lang.String sectorname, java.lang.String contents, java.lang.String keyword, java.lang.String source, java.lang.Integer pageview, java.math.BigDecimal score, java.util.Date createtime, java.util.Date updatetime) { super ( topic, sectorname, contents, keyword, source, pageview, score, createtime, updatetime); } /*[CONSTRUCTOR MARKER END]*/ } package test.base; import java.io.Serializable; /** * This is an object that contains data related to the ARTICLE table. * Do not modify this class because it will be overwritten if the configuration file * related to this class is modified. * * @hibernate.class * table="ARTICLE" */ public abstract class BaseArticle implements Serializable { public static String REF = "Article"; public static String PROP_PAGEVIEW = "Pageview"; public static String PROP_KEYWORD = "Keyword"; public static String PROP_TOPIC = "Topic"; public static String PROP_UPDATETIME = "Updatetime"; public static String PROP_SCORE = "Score"; public static String PROP_CONTENTS = "Contents"; public static String PROP_CREATETIME = "Createtime"; public static String PROP_SOURCE = "Source"; public static String PROP_SECTORNAME = "Sectorname"; // constructors public BaseArticle () { initialize(); } /** * Constructor for primary key */ public BaseArticle (java.lang.String topic) { this.setTopic(topic); initialize(); } /** * Constructor for required fields */ public BaseArticle ( java.lang.String topic, java.lang.String sectorname, java.lang.String contents, java.lang.String keyword, java.lang.String source, java.lang.Integer pageview, java.math.BigDecimal score, java.util.Date createtime, java.util.Date updatetime) { this.setTopic(topic); this.setSectorname(sectorname); this.setContents(contents); this.setKeyword(keyword); this.setSource(source); this.setPageview(pageview); this.setScore(score); this.setCreatetime(createtime); this.setUpdatetime(updatetime); initialize(); } protected void initialize () {} private int hashCode = Integer.MIN_VALUE; // primary key private java.lang.String topic; // fields private java.lang.String sectorname; private java.lang.String contents; private java.lang.String keyword; private java.lang.String source; private java.lang.Integer pageview; private java.math.BigDecimal score; private java.util.Date createtime; private java.util.Date updatetime; /** * Return the unique identifier of this class * @hibernate.id * generator-class="native" * column="TOPIC" */ public java.lang.String getTopic () { return topic; } /** * Set the unique identifier of this class * @param topic the new ID */ public void setTopic (java.lang.String topic) { this.topic = topic; this.hashCode = Integer.MIN_VALUE; } /** * Return the value associated with the column: SECTORNAME */ public java.lang.String getSectorname () { return sectorname; } /** * Set the value related to the column: SECTORNAME * @param sectorname the SECTORNAME value */ public void setSectorname (java.lang.String sectorname) { this.sectorname = sectorname; } /** * Return the value associated with the column: CONTENTS */ public java.lang.String getContents () { return contents; } /** * Set the value related to the column: CONTENTS * @param contents the CONTENTS value */ public void setContents (java.lang.String contents) { this.contents = contents; } /** * Return the value associated with the column: KEYWORD */ public java.lang.String getKeyword () { return keyword; } /** * Set the value related to the column: KEYWORD * @param keyword the KEYWORD value */ public void setKeyword (java.lang.String keyword) { this.keyword = keyword; } /** * Return the value associated with the column: SOURCE */ public java.lang.String getSource () { return source; } /** * Set the value related to the column: SOURCE * @param source the SOURCE value */ public void setSource (java.lang.String source) { this.source = source; } /** * Return the value associated with the column: PAGEVIEW */ public java.lang.Integer getPageview () { return pageview; } /** * Set the value related to the column: PAGEVIEW * @param pageview the PAGEVIEW value */ public void setPageview (java.lang.Integer pageview) { this.pageview = pageview; } /** * Return the value associated with the column: SCORE */ public java.math.BigDecimal getScore () { return score; } /** * Set the value related to the column: SCORE * @param score the SCORE value */ public void setScore (java.math.BigDecimal score) { this.score = score; } /** * Return the value associated with the column: CREATETIME */ public java.util.Date getCreatetime () { return createtime; } /** * Set the value related to the column: CREATETIME * @param createtime the CREATETIME value */ public void setCreatetime (java.util.Date createtime) { this.createtime = createtime; } /** * Return the value associated with the column: UPDATETIME */ public java.util.Date getUpdatetime () { return updatetime; } /** * Set the value related to the column: UPDATETIME * @param updatetime the UPDATETIME value */ public void setUpdatetime (java.util.Date updatetime) { this.updatetime = updatetime; } public boolean equals (Object obj) { if (null == obj) return false; if (!(obj instanceof test.Article)) return false; else { test.Article article = (test.Article) obj; if (null == this.getTopic() || null == article.getTopic()) return false; else return (this.getTopic().equals(article.getTopic())); } } public int hashCode () { if (Integer.MIN_VALUE == this.hashCode) { if (null == this.getTopic()) return super.hashCode(); else { String hashStr = this.getClass().getName() + ":" + this.getTopic().hashCode(); this.hashCode = hashStr.hashCode(); } } return this.hashCode; } public String toString () { return super.toString(); } }
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方
致 Python 初学者
文章目录1. 前言2. 明确学习目标,不急于求成,不好高骛远3. 在开始学习 Python 之前,你需要做一些准备2.1 Python 的各种发行版2.2 安装 Python2.3 选择一款趁手的开发工具3. 习惯使用IDLE,这是学习python最好的方式4. 严格遵从编码规范5. 代码的运行、调试5. 模块管理5.1 同时安装了py2/py35.2 使用Anaconda,或者通过IDE来安装模
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
日均350000亿接入量,腾讯TubeMQ性能超过Kafka
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100) 【导读】近日,腾讯开源动作不断,相继开源了分布式消息中间件TubeMQ,基于最主流的 OpenJDK8开发的
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法不过,当我看了源代码之后这程序不到50
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
MySQL数据库总结
文章目录一、数据库简介二、MySQL数据类型(5.5版本)三、Sql语句(1)Sql语句简介(2)数据定义语言DDLcreate,alter,drop(3)数据操纵语言DMLupdate,insert,delete(4)数据控制语言DCLgrant,revoke(5)数据查询语言DQLselect(6)分组查询与分页查询group by,limit四、完整性约束(单表)五、多表查询六、MySQL数
记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背
有一次面试的时候,被问到进程之间有哪些通信方式,不过由于之前没深入思考且整理过,说的并不好。想必大家也都知道进程有哪些通信方式,可是我猜很多人都是靠着”背“来记忆的,所以今天的这篇文章,讲给大家详细着讲解他们是如何通信的,让大家尽量能够理解他们之间的区别、优缺点等,这样的话,以后面试官让你举例子,你也能够顺手拈来。 1、管道 我们来看一条 Linux 的语句 netstat -tulnp | gr...
20行Python代码爬取王者荣耀全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片
走进高并发(二)Java并行程序基础
一、进程和线程 在操作系统这门课程中,对进程的定义是这样的: 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进行是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。 上面的定义很完整,对进程进行了全方面的定义,但是貌似进程是看不见摸不着的一个东西,实际上,我们可以通过查看计算...
相关热词 c# 引用mysql c#动态加载非托管dll c# 两个表数据同步 c# 返回浮点json c# imap 链接状态 c# 漂亮字 c# 上取整 除法 c#substring c#中延时关闭 c#线段拖拉
立即提问

相似问题

3
Oracle栏位简易语法问题 , table as t1
4
oracle单表查询的问题
1
create table bbb as select * from aaa 结果create 出来的表超级大 是什么原因?
6
oracle根据时间每五分钟统计表
2
oracle单表数据量过大
1
为什么在MYSQL里,不能先select一个表的记录,在按此条件进行更新和删除同一个表的记录,其原理是什么?
1
oracle 如何解决关联查询字段有保留字或关键字的问题
2
如何用kettle实现比较源数据库中的所有表数据和目标数据库中的对应的表数据是否一致
6
Oracle 查询的时候 我需要造出数据来 比如select *from table_name where code in(01,02,03) 然后我要返回的数据是01,1 (换行)01,2(换行) 02,1 .........
1
oracle如何建立一个根据本表字段判断后分别本表的俩个字段插入新建立的字段?
0
关于oracle如何将一个表多个行转列
4
mysql或者oracle数据库何时需要调整表字段顺序的需求?
1
create table语句在存储过程中报错?
0
如何实现kettle增量数据的抽取,从一个多个数据库同步到一个数据库?
2
oracle 两张表怎么列转行?
2
一个关于oracle多列索引是否生效的问题
1
为什么我用oracle的select语句查询客户端IP为null
1
oracle中如何实现查找所有包含该列并且有相同数据的表
2
oracle子查询中,怎么动态拼接子查询的表名??
1
Oracle 数据库相关,用sql语句写一个存储过程实现针对单张表的逻辑数据导出功能