Java中已经被try,catch的异常再其上一层中还能继续被try,catch吗?

比如Dao层有一条 insert 语句, 在该层已经try,catch了,现在我故意将sql写错,
在Service层 try,catch时,走到try就打印出异常了,然后不会进catch,现在我想
让程序进Service层的catch该如何处理?

Service层的代码

 String sql = "INSERT INTO sys_algorithm_info (ID, SFMC, SFLX) VALUES ('"+id+"', '"+sfmc+"', '"+sflx+"')";

            List<String> sqllist = new ArrayList<String>();
            sqllist.add(sql);

            try {
                dataService.insertList(sqllist );
            } catch (Exception e) {
                flag = "0";      //这里代码不进catch,直接跳过,无法将flag设置成0
                e.printStackTrace();
            }

Dao层的代码

 public boolean insertList(List<String> sqllist) {
        List<Object[]> list = null;
        // TODO Auto-generated method stub
        if (sqllist != null && sqllist.size() > 0) {
            boolean flag = false;

            try {
                int[] resoult = this.updateSqlDataAll(sqllist);
                if(resoult!=null){
                    flag = true;
                }else{
                    flag = false;
                }

            } catch (Exception e) {
                flag = false;
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return flag;
        } else {
            return false;
        }
    }

1个回答

在dao曾不catch里的Exception抛出去
throws e;
方法上面加上throw

w405722907
马大头 学习了,谢谢啦 : )
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
使用POI导出word文档时,将数据写入输出流报错
**org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: an error occurs while saving the package : class org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream cannot be cast to class java.util.zip.ZipFile$ZipFileInputStream (org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream is in unnamed module of loader 'app'; java.util.zip.ZipFile$ZipFileInputStream is in module java.base of loader 'bootstrap')** ``` at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:595) at org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1539) at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:227) at com.xinpengtech.operation.co.order.base.service.WordUtil.exportWord(WordUtil.java:38) at com.xinpengtech.operation.co.order.base.service.CoOrderService.export(CoOrderService.java:778) at com.xinpengtech.operation.co.order.base.service.CoOrderService$$FastClassBySpringCGLIB$$977f0048.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685) at com.xinpengtech.operation.co.order.base.service.CoOrderService$$EnhancerBySpringCGLIB$$f95e785a.export(<generated>) at com.xinpengtech.operation.co.order.base.view.TranscriptController.export(TranscriptController.java:37) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ...... ``` 我现在做的项目要用到导出文件的功能,然后就去学了Apache POI通过模板文件生成word文档的功能。 我写的demo在main方法和web接口下都能正常生成生成word文档;但是一移植到公司的项目上就报错了,controller和service层的业务逻辑是没问题的,调用到poi的api时才开始报错。我觉得和项目之间jar包依赖有关,因为系统刚拆了微服务,也不知道是不是这个原因,求解 ``` /** * 根据模板生成word文档 * @param inputUrl 模板路径 * @param textMap 要替换的参数 * @param tableList 表格参数 */ public static void exportWord(String inputUrl, String fileName, Map<String, String> textMap, List<String[]> tableList, HttpServletResponse response){ try{ // 获取docx解析对象 XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(inputUrl)); // 解析替换文本段落对象 changeText(document, textMap); // 解析替换表格对象 changeTable(document, textMap, tableList); // 导出到response输出流中 ServletOutputStream os = response.getOutputStream(); response.setHeader("Content-disposition", "attachment;fileName=" + fileName); document.write(os); // 这里报错 os.close(); }catch(Exception e){ e.printStackTrace(); } } ```
关于Unity中获取输入控件焦点的问题
一个Unity编写的游戏 包了一层java 就是一个继承了UnityPlayerActivity的类 然后想通过这个java类去监听Unity中焦点事件 并且去或者这个输入控件的ID while(true){ try { View view = UnityAdapter.this.getCurrentFocus(); System.out.println("view :"+view ); Thread.sleep(1000); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } 这是java中用来获取焦点view的代码 但是Unity运行的时候 输出的一直都是surfaceview这是啥情况 这样子获取不到Unity中的控件获得焦点的信息吗 继承了UnityPlayerActivity的类在Manifest中配置成了MainActivity了 那是不是就是整个Unity就运行在这个继承了UnityPlayerActivity的类上了啊
在service层里调用了dao的两个方法,如何保证这两个方法执行在同一个事务中呢?
service里有如下方法 Java code@Transactional(rollbackFor = Exception.class) public boolean del(Integer id) { boolean b = false; b = backDao.del(id); Back bs = new Back(); bs.setUserName(null); backDao.save(bs); return b; } 我想实现的是只用当删除和保存都正确的情况下,才持久化到数据库中去,现在我调用这个del方法时,保存明显是错误的,插入不到数据库中去,而且后台也报错了,但是还是可以删除操作的 dao中方法如下,继承了SqlMapClientDaoSupport Java codepublic boolean delete(final String sqlId, final PK pk) { boolean flag = false; try { this.getSqlMapClientTemplate().delete(sqlId, pk); flag = true; } catch (Exception e) { e.printStackTrace(); } return flag; } public boolean save(final String sqlId, final T entity) { boolean flag = false; try { this.getSqlMapClientTemplate().insert(sqlId, entity); flag = true; } catch (Exception e) { e.printStackTrace(); } return flag; } 还有一个问题,怎么能保证save,del等方法正确执行呢,我是用返回一个boolean型来判断的,如果抛异常就说明没有成功执行,但是我感觉不太好
springboot2.1.4 + jpa + hibernate 使用aop注解形式实现多数据源管理 可能懒加载出现问题求大神解答
最近项目中使用springboot2.1.4 + jpa + hibernate 使用aop注解形式实现多数据源管理,用的就是网上大多数人使用的一套代码,但是我在项目中使用后发现如果配置 spring配置文件 application.yml 中open-in-view: false 跨数据源查询正常,但是保存或者修改失败原因是事务没有提交,一旦把open-in-view改成true则不能跨数据源查询,修改保存正常事务正常提交求解,具体代码如下实现 1. application.yml ``` spring: ## 数据库配置 #datasource: #driver-class-name: com.mysql.jdbc.Driver #url: jdbc:mysql://192.168.101.125:3306/cdv?useSSL=false&characterEncoding=utf-8 #username: root #password: 123456 #url: jdbc:mysql://127.0.0.1:3306/boot-jpa-back-sys2?useSSL=false&characterEncoding=utf-8 #username: root #password: datasource: test1: driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://192.168.101.125:3306/cdv?useSSL=false&characterEncoding=utf-8 username: root password: 123456 type: com.alibaba.druid.pool.DruidDataSource test2: driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc-url: jdbc:sqlserver://192.168.101.125:1433;database=Test; username: sa password: Zqvideo123 type: com.alibaba.druid.pool.DruidDataSource ## jpa配置 jpa: show-sql: true hibernate: #ddl-auto: update properties: hibernate.dialect: com.common.mysql.MySQLDialectUTF8 hibernate.format_sql: false open-in-view: false ``` DataSourceAsepct ``` package com.common.db; import java.lang.reflect.Method; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Aspect @Component @Order(0) public class DataSourceAsepct { //加载数据源 @Pointcut("@annotation(com.common.db.DataSourceSet)") // @AfterThrowing(pointcut="@annotation(com.common.db.DataSource)", throwing= "error") public void pointCut(){ } @Before("pointCut()") public void before(JoinPoint joinPoint) { Object target = joinPoint.getTarget(); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); DataSourceEnum dataSource = DataSourceEnum.DEFAULT; try { Method method = target.getClass().getMethod(signature.getName(), signature.getParameterTypes()); if (method.isAnnotationPresent(DataSourceSet.class)) { DataSourceSet annotation = method.getAnnotation(DataSourceSet.class); dataSource = annotation.value(); } } catch (NoSuchMethodException e) { e.printStackTrace(); } //实现aop切换数据源 System.out.println("aop切换数据源:" + dataSource.getName()); DataSourceHolder.setDataSource(dataSource); } // @After("pointCut()") @AfterThrowing(pointcut="@annotation(com.common.db.DataSourceSet)", throwing= "error") public void after() { DataSourceHolder.clearDataSource(); String v = DataSourceHolder.getDataSource(); System.out.println(v); } } ``` DataSourceConfig ``` package com.common.db; import java.util.HashMap; import java.util.Map; import javax.sql.DataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.jta.JtaTransactionManager; @Configuration public class DataSourceConfig { //连接数据库db1 @Bean("test1") @ConfigurationProperties("spring.datasource.test1") public DataSource test1() { return DataSourceBuilder.create().build(); } //连接数据库db2 @Bean("test2") @ConfigurationProperties("spring.datasource.test2") public DataSource test2() { return DataSourceBuilder.create().build(); } @Bean("dynamicDataSource") @Primary public DataSource dynamicDataSource() { DynamicDataSource dataSource = new DynamicDataSource(); dataSource.setDefaultTargetDataSource(test1()); Map<Object, Object> dataSourceMap = new HashMap<>(2); dataSourceMap.put(DataSourceEnum.TEST1.getName(), test1()); dataSourceMap.put(DataSourceEnum.TEST2.getName(), test2()); dataSource.setTargetDataSources(dataSourceMap); return dataSource ; } @Bean public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dynamicDataSource()); } } ``` DataSourceEnum ``` package com.common.db; import lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor @Getter public enum DataSourceEnum { DEFAULT("test1"), TEST1("test1"), TEST2("test2"); private String name; } ``` DataSourceHolder ``` package com.common.db; public class DataSourceHolder { private static final ThreadLocal<String> DS_HOLDER = new ThreadLocal<>(); public static void setDataSource(DataSourceEnum dataSource) { DS_HOLDER.set(dataSource.getName()); } public static String getDataSource() { return DS_HOLDER.get(); } public static void clearDataSource() { DS_HOLDER.remove(); } } ``` DataSourceSet ``` package com.common.db; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented public @interface DataSourceSet { //枚举 DataSourceEnum value(); } ``` DynamicDataSource ``` package com.common.db; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { //基于aop切换数据源 System.out.println("dynamic datasource 切换数据源" + DataSourceHolder.getDataSource()); return DataSourceHolder.getDataSource(); } } ``` 测试调用 ``` server层 @Override @DataSourceSet(DataSourceEnum.TEST1) public String test1(Long id) { String s = programRepository.findids(id); System.out.println(s); return s; } @Override @DataSourceSet(DataSourceEnum.TEST2) public String test2(Long id) { String s = testRepository.findids1(id); System.out.println(s); return s; } ``` ``` Controller层 @PostMapping("/test") @ResponseBody public ResultVo test(Long id) { id = 1l; String beProgram1 = programService.test1(id); System.out.println(222); id=2l; String beProgram = testService.test2(id); System.out.println(333); return ResultVoUtil.success(beProgram+beProgram1); } ```
我用Java 写的一个简单截图小工具 但是出现一些在重截时出现bug 跪求大神
/**在这里贴上我注释满满的代码 求一语道破 求建议 求批评 没有贴main 方法 随便写个main方法便可运行 */ ` package com.subimaga; import java.awt.AWTException; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import com.sun.awt.AWTUtilities; public class ScreenCapture extends JFrame implements MouseListener, MouseMotionListener { private BufferedImage bufferedImage = null;// 用来存放图像 // 获取屏幕的大小 private int width = Toolkit.getDefaultToolkit().getScreenSize().width; private int height = Toolkit.getDefaultToolkit().getScreenSize().height; private Point point = new Point(0, height); // 截图的左上角 private Point point2 = new Point(0, 0);// 截图右下角 private Point point3 = new Point(0, 0);// 用来处理point 与point2 的关系 // 是画笔的透明度可控制 private AlphaComposite composite; boolean isStarCut = false, isEndCut = false;// isStarCut 为开始选区 // isEndCut为截图结束仅标记结束选区 public ScreenCapture() { // 初始化窗口 this.InitScr(); } private void InitScr() // 初始化 { // 截取整个桌面作为窗口的背景 try { bufferedImage = new Robot().createScreenCapture(new Rectangle(0, 0, width, height)); } catch (AWTException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 去掉窗体结构 this.setUndecorated(true); // 设置窗体大小 this.setSize(width, height); // 设置画笔的透明度 composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f); this.addMouseListener(this); this.addMouseMotionListener(this); this.setVisible(true); this.setAlwaysOnTop(true); repaint(); } public void paint(Graphics g) { // 配置截图环境 BufferedImage buff = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR); Graphics2D g2 = buff.createGraphics(); // 画笔一 Graphics2D g3 = buff.createGraphics(); // 画笔二 用两个画笔主要是因为需要不同的透明度 g2.drawImage(bufferedImage, 0, 0, null); g2.setColor(Color.gray); g2.setComposite(composite); g2.fillRect(0, 0, width, height); // 截图的工作 if (isStarCut == true || isEndCut == true) { // 当 confirmArea(); // 处理坐标的方法 /** * 我实现的原理是 在铺了全屏截图的窗口上铺上一层灰色 透明为0.6 的实心矩形 * 根据用户在窗口拖动的坐标再另外截取一张相对应的图片铺在上面 */ g3.drawImage(bufferedImage.getSubimage(point.x, point.y, Math .abs(point2.x - point.x), Math.abs(point2.y - point.y)), point.x, point.y, null); // 画出一个绿色的空心矩形 g3.setColor(Color.green); g3.drawRect(point.x, point.y, point2.x - point.x, point2.y - point.y); } // 功能框的显示 if (isEndCut == true) { // 当选区结束 才会绘出此框 action(); // 背景框 g2.fillRect(point3.x, point3.y + 5, 200, 30); g2.setColor(Color.red); // 完成 g3.drawRect(point3.x, point3.y + 5, 60, 30); g3.setColor(Color.white); g3.drawString("完成", point3.x + 20, point3.y + 25); // 重截 g2.drawRect(point3.x + 70, point3.y + 5, 60, 30); g2.drawString("重截", point3.x + 20 + 70, point3.y + 25); // 退出 g2.drawRect(point3.x + 140, point3.y + 5, 60, 30); g2.drawString("退出", point3.x + 20 + 140, point3.y + 25); } // 双缓冲 g.drawImage(buff, 0, 0, this); } // 调节功能框位置的方法 public void action() { if (point2.x <= width - 200 && point2.y < height - 35) { point3.x = point2.x; point3.y = point2.y; } else if (point.x >= 200 && point.y >= 35) { point3.x = point.x; point3.y = point.y - 50; } else if (point.x <= 200 && point2.x >= width - 200 && point.y >= 35) { point3.x = point2.x - 205; point3.y = point.y - 50; } else if (point.y >= 35 && point2.y <= height - 35 && point2.x >= width - 200) { point3.x = point2.x; point3.y = point2.y; } else { point3.x = point2.x - 205; point3.y = point.y; } } public void confirmArea() { int temp; point.x = point3.x; // 每一次开始都是和原点坐标比较 point.y = point3.y; if (point2.x < point.x && point2.y < point.y) { temp = point.x; point.x = point2.x; point2.x = temp; temp = point.y; point.y = point2.y; point2.y = temp; } else if (point2.x < point.x) { temp = point.x; point.x = point2.x; point2.x = temp; } else if (point2.y < point.y) { temp = point.y; point.y = point2.y; point2.y = temp; } } public void actoinCut(MouseEvent e) // 操作功能框的方法 { if (isEndCut) { // 完成 if (e.getX() >= point3.x && e.getX() <= point3.x + 60 && e.getY() >= point3.y + 5 && e.getY() <= point3.y + 35) { // //将截好的图保存起来 原理是利用点下完成的“按钮”时的坐标 即是最后一次决定的选区 对图片进行截图保存 try { ImageIO.write(bufferedImage.getSubimage(point.x, point.y, Math.abs(point2.x - point.x), Math.abs(point2.y - point.y)), "jpg", new File("D:/D.jpg")); } catch (IOException e1) { // // TODO Auto-generated catch block e1.printStackTrace(); } ; System.exit(0); // 保存完毕马上退出 这里的保存够工作有点简单因为只是用来测试此截图工具的bug // 具体的功能先不实现先 } // 重截 else if (e.getX() >= point3.x + 70 && e.getX() <= point3.x + 70 + 60 && e.getY() >= point3.y + 5 && e.getY() <= point3.y + 35) { isEndCut = false; // 重新截图 一切进入初始状态 这个 重截一直搞不好 求大神 isStarCut = false; // 点击重截后鼠标依然保持手型样式 所以要恢复默认 setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); // 重绘 repaint(); } // 退出 else if (e.getX() >= point3.x + 140 && e.getX() <= point3.x + 140 + 60 && e.getY() >= point3.y + 5 && e.getY() <= point3.y + 35) { System.exit(0); } } } public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub if (e.getButton() == MouseEvent.BUTTON3) // 双击 右键退出程序 { if (e.getClickCount() == 2) System.exit(0); } } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub // 只有当初始化状态才生效 if (isStarCut == false && isEndCut == false && e.getButton() == MouseEvent.BUTTON1) { point.x = e.getX(); point.y = e.getY(); point3.x = e.getX(); point3.y = e.getY(); isStarCut = true; } // 进入重截的条件 else if (isEndCut) { this.actoinCut(e); } } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub // 截图开始生效 if (isStarCut && isEndCut == false && e.getButton() == MouseEvent.BUTTON1) { isEndCut = true; // 鼠标一放开马上标记截图结束 isStarCut = false; // 重新标记未开始选区状态 repaint();// 重绘 } } @Override public void mouseDragged(MouseEvent e) { // TODO Auto-generated method stub // 拖动是改变矩形的坐标点 if (isStarCut || isEndCut) { point2.x = e.getX(); point2.y = e.getY(); repaint(); } } public void mouseMoved(MouseEvent e) { // TODO Auto-generated method stub // 在功能框上显示手型状态 if (isEndCut) { // 完成 if (e.getX() >= point3.x && e.getX() <= point3.x + 60 && e.getY() >= point3.y + 5 && e.getY() <= point3.y + 35) { setCursor(new Cursor(Cursor.HAND_CURSOR)); } // 重截 else if (e.getX() >= point3.x + 70 && e.getX() <= point3.x + 70 + 60 && e.getY() >= point3.y + 5 && e.getY() <= point3.y + 35) { setCursor(new Cursor(Cursor.HAND_CURSOR)); } // 退出 else if (e.getX() >= point3.x + 140 && e.getX() <= point3.x + 140 + 60 && e.getY() >= point3.y + 5 && e.getY() <= point3.y + 35) { setCursor(new Cursor(Cursor.HAND_CURSOR)); } else { setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); } } } }
web scoket在线聊天,服务连接失败
# 这是java里的代码 package com.webSocket; import net.sf.json.JSONObject; import javax.websocket.OnClose; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.websocket.*; /** * @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端, * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端 */ @ServerEndpoint(value = "/webSocketOneToOne/{param}") public class WebSocketOneToOne { // 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 private static int onlineCount; //实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key为用户标识 private static Map<String,WebSocketOneToOne> connections = new ConcurrentHashMap<>(); // 与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; private String role; private String socketId; /** * 连接建立成功调用的方法 * * @param session * 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据 */ @OnOpen public void onOpen(@PathParam("param") String param, Session session) { this.session = session; String[] arr = param.split(","); this.role = arr[0]; //用户标识 this.socketId = arr[1]; //会话标识 connections.put(role,this); //添加到map中 addOnlineCount(); // 在线数加 System.out.println("有新连接加入!新用户:"+role+",当前在线人数为" + getOnlineCount()); } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { connections.remove(role); // 从map中移除 subOnlineCount(); // 在线数减 System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount()); } /** * 收到客户端消息后调用的方法 * * @param message * 客户端发送过来的消息 * @param session * 可选的参数 */ @OnMessage public void onMessage(String message, Session session) { System.out.println("来自客户端的消息:" + message); JSONObject json=JSONObject.fromObject(message); String string = null; //需要发送的信息 String to = null; //发送对象的用户标识 if(json.has("message")){ string = (String) json.get("message"); } if(json.has("role")){ to = (String) json.get("role"); } send(string,role,to,socketId); } /** * 发生错误时调用 * * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { System.out.println("发生错误"); error.printStackTrace(); } //发送给指定角色 public static void send(String msg,String from,String to,String socketId){ try { //to指定用户 WebSocketOneToOne con = connections.get(to); if(con!=null){ if(socketId==con.socketId||con.socketId.equals(socketId)){ con.session.getBasicRemote().sendText(from+"说:"+msg); } } //from具体用户 WebSocketOneToOne confrom = connections.get(from); if(confrom!=null){ if(socketId==confrom.socketId||confrom.socketId.equals(socketId)){ confrom.session.getBasicRemote().sendText(from+"说:"+msg); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketOneToOne.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketOneToOne.onlineCount--; } } ``` # 这是前段页面代码 <%-- Created by IntelliJ IDEA. User: Administrator Date: 2019/10/9 0009 Time: 下午 4:19 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <script> var websocket = null; //判断当前浏览器是否支持WebSocket if ('WebSocket' in window) { var url = "ws://localhost:8080/webSocket/webSocketOneToOne/1,123" websocket = new WebSocket(url); } else { alert('当前浏览器 Not support websocket') } //连接发生错误的回调方法 websocket.onerror = function() { setMessageInnerHTML("WebSocket连接发生错误"); }; //连接成功建立的回调方法 websocket.onopen = function() { setMessageInnerHTML("WebSocket连接成功"); } //接收到消息的回调方法 websocket.onmessage = function(event) { console.log("回调信息",event.data) setMessageInnerHTML(event.data); } //连接关闭的回调方法 websocket.onclose = function() { setMessageInnerHTML("WebSocket连接关闭"); } //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function() { closeWebSocket(); } //将消息显示在网页上 function setMessageInnerHTML(innerHTML) { document.getElementById('message').innerHTML += innerHTML + '<br/>'; } //关闭WebSocket连接 function closeWebSocket() { websocket.close(); } //发送消息 function send() { var message = document.getElementById('text').value; //message作为发送的信息,role作为发送的对象标识,socketId是此次会话的标识 websocket.send(JSON.stringify({'message': message, 'role': '2', 'socketId': "123"})); } </script> <input id="text" type="text" /> <button οnclick="send()">发送消息</button> <button οnclick="closeWebSocket()">关闭WebSocket连接</button> <div id="message"></div> </body> </html> ``` # 这是依赖 ``` <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib-ext-spring</artifactId> <version>1.0.2</version> </dependency> </dependencies> ``` ![图片说明](https://img-ask.csdn.net/upload/201910/09/1570619693_439462.png) 运行之后就是这样![图片说明](https://img-ask.csdn.net/upload/201910/09/1570619784_298966.png) ``` ```
java web怎样实现商品分类显示
自己写了一个小的javaweb项目,用的jsp+servlet。 想实现商品的分类显示,但是不知道怎样从jsp页面传值给dao层,以及查询语句怎么写? 求大神帮助。 这是jsp页面: ``` <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%> <%@ page import="cn.edu.qust.bookcitys.entity.Items"%> <%@ page import="cn.edu.qust.bookcitys.dao.ItemsDao"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>展示</title> <link href="css/bootstrap.min.css" rel="stylesheet"> <link href="css/common.css" rel="stylesheet"> <link href="css/show.css" rel="stylesheet"> </head> <body> <header> <!-- logo --> <div class="index-header-top"> <img src="images/logo.png" class="logo"> </div> <!--导航栏--> <nav class="navbar navbar-default" role="navigation"> <div class="container-fluid"> <ul class="nav navbar-nav"> <li><a href="index.jsp">首页</a></li> <li class="active"><a href="show.jsp" target="_self">展示</a></li> <li><a href="cart.jsp" target="_self">购物车</a></li> <li><a href="login.jsp" target="_self">登录</a></li> </ul> </div> </nav> </header> <div class="details_container"> <div class="details_left"> <dl> <dt class="book"> <a href="show.jsp?sort=1">文学</a> </dt> <dd> <a href="#">作品集</a> </dd> <dd> <a href="#">名著</a> </dd> <dd> <a href="#">小说</a> </dd> </dl> <dl> <dt class="xbook"> <a href="show.jsp?sort=2">青春</a> </dt> <dd> <a href="#">青春</a> </dd> <dd> <a href="#">励志</a> </dd> <dd> <a href="#">校园</a> </dd> </dl> <dl> <dt class="book"> <a href="show.jsp?sort=3">生活</a> </dt> <dd> <a href="#">作品集</a> </dd> <dd> <a href="#">名著</a> </dd> <dd> <a href="#">小说</a> </dd> </dl> </div> <div class="details_right"> <div style="width: 1000px;"> <% ItemsDao itemsDao = new ItemsDao(); String sort = request.getParameter("sort"); ArrayList<Items> list = itemsDao.getAllItems(); if (list != null && list.size() > 0) { for (int i = 0; i < list.size(); i++) { Items item = list.get(i); request.setAttribute("item",item); %> <div style="width: 180px; height: 220px; float: left;"> <a href="details.jsp?id=${item.id }"><img style="float: left;" src="images/${item.picture }" width="170px" height="120px" border="1" /></a> <span style="float: left; margin: 5px 0px 0px 5px; color: blue">${item.name }</span> <span style="float: left; margin: 5px 0px 0px 5px; color: #000">作者:${item.author }&nbsp;&nbsp; 价格: ${item.price }¥ </span> </div> <% } } %> </div> </div> </div> <div class="details_bottom"> <footer> Copyright &copy; Made By 泥石流 </footer> </div> <!-- 如果要使用Bootstrap的js插件,必须先调入jQuery --> <script src="http://libs.baidu.com/jquery/1.9.0/jquery.min.js"></script> <!-- 包括所有bootstrap的js插件或者可以根据需要使用的js插件调用 --> <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> </body> </html> ``` ``` 这是dao层: package cn.edu.qust.bookcitys.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import cn.edu.qust.bookcitys.entity.Items; import cn.edu.qust.bookcitys.util.DBHelper; //商品的业务逻辑类 public class ItemsDao { //获得所有的商品信息 public ArrayList<Items> getAllItems(){ Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; ArrayList<Items> list = new ArrayList<Items>();//商品集合 try{ conn = DBHelper.getConnection(); // String sql = "select * from items where sort=?;";//sql语句 String sql = "select * from items ;";//sql语句 stmt = conn.prepareStatement(sql); // stmt.setInt(1, sort); rs = stmt.executeQuery(); while(rs.next()){ Items item = new Items(); item.setId(rs.getInt("id")); item.setName(rs.getString("name")); item.setAuthor(rs.getString("author")); item.setNumber(rs.getInt("number")); item.setPrice(rs.getInt("price")); item.setPicture(rs.getString("picture")); item.setSort(rs.getInt("sort")); list.add(item);//每次遍历把一个商品加入集合 } return list; } catch(Exception e){ e.printStackTrace(); return null; } finally{ //释放数据集对象 if(rs!=null){ try{ rs.close(); rs = null; } catch(Exception e){ e.printStackTrace(); } } //释放语句对象 if(stmt!=null){ try{ stmt.close(); stmt = null; } catch(Exception e){ e.printStackTrace(); } } } } //根据商品编号获得商品资料 public Items getItemsById(int id){ Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try{ conn = DBHelper.getConnection(); String sql = "select * from items where id=?;";//sql语句 stmt = conn.prepareStatement(sql); stmt.setInt(1, id); rs = stmt.executeQuery(); if(rs.next()){ Items item = new Items(); item.setId(rs.getInt("id")); item.setName(rs.getString("name")); item.setAuthor(rs.getString("author")); item.setNumber(rs.getInt("number")); item.setPrice(rs.getInt("price"));; item.setPicture(rs.getString("picture")); item.setSort(rs.getInt("sort")); return item; } else{ return null; } } catch(Exception e){ e.printStackTrace(); return null; } finally{ //释放数据集对象 if(rs!=null){ try{ rs.close(); rs = null; } catch(Exception e){ e.printStackTrace(); } } //释放语句对象 if(stmt!=null){ try{ stmt.close(); stmt = null; } catch(Exception e){ e.printStackTrace(); } } } } //获取最近浏览的前3条信息 public ArrayList<Items> getViewList(String list){ System.out.println("list:"+list); ArrayList<Items> itemlist = new ArrayList<Items>(); int iCount = 3; if(list!=null&&list.length()>0){ String[] arr = list.split("#"); System.out.println("arr.length="+arr.length); //如果商品记录大于等于3条 if(arr.length>=3){ for(int i=arr.length-1;i>=arr.length-iCount;i--){ itemlist.add(getItemsById(Integer.parseInt(arr[i]))); } } else{ for(int i = arr.length-1;i>=0;i--){ itemlist.add(getItemsById(Integer.parseInt(arr[i]))); } } return itemlist; } else{ return null; } } } ``` ``` 想把sort的值传到dao层并实现分类显示。
Java在触发事务回滚之后为什么会再一次回到Servlet开始的地方重新走一次流程?
## 代码流程 1. 前台点击"提交订单"进入`BaseServlet.class` 2. `BaseServlet.class`分发至子类`OrderServlet.class`的`submitOrder()`方法 3. `submitOrder()`调用Service层的`submitOrder()`方法. 4. 关键是Service层`submitOrder()`中使用了事务回滚. 这里调用了`Dao`层两个方法: `fun01()`和`fun02()`, 其中`fun01`执行成功, `fun02()`执行时抛出异常. 5. catch到异常后, 执行回滚. 然后关闭连接. 然后, **异常诡异的是, 程序并没有在回滚、关闭连接后结束,而是再一次进入`BaseServlet`。** 再一次执行一次上述流程,而这一次,由于第一次已经将*线程绑定的连接*关闭了。所以自然出现异常:不能操作已经关闭的连接。 **我的疑惑是:为什么它走了两次这个流程?是因为我调用了个`dao`层的插入数据的方法吗?** 还是或事物回滚就是从头在执行要一遍流程呢? 这个异常, 导致回滚技术无法实现呀. ## 代码片段(图片) ![图片说明](https://img-ask.csdn.net/upload/201711/12/1510464901_837407.png) ## 代码片段源码 ### Servlet层 ``` public String submitOrder(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ... Debug.log("进入方法:submitOrder..."); // 打印信息 boolean flag = false; // 调用service层方法 flag = orderService.submitOrder( pids, checkeds, quantitys, user ); // 提交成功 --> order_info.jsp页面 失败 --> info.jsp if( flag ) { return goOrderInfoUI(req, resp); }else { req.setAttribute("error", "提交订单失败!"); return "/info.jsp"; } } ``` ### service层 ``` ... // 获得*线程绑定的连接* Connection conn = null; try { conn = C3P0Util.getConnection(); Debug.log("连接=="+conn); // 开启事务 // 由于插入要么都成功, 要么都失败, 所以需要用事务操作 Debug.log("进入try"); conn.setAutoCommit(false); Debug.log("开启事务"); // 调用dao插入数据库 // 插入订单 orderDao.insertOrder(order); Debug.log("order插入走完"); // 插入订单项 orderDao.insertOrderItmes( orderItems ); // 提交事务 conn.commit(); // 方法返回值为true Debug.log("事务已提交"); flag = true; }catch(Exception e) { Debug.log("进入外层catch"); // 回滚事务 try { conn.rollback(); Debug.log("事务已回滚"); } catch (SQLException e1) { // TODO Auto-generated catch block Debug.log("进入内存catch"); e1.printStackTrace(); } }finally { // 关闭连接 try { Debug.log("关闭连接"); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Debug.log("service走完"); return flag; ... ``` 注:*`Debug.log()`是自定义方法用来打印信息.*
Java的异常捕获该怎么写?
<p>各位大大好.<br><br>问题如下:<br><br>我在写一个Spring mvc项目, 在dao层类中写了一个可能会执行失败的方法:</p> <p> </p> <pre name="code" class="java">/** * 删除 */ public void remove(int id) throws Exception { Session session = getSession(); session.delete(session.load(Usergroup.class, id)); }</pre> <p> </p> <p>这个方法删除的记录可能跟别的表有外键关联,所以可能删除失败.<br><br>然后我在service层的类中调用它:</p> <p> </p> <pre name="code" class="java"> /** * 删除 */ public Map&lt;String, Object&gt; remove(int id) { Map&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;(); try { userGroupDao.remove(id); map.put("isSuccess", true); } catch (Exception e) { map.put("isSuccess", false); map.put("errorMsg", e.getMessage()); } return map; }</pre> <p> </p> <p>我希望在service层调用这个方法时,如果失败就给返回值map加入错误信息, 然后 前端页面 显示错误,<br>而不是 显示Tomcat的<br><br>HTTP Status 500 -<br><br>type Exception report<br><br>这个画面.<br><br><br>请问怎么实现?<br><br>谢谢大大们!!!</p>
spring boot加mybatis编程式事务在线程中回滚事务时,每隔一段时间就会提交事务
在Service层的线程方法,为了保证数据添加的正确所以加了锁。 线程里面有两个方法,为了保证添加时候数据正确,所以如果有方法出现错误就会实现事务回滚。 ``` public String ticket(Integer sdid) { if (sd_id != null) { this.stock = schedulingService.findStock(sdid); } if (this.stock > 0) { TicketInspectRecord ticketInspectRecord = new TicketInspectRecord(); ticketInspectRecord.setTir_tcr_id(1); ticketInspectRecord.setTir_tp_id(1); ticketInspectRecord.setTir_u_id(1); ticketInspectRecord.setTir_date(new Date()); Thread thread = new Thread() { @Override public void run() { synchronized (obj) { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(def); try { ticketInspectRecordDao.inTicket(ticketInspectRecord); ticketInspectRecordDao.uStock(sd_id);//这一句必报错误 msg = "true"; transactionManager.commit(status); } catch (Exception e) { e.printStackTrace(); transactionManager.rollback(status); msg = "false"; } } } }; thread.start(); try { thread.join(); }catch (InterruptedException e){ e.printStackTrace(); } } return msg; } ``` 奇怪的是在执行回滚的时候,有时候即便回滚了,方法ticketInspectRecordDao.inTicket(ticketInspectRecord)依旧会向数据库里插入数据,但是这种情况不是一直都会,项目重启的时候或者隔一段时间重新运行一次,就会出现这种情况。 研究了很久了,一直搞不明白问题在哪里
c3p0 连接不释放 请路过的大神过来看看
配置文件如下 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <context:annotation-config /> <!-- 打开Spring的Annotation支持 --> <!-- 设定Spring 去哪些包中找Annotation --> <context:component-scan base-package="com.myd" /> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${driverClass}" /> <property name="jdbcUrl" value="${jdbcUrl}" /> <property name="user" value="${username}" /> <property name="password" value="${password}" /> <!-- 配置连接池的初始值 --> <property name="acquireIncrement" value="${acquireIncrement}" /> <property name="maxPoolSize" value="${maxPoolSize}" /> <property name="minPoolSize" value="${minPoolSize}" /> <property name="initialPoolSize" value="${initialPoolSize}" /> <property name="maxIdleTime" value="${maxIdleTime}" /> <property name="checkoutTimeout" value="${checkoutTimeout}" /> <property name="autoCommitOnClose" value="${autoCommitOnClose}"></property> <property name="acquireRetryDelay" value="${acquireRetryDelay}" /> <property name="idleConnectionTestPeriod" value="${idleConnectionTestPeriod}"></property> <property name="maxStatements" value="${maxStatements}"></property> <property name="numHelperThreads" value="${numHelperThreads}"></property> </bean> <!-- 导入src目录下的c3p0.properties文件 --> <context:property-placeholder location="classpath:c3p0.properties" /> <!--创建Spring的SessionFactory工厂 --> <!-- 如果使用的是Annotation的方式,不能使用LocalSessionFactoryBean,而应该使用 org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <!-- 注入数据源 --> <property name="dataSource" ref="dataSource" /> <!-- 设置Spring取那个包中查找相应的实体类 --> <property name="packagesToScan"> <value>com.myd.entity</value> </property> <property name="hibernateProperties"> <!-- <value> hibernate.dialect=org.hibernate.dialect.HSQLDialect </value> --> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.autoReconnect">true</prop> <prop key="jdbc.use_scrollable_resultset">false</prop> <prop key="hibernate.connection.release_mode">after_statement</prop> <prop key="hibernate.c3p0.validate">true</prop> <prop key="hibernate.c3p0.idle_test_period">30</prop> <prop key="hibernate.c3p0.timeout">30</prop> <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop> </props> </property> </bean> <!-- 开启HibernateTemplate,并且为其注入SessionFactory 使用HibernateTemplate不太方便的就是要获取session得通过getSessionFactory()方法获取 --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 配置Spring的事务处理 --> <!-- 创建事务管理器 --> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 配置AOP,Spring是通过AOP来进行事务管理的 --> <aop:config> <!-- 设置pointCut表示哪些方法要加入事务处理 --> <!-- 以下的事务是声明在DAO中,但是通常都会在Service来处理多个业务对象逻辑的关系,注入删除,更新等,此时如果在执行了一个步骤之后抛出异常 就会导致数据不完整,所以事务不应该在DAO层处理,而应该在service,这也就是Spring所提供的一个非常方便的工具,声明式事务 --> <aop:pointcut id="allMethods" expression="execution(* com.myd.service.*.*(..))" /> <!-- 通过advisor来确定具体要加入事务控制的方法 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods" /> </aop:config> <!-- 配置哪些方法要加入事务控制 --> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <!-- 让所有的方法都加入事务管理,为了提高效率,可以把一些查询之类的方法设置为只读的事务 --> <tx:method name="*" propagation="REQUIRED" read-only="true" /> <!-- 以下方法都是可能设计修改的方法,就无法设置为只读 --> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="save*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="5" /> <property name="maxPoolSize" value="50" /> <property name="queueCapacity" value="1000" /> <property name="keepAliveSeconds" value="60" /> </bean> </beans> 这是事务 package com.myd.dao.impl; import java.lang.reflect.ParameterizedType; import java.sql.SQLException; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.Resource; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.transform.Transformers; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.stereotype.Repository; import com.myd.dao.BaseDao; /** * 可以考虑把所有公共的方法都写在baseDAo中,让所有的DAO都继承BaseDao * 这样基本上就实现了大量的基础方法,如果DAO中有逻辑处理特殊的方法,再在具体的实现类中的DAO中创建 * * @author Administrator * * @param <T> */ @Repository("baseDaoImpl") public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> { /** * 此处不能使用setSessionFactory注入,因为setSessionFactory在HibernateDaoSupport * 中已经定义了而且还是final的,不能被覆盖 * * @param sessionFactory */ @Resource(name = "sessionFactory") public void setSuperSessionFactory(SessionFactory sessionFactory) { super.setSessionFactory(sessionFactory); } /** * 创建Class的对象来获取泛型的class */ private Class<Object> clz; @SuppressWarnings("unchecked") public Class<Object> getClz() { if (clz == null) { // 获取泛型的Class对象 clz = (Class<Object>) ((ParameterizedType) getClass() .getGenericSuperclass()).getActualTypeArguments()[0]; } return clz; } public void add(T t) { getHibernateTemplate().getSessionFactory().openSession(); getHibernateTemplate().save(t); getHibernateTemplate().getSessionFactory().close(); } public void delete(int id) { getHibernateTemplate().getSessionFactory().openSession(); getHibernateTemplate().delete(load(id)); getHibernateTemplate().getSessionFactory().close(); } @SuppressWarnings("deprecation") public void update(T t) { try { getHibernateTemplate().getSessionFactory().openSession() .connection().prepareStatement("SET SQL_SAFE_UPDATES=0") .execute(); } catch (DataAccessResourceFailureException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } getHibernateTemplate().update(t); getHibernateTemplate().getSessionFactory().close(); } 现在的问题是 运行一段时间后,就卡起, 不是报连接数据库关闭 就是 返回空指针 查了以下是连接未释放导致的,我想请教下各位大神 我这样连接没关闭并回到连接池吗?
如何在某个顶层方便的捕获事件线程抛出的异常
&nbsp;&nbsp;&nbsp; 有一次看.NET平台的WinForm发现其有提供捕捉这样异常的方法,升至它有默认的异常处理。 <br />但是在Swing中,如果某事件处理函数抛出了一个异常,很可能导致事件线程挂掉,这时候界面点击无反应, <br />软件甚至要通过强行关闭才能退出。如果在某顶层做一个最后防御,这样哪个事件处理模块如果抛出未处理异常, <br />也不至于程序莫名的挂掉,顶多输出一个信息告知用户系统错误,我要挂了,然后退出。 <br />但是我找了一下不知Swing在什么地方可以捕获异常。不知道大家是如何处理这个问题的。<br /><strong>问题补充:</strong><br />是这样的&nbsp;&nbsp; swing你得自己写个异常&nbsp; 当抛出异常的时候 可以让异常形成一个joptionpane 点了确定之后 这样程序就不挂着了&nbsp; 可以给用户选择的余地 这样增加了程序的友好性 <br />你写个异常继承RuntimeException 在构造器里写段抛出对话框的代码 并把信息打印在抛出的对话框里 <br />_____________________________________ <br />你这里的想法是说,我专门定义一个异常,然后别人如果出现错误要抛出这个异常? <br />然后这个异常呢会弹出对话框? <br />可是这并没有解决真正的问题啊,我要做的本来就是一个最后防御,某个事件处理函数抛出什么异常这本更就是不可知的,我要的是在某个顶层能捕捉到事件线程抛出来的未处理异常,这里就是要为了程序不能不明不白的挂掉。<br /><strong>问题补充:</strong><br />我说的和你想的意思一样 我们现在就是这样处理的 而且程序运行了几年了也没问题啊&nbsp;&nbsp; 你在有可能抛出异常的地方try catch然后抛出你自己写的异常啊&nbsp; 编译时异常必须声明这不用咱们去操心JAVA机制自动处理&nbsp;&nbsp; 而只要有运行时异常抛出就一定是你代码的问题&nbsp; 或者用户的输入之类的不符合你的预期逻辑你刻意的抛出一个异常&nbsp; 异常是一层层向上抛的 你把事件可能出现问题的部分 try catch住不就行了么 <br />———————————————————————— <br />可是这样的话,那么和他自己捕捉了某个异常,然后弹出一个对话框又有多少区别呢?这是把防御交给了每个处理者自己。可是如果我不能假定他们都正确处理了这一切呢?这个时候我需要一张最后防御网,这个该如何处理呢?<br /><strong>问题补充:</strong><br />哦呵呵&nbsp; 你的意思是不是怕有遗漏 想来个最后有个系统的捕获是吧&nbsp; 一般的话 要是把项目配置在spring中都会在spring里配置一个最顶层的异常处理器 。。 你邮箱多少 我给你发个springrcp的文档&nbsp; 你进去看他的异常处理部分上面说的很清楚 呵呵 但是很长 在这里说不清楚 <br />__________________________________ <br />以现在的情况是不可能改用springrcp的,既然springrcp做到了,那么一定是有方法的,只是我奇怪为什么Swing没有提供一个简便的接口来捕获事件线程异常呢?这一点上 .net确实周到了一点。
搭建一个框架,如何做到事务在service层处理
想搭一个基础的框架,不想用spring和hibernate那些东西.... 自己写连接池连接(连接池代码就不想多说,主要是能获取一个connection对象). 想自己写事务处理.service和dao层尽量解耦合(所有的关于业务的事务处理都在service层解决,dao层只做数据库操作) [code="java"] import java.io.*; import java.util.*; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import javax.transaction.*; import java.sql.ResultSet; /**基类**/ public class BaseDAL implements java.io.Serializable { protected java.sql.Connection myConn=null; public java.sql.Statement stmt = null ; protected java.sql.PreparedStatement pstmt = null; //public java.sql.ResultSet rs = null; private javax.sql.DataSource ds =null; private javax.transaction.UserTransaction transaction =null; private Context ctx =null; public int makeTrans=0; //表示是否启动了事务,为0表示没有启动事务,1表示有启动事务 public int connCount =0; //表示数据库连接的次数,每调用一次Connection,加1,每调用一次Disconnect,减1 protected java.lang.String JNDIName; public BaseDAL() throws Exception { try { JNDIName ="jdbc/TripDataSource"; ctx =new InitialContext(); } catch (Exception e) { throw e; } } public void setTransactionTimeOut(int time) { try { this.transaction.setTransactionTimeout(time); } catch (Exception e) { } } /**修改JNDIName**/ public void setJNDIName(String JNDIName) { this.JNDIName = JNDIName; myConn = null; } /**事务创建**/ public void begin() throws Exception { try { if (transaction == null) { transaction =(javax.transaction.UserTransaction) ctx.lookup("javax.transaction.UserTransaction"); transaction.setTransactionTimeout(120); } if (ds==null) { ds = (javax.sql.DataSource) ctx.lookup(JNDIName); } //获得当前的事务状态,如果不为0,表示当前没有事务在处理 int tranStatus = transaction.getStatus(); if ( tranStatus != 0) { //启动一个事务,记录当前有事务处理 makeTrans = 1; transaction.begin(); } } catch( Exception E) { throw E; } } /**事务提交**/ public void commit() throws Exception { try { //如果当前有提交事务 if ( makeTrans != 0) { transaction.commit(); makeTrans = 0; } } catch(Exception E) { throw E; } } /**事务回滚**/ public void rollback() throws Exception { try { //如果当前有提交事务 if ( makeTrans != 0) { transaction.rollback(); makeTrans = 0; } } catch(Exception E) { throw E; } } /**连接数据库**/ protected void connection() throws Exception { try { if (ds==null) { ds = (javax.sql.DataSource) ctx.lookup(JNDIName); } //如果连接计数为0,连接数据库 if (connCount==0) { myConn = ds.getConnection(); stmt = myConn.createStatement(); } connCount ++; } catch (Exception E) { throw E; } } /**断开数据库**/ protected void disConnection() throws Exception { try { connCount --; if (connCount == 0) { try { if (stmt != null) stmt.close(); myConn.close(); } catch ( Exception e) { e.printStackTrace(); } } } catch (Exception E) { throw E; } } /**创建事务,包括数据连接**/ public void transactionBegin() throws Exception { begin(); connection(); } /**事务提交,包括断开数据库**/ public void transactionCommit() throws Exception { disConnection(); commit(); } /**事务回滚、包括断开数据库**/ public void transactionRollback() throws Exception { disConnection(); rollback(); } public void showmessage(String str) { } [/code] 上面是一个事务处理的基类,以前写的dao都是继承这个基类再实现一个接口 [code="java"] this.transactionBegin(); /** 处理SQL,如果有多样执行的话,多条SQL涉及多张表 **/ this.stmt.executeUpdate(sql); this.transactionCommit(); 失败 this.transactionRollback(); [/code] 以前写的service是使用实现接口的dao来访问dao层 现在脑袋进入死锁状态,想不出,该如何解开这块事物,也就是把事务处理放在service.. 怎么设计,该使用什么事务处理.. [b]问题补充:[/b] 如果用spring和hibernate我就自己去看书了..希望各位别在用框架回答了... [b]问题补充:[/b] 谢谢抛出异常的爱 大概意思我明白.. [code="java"] public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; try { //事务开始 begin(); result = method.invoke(this.delegate, args); //执行原来的方法之后记录日志 commit(); //事务结束 } catch (Exception e) { rollback(); e.printStackTrace(); }finally{ logger.error("finally运行"); } //返回方法返回值给调用者 return result; } public static void main(String arg[]) throws SQLException, InterruptedException{ MixUpper mx = (MixUpper) new DynaProxyHello().bind(new Tmalple()); mx.sonMother(); mx.updateFather(); } [/code] 这样当mx.sonMonther()的时候就执行一次事务. mx.updateFather()的时候又执行一次事务,如果updateFather的时候失败,不会回滚回mx.sonMonther() 还是说我理解错误 [b]问题补充:[/b] 如果涉及到多张表操作.. 因为我想,每张表都有自己的dao处理方式,不会耦合在一起.... 如何用一个代理类实现多个代理方法 [b]问题补充:[/b] 尝试了下代理,好象没什么效果..可能是我写错了 代理类 [code="java"] import javax.transaction.UserTransaction; import javax.naming.NamingException; import javax.naming.InitialContext; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.InvocationHandler; import javax.naming.Context; public class DynaProxyTransaction implements InvocationHandler { private Object object; public Object bind(Object obj) { this.object = obj; return Proxy.newProxyInstance(this.object.getClass().getClassLoader(), this.object.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; InitialContext ic = null; UserTransaction ut = null; ic = getContext(); ut = getUserTransaction(); try { System.out.println("事务开始"); ut.begin(); // JVM通过这条语句执行原来的方法(反射机制) result = method.invoke(this.object, args); ut.commit(); System.out.println("事务提交"); } catch (Exception e) { System.out.println("事务回滚"); ut.rollback(); e.printStackTrace(); } // 返回方法返回值给调用者 return result; } private InitialContext getContext() { InitialContext ic = null; try { ic = new InitialContext(); } catch (NamingException e) { e.printStackTrace(); } return ic; } private UserTransaction getUserTransaction() { UserTransaction ut = null; try { ut = (UserTransaction) getContext().lookup( "javax.transaction.UserTransaction"); } catch (NamingException e) { e.printStackTrace(); } return ut; } } [/code] dao层 [code="java"] public class AdminDALImpl implements AdminDAL { Connection con = null; private Context ctx = null; private javax.sql.DataSource ds = null; public AdminDALImpl() { String JNDIName = "***"; try { ctx = new InitialContext(); ds = (javax.sql.DataSource) ctx.lookup(JNDIName); try { con = ds.getConnection(); } catch (SQLException ex1) { ex1.getMessage(); } } catch (NamingException ex) { ex.getMessage(); } } public void saveBean(String name, String pwd) throws Exception { java.sql.Statement st = null; String sql = "insert into t_admin (name,pwd) values ('" + name + "','" + pwd + "')"; try { st = con.createStatement(); st.executeUpdate(sql); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); throw new Exception(e.getMessage()); } finally { con.close(); st.close(); } } } [/code] dao层 [code="java"] public class TestDALImpl implements TestDAL { Connection con = null; private Context ctx = null; private javax.sql.DataSource ds = null; public TestDALImpl() { String JNDIName = "***"; try { ctx = new InitialContext(); ds = (javax.sql.DataSource) ctx.lookup(JNDIName); try { con = ds.getConnection(); } catch (SQLException ex1) { ex1.getMessage(); } } catch (NamingException ex) { ex.getMessage(); } } public void saveBean(String id, String name) throws Exception { java.sql.Statement st = null; String sql = "insert into test (id,name) values ('" + id + "','" + name + "')"; try { st = con.createStatement(); st.executeUpdate(sql); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); throw new Exception(e.getMessage()); } finally { st.close(); con.close(); } } } [/code] 服务层 [code="java"] public class TestBusinessImpl implements TestBusiness{ public TestBusinessImpl() { } public void saveTest() throws Exception { AdminDAL adminDal = new AdminDALImpl(); TestDAL testDal = new TestDALImpl(); adminDal.saveBean("abcd", "abcd"); testDal.saveBean("test","testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttest"); } } [/code] servlet 类 [code="java"] public class TestServlet extends HttpServlet { public TestServlet() { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("**进入servlet**"); TestBusiness business = (TestBusiness)new DynaProxyTransaction().bind(new TestBusinessImpl()); try { business.saveTest(); } catch (Exception ex) { ex.getMessage(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } [/code] 随便搭了一个平台,接口类我就没写了... 试了好多次..保存test的时候执行SQL是错误的,应该执行事务回滚.第一条好是插入进去了 sdh5724说的Anotation还没去研究 谢谢 [b]问题补充:[/b] 可能你们没看到我这样写是错误的... 我也知道没关联上.但是我不知道该如何关联上... [b]问题补充:[/b] 既然决定发这个贴,就不怕受打击了... 但是还是请多多指教.既然不需要.为什么希望指明点,对事务处理这块碰到的比较少.. [b]问题补充:[/b] [quote] 单一数据库, Connetion就能完成事务了, 也就是所说的数据库自身的事务管理:) [/quote] 你是说jdbc自带的事务处理? con.setAutoCommit(false);设置为手动提交? 那是如何让dao只执行数据库操作 难道把connection做参数传进去? [b]问题补充:[/b] 我只是想理解这块的设计方式,如何设计是比较OK的,代码如何写才是比较好的.如何解决类似这样的问题.. 抛出异常的爱让我知道可以用代理模式(很早以前就看过代理,一直没想到该用在什么地方) sdh5724也让我知道我还有好都东西搞的乱七八糟,现在恶补中... 谢谢几位, 大家有什么意见还可以提,这并不是说要解决具体什么问题,只是一个想了解设计 思路来彻底的解开这耦合.我会准时结帖... 备注:Anotation应该是Annotation
dbutils插入数据到mysql数据库报莫名其妙地NullpointerException
web层 public class BaseServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //获取子类字节码对象 Class clazz = this.getClass(); System.out.println(this); //获取method方法名参数,作为获取方法对象的参数 String m = request.getParameter("method"); if(m==null){ m="index"; } System.out.println(m); //获取方法对象 Method method = clazz.getMethod(m, HttpServletRequest.class, HttpServletResponse.class); //让方法执行,返回值为请求转发路径 String s = (String) method.invoke(this, request, response); System.out.println(s); //判断次路径是否为空,不为空请求转发到次路径 if(s != null){ request.getRequestDispatcher(s).forward(request, response); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); } } public class OrderServlet extends BaseServlet { /** * 生成订单 * @param request * @param response * @return * @throws Exception */ public String add(HttpServletRequest request, HttpServletResponse response) throws Exception { //0判断用户是否登录 User user = (User) request.getSession().getAttribute("user"); if(user == null) { request.setAttribute("msg", "请先登录~~~~~"); return "/jsp/msg.jsp"; } //1封装数据 Order order = new Order(); //1.1 封装订单id order.setOid(UUIDUtils.getId()); //1.2封装订单时间 order.setOrderTime(new Date()); //1.3封装订单金额 //获取session中的购物车 Cart cart = (Cart) request.getSession().getAttribute("cart"); order.setTotal(cart.getTotalPrice()); //1.4封装订单项 //从购物车中获取购物车项,遍历购物车中的购物车项,得到每个订单项中的数据 for (CartItem cartItem : cart.getCartItem()) { OrderItem oi = new OrderItem(); //设置订单项id oi.setItemid(UUIDUtils.getId()); //设置订单项包含的商品 oi.setProduct(cartItem.getProduct()); //设置包含于那个订单 oi.setOrder(order); //设置订单项中的商品数 oi.setCount(cartItem.getCount()); //设置定单项的小计 oi.setSubTotal(cartItem.getSubTotal()); //添加订单项到order对 象中 order.getItems().add(oi); } //1.5设置用户 order.setUser(user); //调用service,完成对订单的添加 OrderService os = (OrderService) BeanFactory.getBean("OrderService"); os.add(order); //将order对象放入request域 request.setAttribute("order", order); //将以前的购物车中的东西,即将以前的从购物车清除了 request.getSession().removeAttribute("cart"); //请求转发到订单详情页面 return "/jsp/order_info.jsp"; } } service层 public interface OrderService { void add(Order order) throws Exception; } public class OrderServiceImpl implements OrderService { /** * 将订单数据添加到数据库中 * @throws Exception */ @Override public void add(Order order) throws Exception{ try { //1对者两个添加要加入事务 DataSourceUtils.startTransaction(); //2在order添加一条数据 OrderDao od = (OrderDao) BeanFactory.getBean("OrderDao"); od.add2Order(order); //在orderitem中添加n条数据 for (OrderItem oi : order.getItems()) { od.add2OrderItem(oi); } //提交事务 DataSourceUtils.commitAndClose(); } catch (Exception e) { e.printStackTrace(); //事务回滚 DataSourceUtils.rollbackAndClose(); throw e; } } } dao层 public interface OrderDao { void add2Order(Order order) throws Exception; void add2OrderItem(OrderItem oi) throws Exception; } public class OrderDaoImpl implements OrderDao{ /** * 添加一条订单 */ @Override public void add2Order(Order order) throws SQLException { QueryRunner qr = new QueryRunner(); String sql = "insert into order values(?, ?, ?, ?, ?, ?, ?, ?)"; qr.update(DataSourceUtils.getConnection(), sql, order.getOid(), order.getOrderTime(), order.getTotal(), order.getState(), order.getAddress(), order.getName(), order.getPhone(), order.getUser().getUid()); } /** * 添加一条订单项 */ @Override public void add2OrderItem(OrderItem oi) throws SQLException { QueryRunner qr = new QueryRunner(); String sql = "insert into orderitem values(?, ?, ?, ?, ?)"; qr.update(DataSourceUtils.getConnection(),sql, oi.getItemid(), oi.getCount(), oi.getSubTotal(), oi.getProduct().getPid(), oi.getOrder().getOid()); } } 出错后jsp页面显示不出,所报异常 java.lang.NullPointerException at com.mysql.jdbc.ResultSetMetaData.getField(ResultSetMetaData.java:397) at com.mysql.jdbc.ResultSetMetaData.getColumnType(ResultSetMetaData.java:275) at com.mysql.jdbc.MysqlParameterMetadata.getParameterType(MysqlParameterMetadata.java:80) at org.apache.commons.dbutils.AbstractQueryRunner.fillStatement(AbstractQueryRunner.java:197) at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:485) at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:402) at com.local.dao.OrderDaoImpl.add2Order(OrderDaoImpl.java:19) at com.local.service.OrderServiceImpl.add(OrderServiceImpl.java:28) at com.local.web.servlet.OrderServlet.add(OrderServlet.java:82) 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 com.local.web.servlet.BaseServlet.service(BaseServlet.java:36) 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 com.local.web.filter.EncodingFilter.doFilter(EncodingFilter.java:36) 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) java.lang.reflect.InvocationTargetException 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 com.local.web.servlet.BaseServlet.service(BaseServlet.java:36) 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 com.local.web.filter.EncodingFilter.doFilter(EncodingFilter.java:36) 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: java.lang.NullPointerException at com.mysql.jdbc.ResultSetMetaData.getField(ResultSetMetaData.java:397) at com.mysql.jdbc.ResultSetMetaData.getColumnType(ResultSetMetaData.java:275) at com.mysql.jdbc.MysqlParameterMetadata.getParameterType(MysqlParameterMetadata.java:80) at org.apache.commons.dbutils.AbstractQueryRunner.fillStatement(AbstractQueryRunner.java:197) at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:485) at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:402) at com.local.dao.OrderDaoImpl.add2Order(OrderDaoImpl.java:19) at com.local.service.OrderServiceImpl.add(OrderServiceImpl.java:28) at com.local.web.servlet.OrderServlet.add(OrderServlet.java:82) ... 28 more 七月 08, 2017 12:01:24 下午 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet [OrderServlet] in context with path [/store] threw exception java.lang.RuntimeException at com.local.web.servlet.BaseServlet.service(BaseServlet.java:44) 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 com.local.web.filter.EncodingFilter.doFilter(EncodingFilter.java:36) 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) com.local.web.servlet.OrderServlet@8bc0b9 add 我用debug方式看了看了下order在dao用dbutils插入时的数据,数据是封装进去的,就name,address,phone,三项没有封装。并已经接图。以前在mysql中插入数据页是可以插入空数值的, 为何会报NullPointerException,困扰了好些时候了,各位大神有时间的话帮着看一下呀!
Spring事务的问题,bulkUpdate,或query.executeUpdate
今天在测试spring任务调度时,突然发现我配的声明事务不起作用了,找了好久才发现不是我的事务的问题,是我在Dao中用了一个方法有问题 方法如下: public void updateByIds(final Set<String> updateIds)throws DaoException{ try { String queryString="update from Yaoyueyingyue y set y.state='2' where y.yaoyueid in (?)"; getHibernateTemplate().bulkUpdate(queryString, updateIds.toArray()); } catch (Exception e) { e.printStackTrace(); throw new DaoException(this.getClassName()+e.getMessage()); } updateIds是一个包含要更新的编号集合,我发现用这个方法在我Manager中调用Dao事务就不起作用了,后来又改成这样 public void updateByIds(final Set<String> updateIds)throws DaoException{ try { getHibernateTemplate().execute(new HibernateCallback(){ final String hql="update Yaoyueyingyue y set y.state=2 where yaoyueid in (:yaoyueid)"; public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query=session.createQuery(hql); query.setParameterList("yaoyueid", updateIds); query.executeUpdate(); return null; } }); } catch (Exception e) { e.printStackTrace(); throw new DaoException(this.getClassName()+e.getMessage()); } } 事务还是不行,这两个方法好像不受spring AOP事务管理,只要执行到这个Dao的方法就自动提交了,出来异常也不能回滚,真是郁闷,小弟对这块不是很明白,为什么事务就不行了呢,希望那位牛人,帮我解释下,谢谢了, 我的spring声明事务大概如下: <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <property name="forceShutdown"> <value>true</value></property> </bean> <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> <property name="transactionTimeout" value="300"/> </bean> <bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager"><ref bean="atomikosTransactionManager" /></property> <property name="userTransaction"><ref bean="atomikosUserTransaction" /></property> </bean> <aop:config> <!-- This definition creates auto-proxy infrastructure based on the given pointcut, expressed in AspectJ pointcut language. Here: applying the advice named "txAdvice" to all methods on classes named PetStoreImpl. --> <aop:advisor pointcut="execution(* com.goal.log.manager.*.*(..))" advice-ref="txAdvice" /> <aop:advisor pointcut="execution(* com.goal.system.manager.*.*(..))" advice-ref="txAdvice" /> </aop:config> <!-- @Transactional 时要使用下面一行 --> <!-- <tx:annotation-driven transaction-manager="springTransactionManager" proxy-target-class="true"/> --> <!-- Transaction advice definition, based on method name patterns. Defaults to PROPAGATION_REQUIRED for all methods whose name starts with "insert" or "update", and to PROPAGATION_REQUIRED with read-only hint for all other methods.--> <!-- 引用springTransactionManager --> <tx:advice id="txAdvice" transaction-manager="springTransactionManager"> <tx:attributes> <tx:method name="save*" rollback-for="java.lang.Exception"/> <tx:method name="insert*" rollback-for="java.lang.Exception"/> .... <tx:method name="*" read-only="true" rollback-for="java.lang.Exception"/> </tx:attributes> </tx:advice> atomikosTransactionManager这个东西不用管,是一个开源的支持JTA分布式的JAR,希望有人能够为我解答........ [b]问题补充:[/b] 谢谢你的解答,但是我还是不明白你的意思,你是指我的Dao中用了内部类吗,你所指的 “调用updateByIds方法 的代码 跳出你的当前类 然后在别的类调用当前了类的接口中的方法updateByIds ”是指什么意思,能不能说明白点,谢谢了!!! [b]问题补充:[/b] 谢谢你的答复,你的意思我也理解,但好像不是这个问题,因为我并没有像你说的那样在类的内部调用,我的所有方法都是在业务逻辑层调用的Manager层,Manager层我是在Spring中配置了的声明事务的,我给你据个例子: 这两个方法都是Dao中的 方法一: [code="java"] public void updateByIds(final Set<String> updateIds)throws DaoException{ try { /*String queryString="update from Yaoyuepub y set y.state='2' where y.yaoyueid in (?)"; getHibernateTemplate().bulkUpdate(queryString, updateIds.toArray());*/ getHibernateTemplate().execute(new HibernateCallback(){ final String hql="update Yaoyuepub y set y.state=2 where yaoyueid in (:yaoyueid)"; public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query=session.createQuery(hql); query.setParameterList("yaoyueid", updateIds); query.executeUpdate(); return null; } } ); } catch (Exception e) { e.printStackTrace(); throw new DaoException(this.getClassName()+e.getMessage()); } } [/code] 这个方法是把所有的要改的ID都一次性更新调,我是不想执行多条sql,在Manager中调用这个方法事务就起不了作用,还有一个方法,就是普通的更新对象 [code="java"] public void update(T t) throws DaoException { try { getHibernateTemplate().update(t); } catch (Exception e) { throw new DaoException(getClassName() + " update exception...",e); } } [/code] 要是把刚才Manager中调用改成循环执行下面的方法一个一个对象,就是有事务的,所以调用都一样,更类的内部调用应给没有关系的,我认为不管是query.executeUpdate还是spring自己提供的bulkUpdate这两个方法都是要写sql的,目的是满足批量更新和更大的灵活性,但是事务就不行了,我认为肯定可以让声明式事务支持这两个方法,就是不知道怎么配置一下,你可以自己在代码中分别做个例子试试,看看是不是用批量更新事务就控制不了了, 这就是我的理解,还请多多指教,谢谢诶!!! [b]问题补充:[/b] 我测试过了,以为可以了,但是还是不行,下面是我调用的一小部分代码 [code="java"] public void runThread() { Set<String> updateIds = new HashSet<String>(); for (Yaoyueyingyue yaoyueyingyue : yaoyueyingyues) { updateIds.add(yaoyueyingyue.getYaoyueid()); } if (updateIds.size() > 0) { yaoyuepubDao.updateByIds(updateIds); if(true) throw new RuntimeException("AAAAAAAAAAAAAAAAAAAAAAAAA"); yaoyueyingyueDao.updateByIds(updateIds); } [/code] 上面是我Manager中Spring任务调度自动执行的方法的一小部分,我中间估计抛出了异常,但是yaoyuepubDao数据库中都更新了,事务不起作用,我估计其实就是和bulkUpdate方法一样,只要这个方法能用事务控制了的话,应该没问题了 [b]问题补充:[/b] 下面是我在网上拷贝的--------------------------------   Spring的HibernateTemplate提供了Hibernate的完美封装,即通过匿名类实现回调,来保证Session的自动资源管理和事务的管理。其中核心方法是:   java代码: HibernateTemplate.execute(new HibernateCallback() {  public Object doInHibernate(Session session) throws HibernateException {   ....  } }   回调方法提供了session作为参数,有了session,就可以自由的使用Hibernate API编程了。使用了spring的之后,代码修改如下:   web层代码:   java代码: DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class); detachedCriteria.createAlias("employees", "e").add(Restrictions.eq("name", "department")).add(Restrictions.gt(("e.age"), new Integer(20))); departmentManager.findByCriteria(detachedCriteria);   构造detachedCriteria,作为参数传递给departmentManager   业务层代码使用spring,DepartmentManager的findByCriteria如下:   java代码: public List findByCriteria(final DetachedCriteria detachedCriteria) {  return (List) getHibernateTemplate().execute(new HibernateCallback() {   public Object doInHibernate(Session session) throws HibernateException {    Criteria criteria = detachedCriteria.getExecutableCriteria(session);    return criteria.list();   }  }); }   实际上也就是:   java代码: Criteria criteria = detachedCriteria.getExecutableCriteria(session); return criteria.list();   而已   但是该程序代码执行,会抛出强制类型转换异常!   我跟踪了一下spring和Hibernate源代码,原因如下:   spring的HibernateTemplate的execute方法提供的回调接口具有Session作为参数,但是实际上,默认情况下,HibernateTemplate传递给回调接口的session并不是org.hibernate.impl.SessionImpl类,而是SessionImpl类的一个Proxy类。之所以替换成为一个Proxy类,HibernateTemplate的注释说明,Proxy提供了一些额外的功能,包括自动设置Cachable,Transaction的超时时间,Session资源的更积极的关闭等等。   java代码: private boolean exposeNativeSession = false; ...   execute方法内部: Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));   但是遗憾的是,Hibernate的DetachedCriteria的setExecutableCriteria方法却要求将session参数强制转为SessionImpl,但是spring传过来的却是一个Proxy类,因此就报错了。   java代码: public Criteria getExecutableCriteria(Session session) {  impl.setSession( (SessionImpl) session ); // 要求SessionImpl,Spring传递的是Proxy  return impl; }   解决方法,禁止Spring的HibernateTemplate传递Proxy类,强制要求它传递真实的SessionImpl类,即给exexute方法增加一个参数,提供参数为true,如下:   java代码: public List findByCriteria(final DetachedCriteria detachedCriteria) {  return (List) getHibernateTemplate().execute(new HibernateCallback() {   public Object doInHibernate(Session session) throws HibernateException {    Criteria criteria = detachedCriteria.getExecutableCriteria(session);    return criteria.list();   }  }, true); } [b]问题补充:[/b] bulkUpdate这个方法按你给的源码,那我是用错了,但是你所说的我的模拟异常不再AOP的事务之内,我就不同意你的观点了,[code="java"] if (updateIds.size() > 0) { yaoyuepubDao.updateByIds(updateIds); // 事务开启 执行updateByIds 事务提交 if(true) throw new RuntimeException("AAAAAAAAAAAAAAAAAAAAAAAAA"); yaoyueyingyueDao.updateByIds(updateIds); // 事务开启 执行updateByIds 事务提交 } [/code] 我这段代码是两个Dao的操作,而这两个Dao的操作是被封装在一个Manger中的方法中的,Manager的每个方法都是有事务的,在操作玩第一个Dao后抛出一个RunTime异常,这时候第一个Dao操作已经执行了,这时候事务应该回滚的,不应该去更新的第一个Dao的操作,Manager中本来就业务层,中间有好多的Dao操作,事务应该控制这些Dao要不都提交,要不都回滚,你说呢,而你说的在11-12行之间加异常,那在一个Dao中,再说的的Dao是没有配事务的,又何谈回滚呢,要是把我上面两个Dao操作改成普通的对象更新,是可以回滚的,这个我肯定 比如这样 [code="java"] yaoyuepubDao.update(yaoyuepub); if(true) throw new RuntimeException("AAAAAAAAAAAAAAAAAAAAAAAAA"); yaoyueyingyueDao.update(yaoyueyingyue); [/code] 这个时候如果抛出异常,yaoyuepub是不会更新到数据库的,会回滚的,所以我总结就是executeUpdate(sql)这个方法我们直接sql,和操作对象是不一样的的,具体我也没有研究 [b]问题补充:[/b] [code="java"] public void updateByIds(final Set<String> updateIds)throws DaoException{ try { getHibernateTemplate().execute(new HibernateCallback(){ final String hql="update Yaoyuepub y set y.state=2 where yaoyueid in (:yaoyueid)"; public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query=session.createQuery(hql); query.setParameterList("yaoyueid", updateIds); query.executeUpdate(); return null; } } , true); } catch (Exception e) { e.printStackTrace(); throw new DaoException(this.getClassName()+e.getMessage()); } } [/code] 把上面的updateIds方法改成: [code="java"] public void updateByIds(final Set<String> updateIds)throws DaoException{ try { DetachedCriteria dc=DetachedCriteria.forClass(Yaoyuepub.class); dc.add(Restrictions.in("yaoyueid", updateIds)); List<Yaoyuepub> yaoyuepubs=select(dc); for(Yaoyuepub y:yaoyuepubs){ update(y); } } catch (Exception e) { e.printStackTrace(); throw new DaoException(this.getClassName()+e.getMessage()); } } [/code] 所有的调用都不变,spring事务就起作用了,说明自己createQuery然后executeUpdate是不被事务管理的,后其他都没有关系
求大神指点,第11行如何修改?
public class NestTry { public static void main(String[] args) { int k; int i; try { System.out.println("这是第一层try开始!"); try { System.out.println("这是第二层try!"); int b[]=null; k=b[0]; System.out.prinltn("这是第二层try结束!"); } catch(Exception ex) { System.out.println(ex); } finally { System.out.println("这是第一层finally!"); } i=10/0; System.out.println("这是第一层try结束!"); } catch(Exception ex) { System.out.println(ex); } finally { System.out.println("这是第二层finally!"); } } } Exception in thread "main" java.lang.Error: Unresolved compilation problem: The method prinltn(String) is undefined for the type PrintStream at NestTry.main(NestTry.java:11)
怎么把service层的一个model类型的数组通过controller层传递给一个JSP并显示出来
如题,我的controller里的函数是: @RequestMapping("/storelogin.do")//查询到请求映射规则 public String Swelcome(@RequestParam(value="dsid")String did,@RequestParam(value="dsps")String dsps,ModelMap model, HttpServletRequest request, HttpServletResponse response) throws SQLException//获取视图层参数 { int flag; Sdata[] orders=new Sdata[100]; flag=software.work.service.Sservice.LoginDAO(did,dsps);//调用业务逻辑层函数 orders=software.work.service.Sservice.ShowOrders(dsid); if(flag==0)return "loginerror";//用户名密码输入错误 else { dsid=software.work.model.Sdata.getDsid();//从模型中读取数据 model.put("dsid", dsid);;//将模型数据传入渲染视图 request.getSession().setAttribute("orders",orders); return "OrderQuery";//返回逻辑视图名,加上。jsp后缀 } } 我的service层里的函数是: public static Sdata[] ShowOrders(String dsid)//从model中数据重新导回数据库 { String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; String dburl = "jdbc:sqlserver://localhost:1433;DatabaseName=B2C"; String user="ordertester"; String password2="12345"; Sdata[] orders=new Sdata[100]; int i; try{ Class.forName(driver); //加载数据库驱动程序 Connection conn = DriverManager.getConnection(dburl,user,password2);//创建数据库连接对象 String sql="select * from Orders,OrderDetail where Orders.O_id=OrderDetail.O_id and OrderDetail.DS_id="+dsid; Statement stmt=conn.createStatement(); rs=stmt.executeQuery(sql); i=0; if(rs.next()) { while(rs.next()){ orders[i].setOtype(rs.getString("O_type")); orders[i].setOall(rs.getString("O_all")); orders[i].setOdate(rs.getString("O_data")); orders[i].setCid(rs.getString("O_id")); orders[i].setCid(rs.getString("C_id")); orders[i].setOdcount(rs.getInt("Od_id")); orders[i].setOdprice(rs.getFloat("OD_price")); orders[i].setMedid(rs.getString("Med_id")); i++; } stmt.close(); conn.close(); return orders; } else { stmt.close(); conn.close(); return null; } }catch(ClassNotFoundException e1){}catch(SQLException e2){} return null; } 请问JSP该怎么写啊
出现错误:Subquery returns more than 1 row
这是一个进销存的出入库项目部分,现在问题不知道出在哪里,请各位大虾帮帮忙,帮忙看看 ``` java.sql.SQLException: Subquery returns more than 1 row at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2427) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2345) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2330) at com.sxt.gmms.dao.instorage.InStorageDao.addInStorageAndItem(InStorageDao.java:40) at com.sxt.gmms.frame.instorage.instorage.InStorageFrame.actionPerformed(InStorageFrame.java:233) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$200(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) 这是项目的源代码 /** * 商品入库的DAO层 * * @author Administrator * */ public class InStorageDao { public void addInStorageAndItem(InStorage inStorage, List<InStorageItem> itemList) { Connection con = null; PreparedStatement stat = null; ResultSet rs = null; try { con = DBUtil.getConn(); // 设置自动提交为false con.setAutoCommit(false); // 先保存入库单 String inSql = "insert into iss_in(" + "in_code," + "in_date," + "in_status," + "emp_id)" + " values(?,?,?,(" + "select emp_id from iss_employee " + "where emp_name=?)) "; stat = con.prepareStatement(inSql, new String[] { "in_id" }); stat.setString(1, inStorage.getInCode()); stat.setDate(2, new java.sql.Date(inStorage.getInDate().getTime())); stat.setInt(3, inStorage.getInStatus()); stat.setString(4, inStorage.getEmp().getEmpName()); stat.executeUpdate();//出错了??? // 取得返回的入库单id int inId = 0; rs = stat.getGeneratedKeys(); if (rs.next()) { inId = rs.getInt(1); } // 再保存入库明细 String itemSql = "insert into iss_in_item(" + "in_item_price," + "in_item_qty," + "in_item_status," + "goods_id," + "in_id)" + "values(?,?,?," + "(select goods_id from iss_goods where goods_code = ?)," + "?)"; stat = con.prepareStatement(itemSql); for (InStorageItem inStorageItem : itemList) { stat.setFloat(1, inStorageItem.getInItemPrice()); stat.setInt(2, inStorageItem.getInItemQty()); stat.setInt(3, 1); stat.setString(4, inStorageItem.getGoods().getGoodsCode()); stat.setInt(5, inId); stat.executeUpdate(); } con.commit(); } catch (Exception e) { e.printStackTrace(); try { con.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } finally { DBUtil.closeConn(con, stat, rs); } } } ``` 这是数据库部分,用的是MySQL数据库,请各位大虾帮帮忙! ![图片说明](https://img-ask.csdn.net/upload/201605/11/1462948190_737156.png) ![图片说明](https://img-ask.csdn.net/upload/201605/11/1462948205_833102.png)
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
死磕YOLO系列,YOLOv1 的大脑、躯干和手脚
YOLO 是我非常喜欢的目标检测算法,堪称工业级的目标检测,能够达到实时的要求,它帮我解决了许多实际问题。 这就是 YOLO 的目标检测效果。它定位了图像中物体的位置,当然,也能预测物体的类别。 之前我有写博文介绍过它,但是每次重新读它的论文,我都有新的收获,为此我准备写一个系列的文章来详尽分析它。这是第一篇,从它的起始 YOLOv1 讲起。 YOLOv1 的论文地址:https://www.c
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背
有一次面试的时候,被问到进程之间有哪些通信方式,不过由于之前没深入思考且整理过,说的并不好。想必大家也都知道进程有哪些通信方式,可是我猜很多人都是靠着”背“来记忆的,所以今天的这篇文章,讲给大家详细着讲解他们是如何通信的,让大家尽量能够理解他们之间的区别、优缺点等,这样的话,以后面试官让你举例子,你也能够顺手拈来。 1、管道 我们来看一条 Linux 的语句 netstat -tulnp | gr...
20行Python代码爬取王者荣耀全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片
网络(8)-HTTP、Socket、TCP、UDP的区别和联系
TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。 一、TCP与UDP的不同 1. 是否需要建立连接。 UDP在传送数据之前不需要先建立连接;TCP则提供面向连接的服务; 2. 是否需要给出确认 对方的传输层在收到UDP报文后,不需要给出任何确认,而 TCP需要给出确认报文,要提供可靠的、面向连接的传输服务。 3.虽然UDP不提供可靠交...
简明易理解的@SpringBootApplication注解源码解析(包含面试提问)
欢迎关注文章系列 ,关注我 《提升能力,涨薪可待》 《面试知识,工作可待》 《实战演练,拒绝996》 欢迎关注我博客,原创技术文章第一时间推出 也欢迎关注公 众 号【Ccww笔记】,同时推出 如果此文对你有帮助、喜欢的话,那就点个赞呗,点个关注呗! 《提升能力,涨薪可待篇》- @SpringBootApplication注解源码解析 一、@SpringBootApplication 的作用是什
防劝退!数据结构和算法难理解?可视化动画带你轻松透彻理解!
大家好,我是 Rocky0429,一个连数据结构和算法都不会的蒟蒻… 学过数据结构和算法的都知道这玩意儿不好学,没学过的经常听到这样的说法还没学就觉得难,其实难吗?真难! 难在哪呢?当年我还是个小蒟蒻,初学数据结构和算法的时候,在忍着枯燥看完定义原理,之后想实现的时候,觉得它们的过程真的是七拐八绕,及其难受。 在简单的链表、栈和队列这些我还能靠着在草稿上写写画画理解过程,但是到了数论、图...
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
开挂的人生!那些当选院士,又是ACM/IEEE 双料Fellow的华人学者们
昨日,2019年两院院士正式官宣,一时间抢占了各大媒体头条。 朋友圈也是一片沸腾,奔走相告,赶脚比自己中了大奖还嗨皮! 谁叫咱家导师就是这么厉害呢!!! 而就在最近,新一年度的IEEE/ACM Fellow也将正式公布。 作为学术届的顶级荣誉,不自然地就会将院士与Fellow作比较,到底哪个含金量更高呢? 学术君认为,同样是专业机构对学者的认可,考量标准不一,自然不能一概而论。 但...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
Python语言高频重点汇总
Python语言高频重点汇总 GitHub面试宝典仓库——点这里跳转 文章目录Python语言高频重点汇总**GitHub面试宝典仓库——点这里跳转**1. 函数-传参2. 元类3. @staticmethod和@classmethod两个装饰器4. 类属性和实例属性5. Python的自省6. 列表、集合、字典推导式7. Python中单下划线和双下划线8. 格式化字符串中的%和format9.
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
代码详解:如何用Python快速制作美观、炫酷且有深度的图表
全文共12231字,预计学习时长35分钟生活阶梯(幸福指数)与人均GDP(金钱)正相关的正则图本文将探讨三种用Python可视化数据的不同方法。以可视化《2019年世界幸福报告》的数据为例,本文用Gapminder和Wikipedia的信息丰富了《世界幸福报告》数据,以探索新的数据关系和可视化方法。《世界幸福报告》试图回答世界范围内影响幸福的因素。报告根据对“坎特里尔阶梯问题”的回答来确定幸...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
(经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
今年正式步入了大四,离毕业也只剩半年多的时间,回想一下大学四年,感觉自己走了不少弯路,今天就来分享一下自己大学的学习经历,也希望其他人能不要走我走错的路。 (一)初进校园 刚进入大学的时候自己完全就相信了高中老师的话:“进入大学你们就轻松了”。因此在大一的时候自己学习的激情早就被抛地一干二净,每天不是在寝室里玩游戏就是出门游玩,不过好在自己大学时买的第一台笔记本性能并不是很好,也没让我彻底沉...
如何写一篇技术博客,谈谈我的看法
前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 我一直推崇学技术可以写技术博客去沉淀自己的知识,因为知识点实在是太多太多了,通过自己的博客可以帮助自己快速回顾自己学过的东西。 我最开始的时候也是只记笔记,认为自己能看得懂就好。但如果想验证自己是不是懂了,可以写成技术博客。在写技术博客的...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
互联网公司的裁员,能玩出多少种花样?
裁员,也是一门学问,可谓博大精深!以下,是互联网公司的裁员的多种方法:-正文开始-135岁+不予续签的理由:千禧一代网感更强。95后不予通过试用期的理由:已婚已育员工更有责任心。2通知接下来要过苦日子,让一部分不肯同甘共苦的员工自己走人,以“兄弟”和“非兄弟”来区别员工。3强制996。员工如果平衡不了工作和家庭,可在离婚或离职里二选一。4不布置任何工作,但下班前必须提交千字工作日报。5不给活干+...
【设计模式】单例模式的八种写法分析
网上泛滥流传单例模式的写法种类,有说7种的,也有说6种的,当然也不排除说5种的,他们说的有错吗?其实没有对与错,刨根问底,写法终究是写法,其本质精髓大体一致!因此完全没必要去追究写法的多少,有这个时间还不如跟着宜春去网吧偷耳机、去田里抓青蛙得了,一天天的....
《面试宝典》:检验是否为合格的初中级程序员的面试知识点,你都知道了吗?查漏补缺
欢迎关注文章系列,一起学习 《提升能力,涨薪可待篇》 《面试知识,工作可待篇》 《实战演练,拒绝996篇》 也欢迎关注公 众 号【Ccww笔记】,原创技术文章第一时间推出 如果此文对你有帮助、喜欢的话,那就点个赞呗,点个关注呗! 《面试知识,工作可待篇》-Java笔试面试基础知识大全 前言 是不是感觉找工作面试是那么难呢? 在找工作面试应在学习的基础进行总结面试知识点,工作也指日可待,欢...
关于研发效能提升的思考
研发效能提升是最近比较热门的一个话题,本人根据这几年的工作心得,做了一些思考总结,由于个人深度有限,暂且抛转引入。 三要素 任何生产力的提升都离不开这三个因素:人、流程和工具,少了其中任何一个因素都无法实现。 人,即思想,也就是古人说的“道”,道不同不相为谋,是制高点,也是高层建筑的基石。 流程,即方法,也是古人说的“法”。研发效能的提升,也就是要提高投入产出比,既要增加产出,也要减...
微博推荐算法简述
在介绍微博推荐算法之前,我们先聊一聊推荐系统和推荐算法。有这样一些问题:推荐系统适用哪些场景?用来解决什么问题、具有怎样的价值?效果如何衡量? 推荐系统诞生很早,但真正被大家所重视,缘起于以”facebook”为代表的社会化网络的兴起和以“淘宝“为代表的电商的繁荣,”选择“的时代已经来临,信息和物品的极大丰富,让用户如浩瀚宇宙中的小点,无所适从。推荐系统迎来爆发的机会,变得离用户更近: 快...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
相关热词 c# 数组类型 泛型约束 c#的赛狗日程序 c# 传递数组 可变参数 c# 生成存储过程 c# list 补集 c#获得所有窗体 c# 当前秒数转成年月日 c#中的枚举 c# 计算校验和 连续随机数不重复c#
立即提问