JDBC中遇到的错误集锦
Exception in thread “main” java.lang.NullPointerException(主线程里预料之外的错误,java ,lang包之下的空指针错误)
启动一个线程,在主线程中若报错或者阻塞,将不会继续执行下去,因此需要一开始就启动线程来执行下面的,这样多线程执行,一个被阻塞,另外一个依然能执行。
同时新开一个删除线程,同样报空指针错误,且都是箭头所指错误,此时本帅怀疑是ps为空导致的错误,本帅先检查了一下可以运行的插入功能,发现了问题所在
package com.example.paoduantui.JDBC.testJDBC; import android.os.SystemClock; import com.example.paoduantui.JDBC.JDBCDAO.TaskDBDao; import com.example.paoduantui.JDBC.JDBCDAO.UserDBDao; import com.example.paoduantui.JDBC.JDBCDB.TaskDB; import com.example.paoduantui.JDBC.JDBCDB.UserDB; import java.util.List; //测试JDBCDao类 public class testJDBCDao { public static void main(String[] args){ //TaskDB taskDB = new TaskDB('1','1',"张大帅比",'1',"张斌真帅","","2015-06-14","2015-06-14",'7'); //int result=TaskDBDao.insert(taskDB); //if(result==1) System.out.print("插入数据成功!"); new Runnable() { @Override public void run() { List<UserDB> list = UserDBDao.getById(1,0); for(int i= 0;i<list.size();i++){ System.out.println(list.get(i).getId()+list.get(i).getUsername()); } } }.run(); new Runnable() { @Override public void run() { TaskDB taskDB1=new TaskDB(49,1,"张斌斌",1,"张斌斌摔倒的","","","",7); int result1 = TaskDBDao.updateById(taskDB1); System.out.println("删除数据成功!!"+taskDB1.getTaskid()); } }.run(); TaskDB taskDB1=new TaskDB(4,1,"张斌斌",1,"张斌斌摔倒的","","","",7); int result1 = TaskDBDao.updateById(taskDB1); System.out.println("更新数据成功!!"+taskDB1.getTaskid()); } }本帅将Dao类中的连接设置为final静态值,让其在类中所有方法可调用
此时空指针问题解决了,但出现了另一个问题
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.(没有允许下一个连接关闭的操作的连接) 原因是,当把连接设置为静态加载,并且为final时,运行完一个数据库操作如insert后就关闭了连接,下一个数据库操作如update时,再次关闭连接,此时没有可以关闭的连接了,因为在运行完insert时就关闭了此连接。 所以正确写法应该是给每个数据库操作分配一个连接,运行完后关闭。 至此问题就解决了
在testJDBCDao中测试以下代码
package com.example.paoduantui.JDBC.testJDBC; import android.os.SystemClock; import com.example.paoduantui.JDBC.JDBCDAO.TaskDBDao; import com.example.paoduantui.JDBC.JDBCDAO.UserDBDao; import com.example.paoduantui.JDBC.JDBCDB.TaskDB; import com.example.paoduantui.JDBC.JDBCDB.UserDB; import com.example.paoduantui.Task; import java.util.List; //测试JDBCDao类 public class testJDBCDao { public static void main(String[] args){ //插入线程 new Runnable() { @Override public void run() { TaskDB taskDB = new TaskDB(1,1,"张大帅比",'1',"张斌真帅","","2015-06-14","2015-06-14",'7'); int result=TaskDBDao.insert(taskDB); if(result==1) System.out.print("插入数据成功!"); } }.run(); //查询线程 new Runnable() { @Override public void run() { List<TaskDB> list = TaskDBDao.getAll(); for(int i= 0;i<list.size();i++){ System.out.println(list.get(i).getId()+list.get(i).getUsername()); } } }.run(); //删除线程 new Runnable() { @Override public void run() { TaskDB taskDB1=new TaskDB(9,1,"张斌斌",1,"张斌斌摔倒的","","","",7); int result1 = TaskDBDao.deleteByTaskId(taskDB1); if(result1==1)System.out.println("删除数据成功!!"+taskDB1.getTaskid()); } }.run(); //更新线程 new Runnable() { @Override public void run() { TaskDB taskDB1=new TaskDB(1,1,"张斌斌",1,"张斌斌摔倒的","","","",7); int result1 = TaskDBDao.updateByTaskId(taskDB1); System.out.println("更新数据成功!!"+taskDB1.getTaskid()); } }.run(); } }结果 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException 最变态的sql语法错误
解决方案:在phpMyAdmin中运行,若有错误,则使用phpMyAdmin可用的语句改写。
可以插入,修改报错格式为上述格式
此时,可以插入数据啦!问题解决!!
数据库:
首先建库建表(为完成数据库编码设置的先进行配置) 首先建库建表(未完成数据库编码设置的先进行配置数据库的编码)创建与表字段一致的实体类DB(字段作为成员变量,设置构造方法,getter,setter方法)创建数据库表操作的实体Dao类(一般为增删改查,查为按条件查,按id查,获取全部(按时间降序排列)等)创建main方法测试创建Activity,在activity中测试(main方法为入口,Activity也能被调用启动,也即是,能被main方法执行调用的就能被Activity调用)