引言
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调用)