Oracle创建用户和设置表空间

最近又在捣鼓Oracle了,用久了MySQL,Oracle好多东西都给忘了… 又开始慢慢的补,下面是创建用户的命令,为了方便查找,贴到这里来了:

1,创建用户,使用默认的表空间,即SYSTEM.DBF

create user admin identified by root;

2,修改用户的表空间

alter user admin default tablespace oracle_study;

3,查看用户的表空间(当前用户只能查看当前用户的表空间)

select username,default_tablespace from user_users;

4,更改表空间大小

alter database datafile 'C:\PROGRAMS\ORACLEXE\APP\ORACLE\ORADATA\XE\oracle_study.dbf' resize 1024m;

(设置表空间查看Oracle数据库11g快捷版使用教程

5,查看表空间名称和大小

select tablespace_name, round(bytes / 1024 / 1024, 0) tsize from dba_data_files;

同一个表空间里,用户不同,看到的表也不同,貌似相当于MYSQL的两个数据库…不知道理解的对不对,还须研究…

Java修道之路:JFinal一坑,事务不回滚问题

其实就是被坑了一下,哪个猿不是从坑里爬出来的呢?有个朋友说过,“有什么坑的,就记下来,下次不要被坑了”,可是,我觉得真是“一朝若被坑,永生真●难忘”,根本不用记录,呵呵。

但,这篇文章不是想描述我如何被坑的,而是为了记录一个处理问题的过程!

使用公司自己的一个eclipse插件做开发,该插件集成了JFinal框架,也不知道是哪个版本的JFinal,不过可以肯定的是2.0以前的。

写了一段业务,删除A表指定记录 -> 插入A表一条记录 -> 批量插入B表n条记录 -> 批量插入C表n条记录(记录从D表中查出),下面是伪代码:

Db.tx(new IAtom() {

	@Override
	public boolean run() throws SQLException {

		try {
			Db.update("delete from A where id = ?", id);
			Db.update("insert into A values(null,?,?)", new Object[]{param1, param2});

			// 准备参数
			Object[][] objss1 = new Object[row][3];
			for (int i = 0; i < row; i ++) {
				objss[i][0] = param3;
				objss[i][1] = param4;
				objss[i][2] = param5;
			}
			Db.batch("insert into B values(null,?,?,?)", objss1, 1000);

			// 准备参数
			Object[][] objss2 = new Object[row][1];
			for (int i = 0; i < row; i ++) {
				objss[i][0] = param6;
			}
			Db.update("insert into C select * from D where id = ?", objss2);

		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
});

继续阅读

Java修道之路:MySQL排名(优化)

之前有写到MySQL排名,见《Java修道之路:MySQL排名》,这篇文章中的sql语句写的很繁琐,分别嵌套了2个相同的子查询,也就是说运行这段sql会重复同样的查询2次,如果数据量很大,是很不合适的。当时我并不知道如何使用一个子查询完成工作,但是我隐约的感觉肯定可以只用一个子查询就能搞定…

这不,前几天正好有个同事写排名sql,我就看了下,果然不出所料,思路是完全一样,但同事就只使用了一个子查询就搞定了,细细读之,果然精炼,自己也试了下,又学到一个好东西,下面贴出sql,供参考也供留存:

连续重复排名:

-- 连续重复排名(精炼算法,只是用一个子查询)
select
	T.*,
	if (
		score = @LAST_SCORE,
		@LAST_ROW,
		@LAST_ROW := @LAST_ROW + 1
	) as RANK,
	@LAST_SCORE,
	@LAST_SCORE := score
from
	(select * from score order by score desc, id) as T,
	(select @LAST_ROW := 0, @LAST_SCORE := null) as RECORD

继续阅读

MySQL区分大小写查询

MySQL数据库写sql时,字段和语句都不区分大小写,但是字段内容是否区分大小写呢?让我来试试:

创建一张表table,设置一个字段column,类型varchar。设置还有个Collation参数,据网上说的,如果设置为“_ci”结尾就不区分大小写,如果为“_bin”结尾就会区分大小写,先选择“_ci”吧。

创建数据A和a,sql语句:select * from table where column = ‘a’,这时结果是“A”和“a”,也就是说都被搜出来了,这个时候可以使用这条sql:select * from table where column collate gbk_bin = ‘A’,这样就只搜出了“A”。

那么将collation设置为“_bin”结尾想搜出忽略大小写的结果呢?下面这条sql:select * from table where column collate gbk_chinese_ci = ‘A’,这样就只搜出了“A”。

数据图表趋势线算法——最小二乘法,这是你的Echarts趋势线

众所周知,Echarts是百度的图表框架,用于做统计图表是比较得心应手的工具,但是所谓百密而有一疏,Echarts居然没有描绘趋势线功能,用过Excel的小伙伴都知道,Excel统计图表可以自动生成趋势线,什么线性的啊,曲线的啊…什么什么数学术语性的啊…

之前,趋势线功能只是在需求之外想了想,也没有搞出来,就给忘了,后来,有个小伙伴又提到了,还提到趋势线可能应该是算出来的,顿时恍然大悟,找到学数学的小伙伴问了问,原来,这个趋势线的专业术语叫做“拟合曲线”,描述这种曲线的算法可以叫做拟合算法,那就好搞了,直接百度拟合算法,最终找到一个叫“最小二乘法”的算法,可以求出趋势线!那么下面就说说怎么计算吧(还好数学没有全部还给Teachers,不然公式都看不懂…)

假设我们有一组n个数据的列表需要统计,如:[y1, y2, y3, … yn],这时,我们假设每个数据的x都是间隔单位1,即[x1=1, x2=2, x3=3, … xn=n],这样就可以将该数据描述在一个xy坐标系中了,而最小二乘法可以通过上述的数据算出一个线性方程式:y = bx  + a,这个方程式就是描述上述n个数据的线性趋势线的公式,下面是求a和b的二元一次方程式:

∑(y) = b∑(x) + na
∑(xy) = b∑(xx) + a∑(x)

其中,
∑(y) – n个数据之和,
∑(x) – n个数据对应的x之和,即1~n之和
∑(xx) – 对应的x平方之和
∑(xy) – 对应的x乘y之和

通过上述方程得到a和b的代数式:

b = ( n∑(xy) – ∑(x)∑(y) ) / ( n∑(xx) – ∑(x)∑(x) )
a = ( ∑(y) – b∑(x) ) / n

继续阅读

分享一个MySQL行列转换的方法

面试的时候,面试官要求写一个mysql行列转换的方法,当时,真不知道该怎么做,结果还是写了一个方法,建表,一条一条的转过去…真是煞费苦心呢…不过面试官也没有要求要怎么做,只要实现就欧啦,哈哈,这不…哈哈哈

好了,进入正题,今天在写一个sql,觉得好复杂,于是问了旁边一个大神,大神一看,诶,这涉及到行列转换…当时,我突然一个激灵,什么意思,怎么转,于是就有了下面的方法!

先看题,有张表如下图:

MySQL行列转换 - 列表

通过无论什么方法…转换成下面的列表,也就是行列转换,最好是SQL和JAVA都写出来!!!

MySQL行列转换 - 列表

继续阅读

Java修道之路:Java实现排名

前一篇文章《Java修道之路:MySQL排名》写了如何用SQL来实现排名,这里想用java写一下排名算法,其实主要是想了解下两种方法的耗时,因为之前有同事说SQL的耗时会比Java少,所以想测试一下。

这里先说结果,我写的方法,测出来的结果,Java会比SQL快,也许是我的SQL写得并不优导致的,但是SQL一旦成形,就可以直接套用,使用比较方便,速度呢,1万条数据耗时相差无几,10万条数据(2个字段)耗时相差也就600毫秒左右。

继续阅读

Java修道之路:MySQL排名

mysql没有oracle那种排名函数,就只有自己实现,要么用sql,要么用java。

前几天研究了下sql的写法,贴出来,怕忘了可以瞄上一眼。

这里用到了mysql的自定义变量,写法如 @rank := 0,就是设置变量rank初始值为0。

为了测试sql,要有数据,用存储过程添加了1万条数据,花了大概13秒钟吧。

在公司测试的是10万条数据,花了110多秒钟吧,具体记不得了…

好了,下面开始贴代码:

1,随机生成1万条数据的sql,表只有两个字段:id和score,id自增,score随机0~100

-- 创建存储过程
drop procedure if exists proc;
create procedure proc() 
begin 
	declare i int;
	set i = 0;
	while i < 10000 do 
		insert into score values (null, format(rand() * 100, 0));
		set i = i + 1;
	end while;
end;

-- 执行存储过程
call proc();

继续阅读

Java修道之路:写一个小小的BUG修复

终于进入项目了,算是慢慢的按照计划步入正轨了吧….开森的同时,问题也接踵而至,这周连续4天加班到快12点了才回去,而我知道这仅仅只是个开始…

刚接到的项目时,觉得应该挺简单,但是花了两周的时间做出来的——却是一坨屎!!!完全不是自己想象的那样,过程也是极其坎坷的。有时候在想,是不是自己又错了!可是回想起决定转行时,这样的情况也是早有觉悟的了,所以,感叹归感叹,路还是要继续的…

感慨完了,说说这个BUG吧。

程序是这样的,后台用JFinal搭建,业务层处理完逻辑后,返回一个Map<String,Object>给控制层,控制层通过renderJson方法返回json数据到浏览器。

Map里的数据是从数据库获取的,当时有个数据作为Map的key值,字符串打印出来看起来是:123456,可是返回到浏览器,用js获取到该key值后,用console.log打印到控制台,却变成了这个样子:”123456 ”

就是说多出了一对引号,导致js无法通过后台传过来的这个key获取到对应的value…当时就懵逼了,其他的key值都没有问题,就这个key值有问题…后来仔细观察,发现123456除了多出一对引号外,数字末尾还多了一个空格!!!一个空格!!!空格!!!格!!!

我去,怪不得会多出一对引号,因为不用引号无法表示这个空格是不是属于这个字符串的…当时发现这个问题时,只有两个字出现在脑海中久久不能散去——坑爹!

话说存数据的时候没有trim的吗?唉,不过既然问题找到了,那么就自己将取出的数据trim一次,然后再renderJson吧,于是问题解决了…庆幸自己是个仔细的人,没有被坑太久。

PS:刚开始写这篇文章的时候,脑子里一直在想一句话,就是“路漫漫其修远兮,吾将上下而求索”,不正是说的我吗!

Java修道之路:JFinal实现自动扫描Controller并设置注解的controllerkey

由于最近在研究JFinal,所以就用JFinal的框框来写例子吧。

JFinal设置Controller的访问路径是在Config的configRoute方法中设置,使用me.add(String path, Class controller),如果有多个Controller,那么需要添加多行代码!

如果Controller非常多,那么后期的更改操作将比较麻烦,所以需要自动扫描Controller,将指定的注解的属性配置到me.add方法中(这里设计为Controller添加自定义注解@PVAnnotation(path = “/visit”),path就是访问路径)。

思路:

1,根据设置的包路径获取到文件路径,使用递归得到所有的.class文件(java字节码文件),将所有的.class的Class放入一个List

2,遍历1中得到的List,通过反射判断Class有没有指定的注解,如果有就获得注解并获得对应的注解属性,如果没有就continue

继续阅读

Java修道之路:jxl操作excel的Demo和详细注释

其实也不是工作中用到了,只是有朋友在问怎么用,也觉得以后多半会用到,所有周末有时间就学学。既然学了又不用,那肯定会忘得比火箭飞得还快……记下来就是最保险的了,将就练习写的几个Demo贴出来,当作技术储备吧,虽说是Demo,但是注释超详细,至少我是这么认为的。

Demo有4个,代码比较长,分段贴出,但是所有代码是在一个类里面的。

下面是引入的包和JUnit的@Before注解

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

import org.junit.Before;
import org.junit.Test;

import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.CellFormat;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.read.biff.BiffException;
import jxl.write.DateFormat;
import jxl.write.DateTime;
import jxl.write.Formula;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.NumberFormat;
import jxl.write.WritableCellFeatures;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

public class ExcelOperTest {

	private String xlsPath;

	@Before
	public void init() {
		xlsPath = "D:/test.xls";
	}

继续阅读

查询端口占用的方法

假设“8080”端口被某个该死的程序占用…(该死的程序:怪我咯~)

那么我们可以通过下面的方法找出那个程序:

1、打开cmd黑框(风标键+R,输入“cmd”回车)

2、输入: netstat -ano | findstr “8080”

回车,这个时候可以看到一个列表,最后一列就是占用8080端口的程序的进程的PID号,假设是“2468”

3、输入: tasklist | findstr “2468”
回车,这时又会有一个列表,第一列就是这个程序的进程的“映像名称”了,假设是“TNSLSNR.EXE”

4、打开任务管理器,打开“进程”栏,在“映像名称”列查找“TNSLSNR.EXE”(如果没有,那么点击下方的“显示所有用户的进程”),然后就可以在“描述”中看到这是个什么进程,如果不重要那就直接KILL掉

这样就解决问题了!

PS:TNSLSNR.EXE是Oracle数据库的进程,它占了我的8080,好吧,我惹不起,我总躲得起吧……话说应该能改吧,以后再研究了…

setContentType(“text/html;charset=utf8”)后页面依然乱码

写了段servlet返回浏览器中文的代码,设置了返回编码为“utf-8”,但是在浏览器端看到的仍是乱码,代码如下:

public class ServletTest extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		PrintWriter pw = res.getWriter();
		res.setContentType("text/html;charset=utf8");
		pw.write("尼美的");
		pw.close();
	}
}

后来发现,setContentType应该写在getWriter前面,所以啊,顺序还是很重要的!!!

res要先设定,才能保证通过res获得的流是utf8的格式。正确代码如下:

public class ServletTest extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		res.setContentType("text/html;charset=utf8");
		PrintWriter pw = res.getWriter();
		pw.write("尼美的");
		pw.close();
	}
}

