1. 守护线程
又被成为“服务线程”、“精灵线程”、“后台线程”,是指在程序运行时后台提供一种通用服务的线程,这种线程并不是不可或缺的。用户线程全部退出运行,只剩下守护线程存在了JVM也就退出了。将一个用户线程设置为守护线程的方法就是在调用start()方法启动线程之前调用对象的setDamon(true)方法,若将以上参数设置为false,则表示的用户进程模式。
2. join()方法的作用
就是让调用该方法的线程在执行完run()方法后,再执行join方法后面的代码。即将两个线程合并,用于实现同步功能。
public class JoinTest {
public static void main(String[] args) {
Thread t=new Thread(new ThreadImp());
t.start();
try{
t.join(1000);//住线程等待1s结束
if(t.isAlive()){//t已经结束
System.out.println("t has not finished");
}else{
System.out.println("t has finished");
}
System.out.println("joinfinish");
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
public class ThreadImp implements Runnable {
@Override
public voidrun() {
try{
System.out.println("Begin ThredImp");
Thread.sleep(5000);
System.out.println("End ThreadImp");
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
运行结果: BeginThredImp
t has not finished
joinfinish
End ThreadImp
3. JDBC(Java DataBase Connectivity)访问数据库
通过JDBC访问数据库一般的步骤如下:
1) 加载JDBC驱动器,
2) 加载JDBC驱动,并注册到DriverManager中
3) 建立数据库连接,取得Connection对象。一般通过DriverManager.getConnection(url,
Username,passwd)实现,url表示连接数据库的字符串,
4) 建立Statement对象或事PrepareStatement对象
5) 执行SQL语句
6) 访问结果集ResultSet对象
7) 依次将ResultSet、Statement、PrepareStatement、Connection对象关闭,释放掉所有占用资源,例如rs.close(),con.close()等。
public classTest {
public static void main(String[] args) {
//初始化参数
String user="root";
String password="renfen";
String url="jdbc:mysql://localhost:3306/datas";
String driver="com.mysql.jdbc.Driver";
Connection con =null;
Statement stmt=null;
ResultSet rs=null;
try{
try {
Class.forName(driver);
System.out.println("Success loading Mysql Driver!");
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.print("Error loading Mysql Driver!");
e.printStackTrace();
}//加载JDBC驱动
con=DriverManager.getConnection(url,user, password);//建立数据库连接
stmt=con.createStatement();//建立Statement对象或PrepareStatement对象
stmt.execute("insert into Employee values(1,'James1',25)");//执行SQL语句
stmt.execute("insert into Employee values(2,'james2',24)");
rs=stmt.executeQuery("select * from Employee");//获取访问结果集
while(rs.next()){
System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getInt(3));
}
}catch(SQLException e1){
e1.printStackTrace();
}finally{
try{
if(rs!=null)rs.close();
if(stmt!=null)stmt.close();
if(con!=null) con.close();
}catch(SQLException e){
System.out.println(e.getMessage());
}
}
}
}
4. JDBC处理事务的方法
一个事务是由一条或多条对数据库操作的SQL语句所组成的一个不可分割的工作单元。只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库。commit()方法表示完成对事务的提交,rollback()方法表示完成事务回滚,多用于处理事务过程中出现异常的情况。
可以通过Connection对象的conn.setTransactionLevel()方法来设置隔离级别,通过conn.getTransactionIsolation()方法来确定当前事务的级别。
5. Class.forName的作用及Statement、PrepareStatement、和CallableStatement的区别
就是把类加载到JVM中,会返回一个与带有给定字符串名的类或接口相关联Class对象,并且JVM会加载这个类,和执行该类的静态代码块。(类加载机制可以提高阮籍的可扩展性)。
1.Statement用于执行不带参数的简单SQL语句,并返回它所生成结果的对象,
Statementstmt=null; stmt=con.createStatement(); 或者Statementstmt= conn.getStatement();
Stmt.executeUpdate(“insertinto client values(‘a’,’aaa’)”);
2.PrepareStatement 表示预编译的SQL语句的对象用于执行带参数的预编译SQL语句。
3.CallableStatement则是提供了用来调用数据库中存储过程的接口,如果有输出参数要注册,说明是输出参数。
public class PrepareStatementTest {
public static void main(String[] args) {
String user="root";
String passwd="renfen";
String url="jdbc:mysql://localhost:3306/datas";
String driver="com.mysql.jdbc.Driver";
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try{
try {
Class.forName(driver);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
con=DriverManager.getConnection(url,user, passwd);
pstmt= con.prepareStatement("select * from Employee where id=?");
pstmt.setInt(1, 1);//传递参数
rs=pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getInt(3));
}
}catch(SQLException e1){
e1.printStackTrace();
}finally{
try{
if(rs!=null)
rs.close();
if(pstmt!=null)
pstmt.close();
if(con!=null)
con.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
相比之下PrepareStatement优点是:1)效率高;2)代码可读性和可维护性更好;3)安全性更好。