第一章:单例模式和conn.createStatement参数问题

SensorMonitorjava

单例模式,是一种经常使用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。经过单例模式能够保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例数据库

private static SensorMonitor instance = null;
public static SensorMonitor getInstance(){
     if(instance == null){
         instance = new SensorMonitor();
     }
}

单例设计模式是我最早学习的一个设计模式,也是最熟悉的一个设计模式。设计模式

单例设计模式的要求是生成同一个对象。即在取这个类的对象的时候,怎么取都是那一个。多线程

单例模式不变的一点就是私有化构造方法,并提供一个静态的本类对象。并发

单例设计模式分为两种,一种是懒汉式,一种是饿汉式。学习

所谓懒汉式其实就是在获取实例化对象的时候,首先判断单例类中的静态对象是否为null,若是是null,则new出来一个,若是不是null,那就返回那个对象。spa

//懒汉式
class Lazyer {
	private static Lazyer lazyer;

	private Lazyer() {
	}

	public static Lazyer getInstance() {
		if (lazyer == null) {
			lazyer = new Lazyer();
			return lazyer;
		} else {
			return lazyer;
		}
	}
}

public class LazyMan {
	public static void main(String[] args) {
		Lazyer la = Lazyer.getInstance();
		System.out.println(la);
		Lazyer la2 = Lazyer.getInstance();
		System.out.println(la2);
	}
}

而所谓饿汉式与懒汉式最关键的不一样点就是饿汉式不用判断那个静态的单例类中的静态对象是否为null,而是直接在声明这个静态对象的时候就将其new出实例化对象。线程

//饿汉式
class Hunger{
	private static Hunger hunger = new Hunger();
	private Hunger(){}
	public static Hunger getInstance(){
		return hunger;
	}
}



public class HungryMan {
	public static void main(String[] args) {
		Hunger hu = Hunger.getInstance();
		Hunger hu2 = Hunger.getInstance();
		System.out.println(hu);
		System.out.println(hu2);
	}
}

区别:因为懒汉式多了判断是否为空这一步,因此在多线程的时候会有并发问题发生。而饿汉式没有这一步,相对来讲效率较高并且不用考虑并发问题。设计

Statement stat	=	conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

通用格式为:Statement stmt=con.createStatement(int type,int concurrency);咱们在访问数据库的时候,在读取返回结果的时候,可能要先后移动指针,好比咱们先计算有多少条信息,这是咱们就须要把指针移到最后来计算,而后再把指针移到最前面,逐条读取,有时咱们只须要逐条读取就能够了。还有就是有只咱们只须要读取数据,为了避免破坏数据,咱们可采用只读模式,有时咱们须要望数据库里添加记录,这是咱们就要采用可更新数据库的模式。下面咱们就对其参数进行说明:指针

参数 int type

ResultSet.TYPE_FORWORD_ONLY 结果集的游标只能向下滚动。

ResultSet.TYPE_SCROLL_INSENSITIVE 结果集的游标能够上下移动,当数据库变化时,当前结果集不变。

ResultSet.TYPE_SCROLL_SENSITIVE 返回可滚动的结果集,当数据库变化时,当前结果集同步改变。

参数 int concurrency

ResultSet.CONCUR_READ_ONLY 不能用结果集更新数据库中的表。

ResultSet.CONCUR_UPDATETABLE 能用结果集更新数据库中的表。

查询语句

ResultSet re=stmt.executeUpdate(SQL语句);用来更新数据库信息或插入数据

ResultSet re=stmt.executeQuery(SQL语句);用来查询数据库信息

当咱们使用ResultSet re=stmt.executeQuery(SQL语句)查询后,咱们可使用下列方法得到信息:

public boolean previous() 将游标向上移动,该方法返回boolean型数据,当移到结果集第一行以前时,返回false。

public void beforeFirst 将游标移动到结果集的初始位置,即在第一行以前。

public void afterLast() 将游标移到结果集最后一行以后。

public void first() 将游标移到结果集的第一行。

public void last() 将游标移到结果集的最后一行。

public boolean isAfterLast() 判断游标是否在最后一行以后。

public boolean isBeforeFirst() 判断游标是否在第一行以前。

public boolean ifFirst() 判断游标是否指向结果集的第一行。

public boolean isLast() 判断游标是否指向结果集的最后一行。

public int getRow() 获得当前游标所指向行的行号,行号从1开始,若是结果集没有行,返回0。

public boolean absolute(int row) 将游标移到参数row指定的行号。若是row取负值,就是倒数的行数,absolute(-1)表示移到最后一行,absolute(-2)表示移到倒数第2行。当移动到第一行前面或最后一行的后面时,该方法返回false

  

不带参数使用默认值: 
createStatement() 
=createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY)

這樣取得的Statement其執行SQL後获得的ResultSet,將只能使用next()方法逐筆取得查詢結果。 您能够在创建Statement物件時指定resultSetType,可指定的參數有 ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE與 ResultSet.TYPE_SCROLL_SENSITIVE,在不指定的情況下,預設是第一個,也就是只能使用next()來逐筆取得資料,指定第二個或第三個,則可使用ResultSet的afterLast()、previous()、absolute()、relative()等方法。

相关文章
相关标签/搜索