十二月 11, 2018 5:02:00 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [empServlet] in context with path [/MyBatisQ] threw exception
org.apache.ibatis.exceptions.PersistenceException:
### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
### The error may involve qiu.mapper.EmpDAO.delEmp-Inline
### The error occurred while setting parameters
### SQL: delete from emp where empid=?;
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:200)
at org.apache.ibatis.session.defaults.DefaultSqlSession.delete(DefaultSqlSession.java:213)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:67)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy49.delEmp(Unknown Source)
at qiu.servlet.EmpServlet.doPost(EmpServlet.java:81)
at qiu.servlet.EmpServlet.doGet(EmpServlet.java:35)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at qiu.base.EncodingFilter.doFilter(EncodingFilter.java:28)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:951)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2490)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1197)
at sun.reflect.GeneratedMethodAccessor59.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59)
at com.sun.proxy.$Proxy38.execute(Unknown Source)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:46)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:74)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
... 30 more
只是超时了,重启Tomcat或编译工具(MyEclipse、Eclipse。。。),分享些我搜到的文章:http://blog.itpub.net/29654823/viewspace-2150471/、https://blog.csdn.net/zc474235918/article/details/72731363/、https://www.cnblogs.com/simpledev/p/5426705.html
1、在插入数据时,如果主键字段为自动增长的字段,插入数据后想要知道主键值是多少,MyBatis提供了主键回填的功能。
2、要使用主键回填的功能,MyBatis的配置文件mybatis.xml中的value必须为true或者在XXXDAO.xml中有selectKey子元素的insert元素中加属性useGeneratedKeys=“true”(来获取有数据库内部生成的主键)
3、映射文件(XxxDAO.xml)中必须增加标签 ,其标签的keyColumn属性:数据库表的字段名、 keyProperty属性:Javabean的变量名(该值要与keyColumn值对应)、resultType属性:select查询的值的返回类型、order属性(默认值为BEFORE):回填顺序,在插入语句执行前或者在插入语句执行后获取主键值(可选BEFORE或AFTER)注:[①一般SQLServer和MySQL的选AFTER,Oracle的选BEFORE ②主键能自动递增选择AFTER,主键不能自动递增则选择BEFORE]
【empId是自动递增的主键字段,且在mybatis配置文件中加上“主键回填为true”的代码】
————mybatisQ.xml
————DBConnQ.class
public class DBConnQ {
static SqlSession session=null;
public static SqlSession getSession(){
try {
InputStream configuration=Resources.getResourceAsStream("mybatisQ.xml");
SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(configuration);
session=sessionFactory.openSession();
} catch (Exception e) {
e.printStackTrace();
}
return session;
}
}
————EmpDAO.xml
SELECT LAST_INSERT_ID()
————EmpDAO.class
void addEmp(EmpVo empvo);
————Emp_AccountDAO.xml
————Emp_AccountDAO.class
void addEacc(Emp_AccountVo eaccvo);
—————将add页面的form传来的值接收(我使用Servlet)
@ WebServlet(name = "empServlet", urlPatterns = { "/empServlet" })
public class EmpServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
SqlSession sqlSession=DBConnQ.getSession();
EmpDAO empBase=sqlSession.getMapper(EmpDAO.class);
EmpVo empVo=new EmpVo();
Emp_AccountVo empaccVo=new Emp_AccountVo();
Emp_AccountDAO eaccBase=sqlSession.getMapper(Emp_AccountDAO.class);
//localhost:8080/MyBatisQ/empServlet?action=add
String action=request.getParameter("action");
if(action.equals("add")){
String empName=request.getParameter("empName");
String password=request.getParameter("password");
int age=Integer.parseInt(request.getParameter("age"));
String sex=request.getParameter("sex");
int depId=Integer.parseInt(request.getParameter("depId"));
String remark=request.getParameter("remark");
String bankName=request.getParameter("bankName");
String bankaccount=request.getParameter("bankaccount");
String job=request.getParameter("job");
//先将两表的值都放在MappedStatement中,再一起commit(也可以先emp表commit再Emp_Account表commit,不过要比较下速度或性能)
empVo.setEmpName(empName);
empVo.setPassword(password);
empVo.setAge(age);
empVo.setSex(sex);
empVo.setDepId(depId);
empVo.setStatus(1);//默认为在职
empVo.setRemark(remark);
empVo.setJob(job);
empBase.addEmp(empVo);//要先主键回填,才可以有empId,因为还没有加载到数据库表中
empaccVo.setEmpId(empVo.getEmpId());
empaccVo.setBankName(bankName);
empaccVo.setBankAccount(bankaccount);
eaccBase.addEacc(empaccVo);
sqlSession.commit();
//以下转向EmpList列表页面(无需提供对应代码)
List eList=empBase.listemp();
request.setAttribute("empList", eList);
request.getRequestDispatcher("EmpList.jsp").forward(request, response);
}
}
推荐看看(他人好文,注释里的MapperStatement就是在里面看到的)——【原理分析之二:框架整体设计、《深入理解mybatis原理》 MyBatis的架构设计以及实例分析——二、MyBatis的主要构件及其相互关系】
【主键empId字段不能自动递增,且在 XxxDAO配置文件中加上“主键回填为true”的属性】这样就能够通过编写这个查询语句,来自定义主键的生成规则(如:从1开始每次取最大值加1)。在插入时,需要将主键一起插入,因为这时DBMS并没有自动生成主键,而是手动生成的。(将其order
属性设为BEFORE
后,就可以在真正执行插入前执行一次查询,并将结果填写到要插入的主键上。)
SELECT IF(MAX(empId) is NULL,1,MAX(empId)+1) FROM emp
INSERT INTO emp(empId,empName,age, sex) VALUES (#{empId},#{empName}, #{age},#{sex})
十二月 18, 2018 11:06:11 上午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [empServlet] in context with path [/MyBatisQ] threw exception
org.apache.ibatis.exceptions.PersistenceException:
### Error updating database. Cause: java.sql.SQLException: Field 'empId' doesn't have a default value
### The error may involve qiu.mapper.EmpDAO.addEmp2-Inline
### The error occurred while setting parameters
### SQL: insert into emp(empName,password,age,sex,depId,job,status,remark) values(?,?,?,?,?,?,?,?);
### Cause: java.sql.SQLException: Field 'empId' doesn't have a default value
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:200)
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:185)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:57)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy4.addEmp2(Unknown Source)
at qiu.servlet.EmpServlet.doPost(EmpServlet.java:96)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at qiu.base.EncodingFilter.doFilter(EncodingFilter.java:28)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLException: Field 'empId' doesn't have a default value
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2490)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1197)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59)
at com.sun.proxy.$Proxy9.execute(Unknown Source)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:46)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:74)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
... 29 more
将XxxDAO配置文件中"id为addEmp"的insert元素里的代码替换掉,
改成
还是会报错:
( 前提:empId主键不能自动递增。报错原因:
一:insert语句中没有empId字段,导致报上面的异常 “Field 'empId' doesn't have a default value”
二:不能在插入执行后 回填主键值,因为会报下面的异常“Column 'empId' cannot be null”
按道理,做到这里,是解决完了问题,
由于我将“add”与“update”合并在一起,而且将empVo(含有主键回填的empId)传给方法,导致结果还是错误的或者出现了不想要的 “ 结果 ” :
---------------------***********给出对应代码************---------------------
————EmpVo
public class EmpVo implements Serializable{
//可使用Integer包装类的类型,不需要区分大小写,但是必须与"数据表的字段对应单词",不可或多或少或写错
private Integer empId;
private String empName;
private String password;
private int age;
private String sex;
private int status;
private int depId;
private String job;
private String remark;
public Integer getEmpId() {
return empId;
}
public void setEmpId(Integer empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getDepId() {
return depId;
}
public void setDepId(int depId) {
this.depId = depId;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
@Override
public String toString() {
String msg="empId="+empId+",empName="+empName+",password="+password+",age="+age+",sex="+sex+",status="+status+",depId="+depId+",job="+job+",remark="+remark;
return msg;
}
}
————EmpVo4
public class EmpVo4 implements Serializable{
//可使用Integer包装类的类型,不需要区分大小写,但是必须与"数据表的字段对应单词",不可或多或少或写错
private Integer empId;
private String empName;
private String password;
private int age;
private String sex;
private int status;
private String statusRemark;
private int depId;
private String depName;
private String job;
private String remark;
private Emp_AccountVo eAcc;
private Emp_TaskVo eTask;//一对一情况下用association标签,在配置文件中
public String getStatusRemark() {
return statusRemark;
}
public void setStatusRemark(String statusRemark) {
this.statusRemark = statusRemark;
}
public String getDepName() {
return depName;
}
public void setDepName(String depName) {
this.depName = depName;
}
public Emp_AccountVo geteAcc() {
return eAcc;
}
public void seteAcc(Emp_AccountVo eAcc) {
this.eAcc = eAcc;
}
public Emp_TaskVo geteTask() {
return eTask;
}
public void seteTask(Emp_TaskVo eTask) {
this.eTask = eTask;
}
public Integer getEmpId() {
return empId;
}
public void setEmpId(Integer empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getDepId() {
return depId;
}
public void setDepId(int depId) {
this.depId = depId;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
@Override
public String toString() {
String msg="empId="+empId+",empName="+empName+",password="+password+",age="+age+",sex="+sex+",status="+status+"(statusRemark="+statusRemark+"),depId="+depId+"(depName="+depName+"),job="+job+",remark="+remark+",taskName="+eTask.getTaskName()+",taskRemark="+eTask.getTaskRemark()+",bankName="+eAcc.getBankName()+",bankAccount="+eAcc.getBankAccount();
return msg;
}
}
————EmpDAO
List listemp();//接口,要定义方法,而不是变量,也不能static final,只能public和abstract
List listEmp_EAcc_ETask_EDep_EStatus();
List listEmp_EAcc_ETask_EDep_EStatus_If(EmpVo empvo);
————EmpDAO配置文件
————EmpServlet
if(action.equals("add")){
String id=request.getParameter("empId");
String eage=request.getParameter("age");
int age=0;
int empId=0;
if(id==null && !id.equals("")){
empId=Integer.parseInt(id);
}
//int类型的字段对应的输入框要是没有填值,都会报错"java.lang.NumberFormatException: null"
if(!eage.equals("")){
age=Integer.parseInt(eage);
}
String empName=request.getParameter("empName");
String password=request.getParameter("password");
int depId=Integer.parseInt(request.getParameter("depId"));//下拉框一定赋值,零或者其他值
String sex=request.getParameter("sex");
// int status=Integer.parseInt(request.getParameter("status"));
String remark=request.getParameter("remark");
String bankName=request.getParameter("bankName");
String bankaccount=request.getParameter("bankaccount");
String job=request.getParameter("job");
empVo.setEmpName(empName);
empVo.setPassword(password);
empVo.setAge(age);
empVo.setSex(sex);
empVo.setDepId(depId);
empVo.setStatus(1);//默认为在职
empVo.setRemark(remark);
empVo.setJob(job);
empaccVo.setBankName(bankName);
empaccVo.setBankAccount(bankaccount);
if(empId>0){
empBase.undateEmpAll_SetIf(empVo);
empaccVo.setEmpId(empVo.getEmpId());
eaccBase.undateEacc(empaccVo);
}else{
empBase.addEmp2(empVo);//要先主键回填,才可以有empId,因为还没有加载到数据库表中
empaccVo.setEmpId(empVo.getEmpId());
eaccBase.addEacc(empaccVo);
}
sqlSession.commit();
// List eList=empBase.listemp();
List eList=empBase.listEmp_EAcc_ETask_EDep_EStatus_If(empVo);
request.setAttribute("empList", eList);
request.getRequestDispatcher("EmpList.jsp").forward(request, response);
}
要么初始化(因为status为0表示禁用或1表示启用,所以-1才表示不选择)为:
)
Opening JDBC Connection
Created connection 20026077.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@13192dd]
==> Preparing: insert into emp(empId,empName,password,age,sex,depId,job,status,remark) values(?,?,?,?,?,?,?,?,?);
==> Parameters: null, 111(String), 111(String), 111(Integer), 男(String), 6(Integer), 111(String), 1(Integer), 111(String)
十二月 18, 2018 8:57:45 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [empServlet] in context with path [/MyBatisQ] threw exception
org.apache.ibatis.exceptions.PersistenceException:
### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'empId' cannot be null
### The error may involve qiu.mapper.EmpDAO.addEmp2-Inline
### The error occurred while setting parameters
### SQL: insert into emp(empId,empName,password,age,sex,depId,job,status,remark) values(?,?,?,?,?,?,?,?,?);
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'empId' cannot be null
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:200)
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:185)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:57)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy12.addEmp2(Unknown Source)
at qiu.servlet.EmpServlet.doPost(EmpServlet.java:96)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at qiu.base.EncodingFilter.doFilter(EncodingFilter.java:28)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'empId' cannot be null
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2490)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1197)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59)
at com.sun.proxy.$Proxy10.execute(Unknown Source)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:46)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:74)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
... 29 more
————————————*******************分割线***********************——————————————
(里含 ‘ SELECT IF(MAX(id) is NULL,1,MAX(id)+2) FROM book ’ 语句,因为我不了解,所以找了:mysql 将null转代为0(以及一些特殊用法) )
======扩展======》Oracle也有实现这样的函数:
“ Oracle 中 decode 函数用法 ”或者“ oracle decode函数使用方法(百度经验)”或者“ decode函数(百度百科) ”【第二链接‘与第一链接相似(都讲解了decode(...)、sign(...)函数)但在‘举例方面’相对更完善些’】
(Mysql实现oracle decode()函数)
======扩展======》SQLServer也有实现这样的方法:
数据库--sqlserver--sqlserver 查询 值如果为NULL则显示0-解决方法