“java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory”异常解决办法

访问Tomcat搭建的Servlet时报错:

java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
at org.apache.catalina.startup.Bootstrap.(Bootstrap.java:60)
Caused by: java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
… 1 more
Exception in thread “main”

问题出在tomcat上,配置tomcat时选择的是6.x,但是实际上是使用的tomcat 7.0,这个时候就少了一个包,叫做tomcat-juli.jar,这个问题貌似只发生在MyEclipse上,因为Eclipse不能这么选择tomcat。

怎么导入jar包呢?给个比较简单的方法:

Window – Preference – 左上角搜索tomcat – Tomcat 6.x展开 – Paths – Prepend to classpath右方点击“Add JAR/ZIP” – 找到tomcat/bin/tomcat-juli.jar – OK即可。

这个时候就完成了配置,问题就解决了!

Eclipse/MyEclipse查看源码出现“Source not found”的解决方法

使用Eclipse/MyEclipse查看Java源码出现“Source not found”,查看不到源码…

解决方法是,点击“Change Attached Source…”,会弹出Source选择框:

Eclipse选择“External location”,然后选择“External File…”

MyEclipse直接选择“External File…”,

然后找到jdk安装目录下的“src.zip”,点击“OK”即可。

另外,在Preferences中找到上述设置的方法如下:

WIndow – Preferences – Installed JREs – 点击框中的jre – Edit – JRE system libraries中找到rt.jar – Source Attachment

MyBatis运行时报错“前言中不允许有内容”的解决办法

使用MyBatis写的程序报错:

org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause:
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
at …

看到报错信息中有句中文给高兴得…“前言中不允许有内容”,但是然并卵啊,不明白什么意思…

由于当时没有网,所以没查,不过估计是配置文件的错误(当时使用MyBatis提供的读取文件流的方法Resources.getResourceAsReader()),接着就将配置文件检查了一遍又一遍,还是没有找到错误,就在要放弃的时候,莫名其妙的发现主配置文件的开头有三个问号(“???”),可是Eclipse中却看不到这3个问号!!!

然后突然就想到了UTF-8+BOM,查看文件编码,果然是UTF-8+BOM,我去,怪不得会提示“前言中不允许有内容”…原来就是那个坑爹的BOM!!! 继续阅读