Java如何设计数据库记录到对象的映射的

Java如何设计数据库记录到对象的映射的,datamapper和recordactive又扮演了什么角色?
刚刚和同事聊天,同事是工作近十年的HTML5前端工程师,对Java后端也有很深造诣。我是入坑不久的菜鸟。今天我在浏览MyBatis源码时,问道:“如何才能简单快速读取MyBatis源码?”
同事回答我说:“首先,带着问题去看,然后根据Java的设计模式,去理解源码的实现和设计。”之后他和我谈到数据库记录到对象的映射,告诉我Datamapper和recordactive是很好的两种可以用于关系映射的架构设计。
我在网上搜了一下,没有看到太有用的信息,希望大神能解答一下。多谢。

1个回答

[浅显认知]
数据库表与对象建立了一种关联关系,这种叫做Datamapper模型,开发速度快,程序只需要关注对象之间的关系就行了。比如mybatis,hibernate框架;
数据库表记录对应一个实例对象(用数据库字段名),这种叫做Recordactive模型,开发效率高。比如jfinal框架。

m0_37530301
推荐爱你Jonah 十分感谢你的回答,请问有什么这方面的资料可以推荐么。
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
现在是一些关键操作要记录操作日志,但是在insert的时候,偶然会出现插入失败的问题.现在找不到问题所在?
执行代码 ``` HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); SsOperLog ssOperLogEntity = new SsOperLog(); ssOperLogEntity.setOperNo(Long.valueOf(IdGenarater.nextStringValue()));//操作流水号 UserInfo users = Util.getSessionUserInfo(request);//登录用户 if (users == null) {//用户还未登录 String workCode = request.getParameter("workCode"); String urlString = request.getHeader("host"); //根据域名获取部门编号 String deptCode = loginService.getDeptCodeByDomainName(urlString); users = loginService.selectByUserIdAndPassword(workCode, null, deptCode); if (users == null) { return point.proceed(); } } ssOperLogEntity.setDeptCode(users.getDeptCode());//用户机构 ssOperLogEntity.setOperId(Long.valueOf(users.getOperId()));//用户id ssOperLogEntity.setOperName(users.getOperName());//操作员 ssOperLogEntity.setDeptName(users.getDeptName()); ssOperLogEntity.setOperDate(new Date(System.currentTimeMillis()));//操作日期 ssOperLogEntity.setOperTime(new Date(System.currentTimeMillis()));//操作时间 String rquestName = getMthodRemark(point);//操作名称(对应注解里面的remark信息) String operType = getMthodOperType(point);//操作类型(对应注解里面的opertype信息) String processMethod = point.getSignature().getName();//请求处理方法名 ssOperLogEntity.setReruestId(request.getRequestURI());//请求url ssOperLogEntity.setRquestName(rquestName); if(operType.length()>1){ //获取大类类型 ssOperLogEntity.setCategories(operType.substring(0,1)); } ssOperLogEntity.setProcessMethod(processMethod); ssOperLogEntity.setOperType(operType); ssOperLogEntity.setLocalAddress(request.getRemoteAddr()); if (!"/aa/login/checkLogin.do".equals(request.getRequestURI())) { String requestParams = JSONObject.toJSONString(request.getParameterMap()); ssOperLogEntity.setRequestParams(requestParams); }//请求参数 Object[] method_param = null; Object object; try { method_param = point.getArgs(); //获取方法参数 object = point.proceed(); } catch (Exception e) { ssOperLogEntity.setOperState(OperateStatusEnum.FAIL.getCode());//操作失败 ssOperLogEntity.setExceptionMesg(e.getMessage()); if (e.getMessage() == null) { ssOperLogEntity.setExceptionMesg(e.toString()); } mongoTemplate.insert(ssOperLogEntity); // ssOperLogMapper.insert(ssOperLogEntity); throw e; } ssOperLogEntity.setOperState(OperateStatusEnum.SUCC.getCode());//操作成功 mongoTemplate.insert(ssOperLogEntity); // 这里报错 // ssOperLogMapper.insert(ssOperLogEntity); return object; } ``` 异常信息:appserver-b4 等同于ip地址 ``` org.springframework.dao.DataAccessResourceFailureException: Operation on server appserver-b4:27017 failed; nested exception is com.mongodb.MongoException$Network: Operation on server appserver-b4:27017 failed at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:77) ~[spring-data-mongodb-1.10.15.RELEASE.jar:na] at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2128) ~[spring-data-mongodb-1.10.15.RELEASE.jar:na] at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:461) ~[spring-data-mongodb-1.10.15.RELEASE.jar:na] at org.springframework.data.mongodb.core.MongoTemplate.insertDBObject(MongoTemplate.java:1026) ~[spring-data-mongodb-1.10.15.RELEASE.jar:na] at org.springframework.data.mongodb.core.MongoTemplate.doInsert(MongoTemplate.java:835) ~[spring-data-mongodb-1.10.15.RELEASE.jar:na] at org.springframework.data.mongodb.core.MongoTemplate.insert(MongoTemplate.java:776) ~[spring-data-mongodb-1.10.15.RELEASE.jar:na] at org.springframework.data.mongodb.core.MongoTemplate.insert(MongoTemplate.java:767) ~[spring-data-mongodb-1.10.15.RELEASE.jar:na] at com.wx.app.ygp.service.log.LogService.doBefore(LogService.java:115) ~[classes/:na] at sun.reflect.GeneratedMethodAccessor867.invoke(Unknown Source) ~[na:na] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_162] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_162] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621) ~[spring-aop-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610) ~[spring-aop-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:68) ~[spring-aop-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) ~[spring-aop-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:654) ~[spring-aop-4.2.3.RELEASE.jar:4.2.3.RELEASE] at com.wx.app.ygp.action.system.LoginController$$EnhancerBySpringCGLIB$$3d4c3a49.checkLogin(<generated>) ~[classes/:na] at sun.reflect.GeneratedMethodAccessor1317.invoke(Unknown Source) ~[na:na] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_162] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_162] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) [servlet-api.jar:na] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) [servlet-api.jar:na] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) [catalina.jar:8.0.44] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.44] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.0.44] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.44] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.44] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) [spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.44] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.44] at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:167) [spring-session-1.3.1.RELEASE.jar:na] at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80) [spring-session-1.3.1.RELEASE.jar:na] at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) [spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) [spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.44] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.44] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) [catalina.jar:8.0.44] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94) [catalina.jar:8.0.44] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) [catalina.jar:8.0.44] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) [catalina.jar:8.0.44] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.44] at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) [catalina.jar:8.0.44] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.44] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502) [catalina.jar:8.0.44] at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132) [tomcat-coyote.jar:8.0.44] at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) [tomcat-coyote.jar:8.0.44] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1533) [tomcat-coyote.jar:8.0.44] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1489) [tomcat-coyote.jar:8.0.44] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_162] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_162] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.44] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_162] Caused by: com.mongodb.MongoException$Network: Operation on server appserver-b4:27017 failed at com.mongodb.DBTCPConnector.doOperation(DBTCPConnector.java:215) ~[mongo-java-driver-2.14.3.jar:na] at com.mongodb.DBCollectionImpl.writeWithCommandProtocol(DBCollectionImpl.java:567) ~[mongo-java-driver-2.14.3.jar:na] at com.mongodb.DBCollectionImpl.insertWithCommandProtocol(DBCollectionImpl.java:528) ~[mongo-java-driver-2.14.3.jar:na] at com.mongodb.DBCollectionImpl.insertImpl(DBCollectionImpl.java:206) ~[mongo-java-driver-2.14.3.jar:na] at com.mongodb.DBCollection.insert(DBCollection.java:176) ~[mongo-java-driver-2.14.3.jar:na] at com.mongodb.DBCollection.insert(DBCollection.java:93) ~[mongo-java-driver-2.14.3.jar:na] at com.mongodb.DBCollection.insert(DBCollection.java:78) ~[mongo-java-driver-2.14.3.jar:na] at com.mongodb.DBCollection.insert(DBCollection.java:120) ~[mongo-java-driver-2.14.3.jar:na] at org.springframework.data.mongodb.core.MongoTemplate$9.doInCollection(MongoTemplate.java:1031) ~[spring-data-mongodb-1.10.15.RELEASE.jar:na] at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:459) ~[spring-data-mongodb-1.10.15.RELEASE.jar:na] ... 63 common frames omitted Caused by: java.net.SocketException: Broken pipe (Write failed) at java.net.SocketOutputStream.socketWrite0(Native Method) ~[na:1.8.0_162] at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111) ~[na:1.8.0_162] at java.net.SocketOutputStream.write(SocketOutputStream.java:155) ~[na:1.8.0_162] at org.bson.io.PoolOutputBuffer.pipe(PoolOutputBuffer.java:153) ~[mongo-java-driver-2.14.3.jar:na] at com.mongodb.DBCollectionImpl.sendWriteCommandMessage(DBCollectionImpl.java:639) ~[mongo-java-driver-2.14.3.jar:na] at com.mongodb.DBCollectionImpl.access$300(DBCollectionImpl.java:50) ~[mongo-java-driver-2.14.3.jar:na] at com.mongodb.DBCollectionImpl$4.execute(DBCollectionImpl.java:576) ~[mongo-java-driver-2.14.3.jar:na] at com.mongodb.DBCollectionImpl$4.execute(DBCollectionImpl.java:567) ~[mongo-java-driver-2.14.3.jar:na] at com.mongodb.DBPort.doOperation(DBPort.java:187) ~[mongo-java-driver-2.14.3.jar:na] at com.mongodb.DBTCPConnector.doOperation(DBTCPConnector.java:208) ~[mongo-java-driver-2.14.3.jar:na] ... 72 common frames omitted ``` 配置MongoDB文件: ``` mongo.hostport=127.0.0.1:27017 mongo.connectionsPerHost=100 mongo.threadsAllowedToBlockForConnectionMultiplier=6 mongo.dataName=ygp mongo.username=ygp mongo.password=ygp_admin mongo.connectTimeout=60000 mongo.maxWaitTime=120000 mongo.autoConnectRetry=true mongo.socketKeepAlive=true mongo.socketTimeout=1500 mongo.slaveOk=true <?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:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!--设置用户验证--> <bean id="userCredentials" class="org.springframework.data.authentication.UserCredentials"> <constructor-arg name="username" value="${mongo.username}" /> <constructor-arg name="password" value="${mongo.password}" /> </bean> <!-- 定义mongo对象,对应的是mongodb官方jar包中的Mongo,replica-set设置集群副本的ip地址和端口 --> <mongo:mongo id="mongo" replica-set="${mongo.hostport}"> <!-- 一些连接属性的设置 --> <mongo:options connections-per-host="${mongo.connectionsPerHost}" threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}" connect-timeout="${mongo.connectTimeout}" max-wait-time="${mongo.maxWaitTime}" auto-connect-retry="${mongo.autoConnectRetry}" socket-keep-alive="${mongo.socketKeepAlive}" socket-timeout="${mongo.socketTimeout}" slave-ok="${mongo.slaveOk}" write-number="1" write-timeout="0" write-fsync="true" /> </mongo:mongo> <!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 --> <bean id="mongoDbFactory" class="org.springframework.data.mongodb.core.SimpleMongoDbFactory"> <constructor-arg ref="mongo" /> <constructor-arg value="${mongo.dataName}" /> <constructor-arg ref="userCredentials" /> </bean> <bean id="mappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" /> <!--排除 _class --> <bean id="defaultMongoTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper"> <constructor-arg name="typeKey"> <null /> </constructor-arg> </bean> <!-- collection的映射 --> <bean id="mappingMongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> <constructor-arg name="mappingContext" ref="mappingContext" /> <property name="typeMapper" ref="defaultMongoTypeMapper" /> </bean> <!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成 --> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> <constructor-arg name="mongoConverter" ref="mappingMongoConverter" /> </bean> </beans> ```
执行Delect好像未连接上数据库
package edu.jmi.xyh.view; import java.awt.BorderLayout; public class DeleteView extends JFrame { private JPanel contentPane; private JTextField txID; private JTextField txName; private JPasswordField txPw; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { DeleteView frame = new DeleteView(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public DeleteView() { setTitle("\u5220\u9664\u5B66\u751F\u4FE1\u606F"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JLabel label = new JLabel("\u5220 \u9664 \u5B66 \u751F \u4FE1 \u606F"); label.setFont(new Font("宋体", Font.PLAIN, 16)); label.setBounds(140, 22, 147, 15); contentPane.add(label); JLabel lblId = new JLabel("\u7528 \u6237 ID\uFF1A"); lblId.setBounds(95, 55, 69, 15); contentPane.add(lblId); txID = new JTextField(); txID.setBounds(174, 52, 113, 21); contentPane.add(txID); txID.setColumns(10); JLabel label_2 = new JLabel("\u7528 \u6237 \u540D\uFF1A"); label_2.setBounds(95, 98, 66, 15); contentPane.add(label_2); JLabel label_3 = new JLabel("\u5BC6 \u7801\uFF1A"); label_3.setBounds(95, 143, 54, 15); contentPane.add(label_3); txName = new JTextField(); txName.setBounds(174, 95, 113, 21); contentPane.add(txName); txName.setColumns(10); JButton button = new JButton("\u5220\u9664"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String id=txID.getText(); String pw=txPw.getText(); String name=txName.getText(); Student student=new Student(); student.setStuId(id); student.setStuName(name); student.setStuPwd(pw); StudentDao studentDao=new StudentDao(); int result=studentDao.delete(id); if(result==0){ JOptionPane.showMessageDialog(null, "删除成功!"); } else{ JOptionPane.showMessageDialog(null, "删除失败!"); } System.out.println("id="+id+"pw="+pw); } }); button.setBounds(75, 189, 93, 23); contentPane.add(button); JButton button_1 = new JButton("\u53D6\u6D88"); button_1.setBounds(232, 189, 93, 23); contentPane.add(button_1); txPw = new JPasswordField(); txPw.setBounds(174, 140, 113, 21); contentPane.add(txPw); } } package edu.jmi.xyh.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import edu.jmi.xyh.bean.Student; public class StudentDao { //测试用 //ORM object relation mapping hibernate,ibaits //每一条记录映射每一个对象,记录集合映射成对象集合List //Dao data access object //save将一个java对象存储到数据库表中,就是将对象转换为记录 public int save(Student student){ //建立一个DBOperation,通过这个对象完成数据库的连接操作 DBOperation dboperation= new DBOperation(); //获取数据库连接 Connection connection=null; try{ connection=dboperation.getConnection(); Statement st=connection.createStatement(); //字符串拼接 String sql="insert into student(stuId,stuName,stuPwd)values('" +student.getStuId()+"','"+student.getStuName()+"','"+student.getStuPwd()+"')"; //用来在程序中指挥sql命令执行 st.execute(sql); System.out.println(sql); return 0; }catch(Exception ex){ ex.printStackTrace(); //返回上层判断 return -1; }finally{ dboperation.closeConnect(connection); } } public int update(Student student){ //建立一个DBOperation,通过这个对象完成数据库的连接操作 DBOperation dboperation= new DBOperation(); //获取数据库 Connection connection=null; try{ connection=dboperation.getConnection(); Statement st=connection.createStatement(); //字符串拼接 String sql="update student set stuName='"+student.getStuName()+ "', stuPwd='"+student.getStuPwd()+"' where stuId='"+ student.getStuId()+"'"; st.execute(sql); System.out.println(sql); return 0; }catch(Exception ex){ ex.printStackTrace(); //返回上层判断 return -1; }finally{ dboperation.closeConnect(connection); } } public int delete(Student student){ //建立一个DBOperation,通过这个对象完成数据库的连接操作 DBOperation dboperation= new DBOperation(); //获取数据库连接 Connection connection=null; try{ connection=dboperation.getConnection(); String sql="delete from student where stuId='?'"; PreparedStatement pst=connection.prepareStatement(sql); pst.setString(1, student.getStuId()); pst.execute(); /* Statement st=connction.createStatement(); //字符串拼接 String sql="delete from student where Stuid='"+student.getStuid()+"'"; st.execute(sql);*/ System.out.println(sql); return 0; }catch(Exception ex){ ex.printStackTrace(); //返回上层判断 return -1; }finally{ dboperation.closeConnect(connection); } } //查询结果放到集合中,集合中的每一个对象都是student <>是泛型 public List<Student> query(){ //建立一个DBOperation,通过这个对象完成数据库的连接操作 DBOperation dboperation= new DBOperation(); //获取数据库 Connection connection=null; List<Student> list = new ArrayList<Student>(); try{ connection=dboperation.getConnection(); Statement st=connection.createStatement(); //查询语句 String sql="select* from student"; //查询语句执行exuecuteQuery,不是execte,执行后放回结果集resultset,把resultsest变成list,通过遍历实现 ResultSet rs=st.executeQuery(sql); //rs.next向下移动一行,刚开始在第0行。如果该行存在,返回true,否则会返回false, //每一行对应一个student对象,全部记录对应list //getInt,getString,getDate,getBoolean,获取该字段的值 //getInt(1),getInt("stuId") //可能有多条用while,最多用一条用if if(rs.next()){ Student student=new Student(); String stuId=rs.getString("stuId"); String stuName=rs.getString("stuName"); String stuPwd=rs.getString("stuPwd"); student.setStuId(stuId); student.setStuName(stuName); student.setStuPwd(stuPwd); //最后将student对象存放到集合中 list.add(student); } System.out.println(sql); return list; }catch(Exception ex){ ex.printStackTrace(); //返回上层判断 return null; }finally{ dboperation.closeConnect(connection); } } //重载 public static Student query(String id) { // TODO Auto-generated method stub //建立一个DBOperation,通过这个对象完成数据库的连接操作 DBOperation dbOperation=new DBOperation(); //获取数据库连接 Connection connction=null; try{ connction=dbOperation.getConnection(); Statement st=connction.createStatement(); //查询语句 String sql="select * from student where stuid='"+id+"'"; //查询语句执行exuecuteQuery,不是execute,执行后放回结果集resultset,把resultset变成list,通过遍历实现 ResultSet rs=st.executeQuery(sql); //可能有多条用while,最多一条就用if可以了。码农 Student student=null; if(rs.next()){ //如果有记录,新建一个student对象,将查到的结果封装到student对象中。 student=new Student(); String stuId=rs.getString("stuId"); String stuName=rs.getString("stuName"); String stuPwd=rs.getString("stuPwd"); student.setStuId(stuId); student.setStuName(stuName); student.setStuPwd(stuPwd); } return student; }catch(Exception ex){ ex.printStackTrace(); //返回上层判断 return null; }finally{ dbOperation.closeConnect(connction); } } public static void main(String args[]){ StudentDao studentDao=new StudentDao(); List<Student> list=studentDao.query(); //for each语句 iterator for(Student student:list){ System.out.println(student.getStuName()); } /*Student student=new Student(); student.setStuId("152118130235"); student.setStuName("徐耀辉"); student.setStuPwd("979194874");*/ } public int delete(String id) { // TODO Auto-generated method stub return 0; } }
Mybatis小练习 报错 求大神指导,信息详尽
# UserMapper ``` public interface UserMapper { //根据id查询用户信息 public User findUserById(int id) throws Exception; //根据用户名列查询用户列表 public List<User> findUserByName(String name)throws Exception; //插入用户 public void insertUser(User user)throws Exception; } ``` # UserMapper.xml ``` <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用,namespace等于mapper接口地址 --> <mapper namespace="com.neuedu.mapper.UserMapper"> <!-- 在 映射文件中配置很多sql语句 --> <!-- 需求:通过id查询用户表的记录 --> <!-- 通过 select执行数据库查询 id:标识 映射文件中的 sql 将sql语句封装到mappedStatement对象中,所以将id称为statement的id parameterType:指定输入 参数的类型,这里指定int型 #{}表示一个占位符号 #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 --> <select id="findUserById" parameterType="int" resultType="user"> SELECT * FROM user WHERE id=#{value} </select> <!-- 根据用户名称模糊查询用户信息,可能返回多条 resultType:指定就是单条记录所映射的java对象 类型 ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。 使用${}拼接sql,引起 sql注入 ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value --> <select id="findUserByName" parameterType="java.lang.String" resultType="com.neuedu.pojo.User"> SELECT * FROM user WHERE username LIKE '%${value}%' </select> <!-- 添加用户 parameterType:指定输入 参数类型是pojo(包括 用户信息) #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值 --> <insert id="insertUser" parameterType="com.neuedu.pojo.User"> <!-- 将插入数据的主键返回,返回到user对象中 SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键 keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性 order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序 resultType:指定SELECT LAST_INSERT_ID()的结果类型 --> insert into user(id,username,birthday,sex,address) values (seq_user.nextval,#{username},#{birthday},#{sex},#{address}) <!-- 插入数据后,返回自动增长列的ID值,将sql语句的返回值赋给parameterType绑定对象的ID属性 MySQL中使用: select LAST_INSERT_ID() --> <selectKey keyProperty="id" order="AFTER" resultType="int"> SELECT LAST_INSERT_ID() <!--select seq_user.currval from dual--> </selectKey> <!-- 使用mysql的uuid()生成主键 执行过程: 首先通过uuid()得到主键,将主键设置到user对象的id属性中 其次在insert执行时,从user对象中取出id属性值 --> <!-- <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT uuid() </selectKey> insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) --> </insert> <!-- 删除 用户 根据id删除用户,需要输入 id值 --> <delete id="deleteUser" parameterType="java.lang.Integer"> delete from user where id=#{id} </delete> <!-- 根据id更新用户 分析: 需要传入用户的id 需要传入用户的更新信息 parameterType指定user对象,包括 id和更新信息,注意:id必须存在 #{id}:从输入 user对象中获取id属性值 --> <update id="updateUser" parameterType="com.neuedu.pojo.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper> ``` # Tset ``` public class UserMapperTest { private SqlSessionFactory sqlSessionFactory; // 此方法是在执行testFindUserById之前执行 @Before public void setUp() throws Exception { // 创建sqlSessionFactory // mybatis配置文件 String resource = "config/SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); } @Test public void testFindUserById() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //创建UserMapper对象,mybatis自动生成mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //调用userMapper的方法 User user = userMapper.findUserById(1); System.out.println(user); } @Test public void testFindUserByName() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //创建UserMapper对象,mybatis自动生成mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //调用userMapper的方法 List<User> list = userMapper.findUserByName("袁超"); sqlSession.close(); System.out.println(list); } } ``` # 报错信息 ``` DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter. DEBUG [main] - Class not found: org.jboss.vfs.VFS DEBUG [main] - JBoss 6 VFS API is not available in this environment. DEBUG [main] - Class not found: org.jboss.vfs.VirtualFile DEBUG [main] - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment. DEBUG [main] - Using VFS adapter org.apache.ibatis.io.DefaultVFS DEBUG [main] - Find JAR URL: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/pojo DEBUG [main] - Not a JAR: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/pojo DEBUG [main] - Reader entry: User.class DEBUG [main] - Listing file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/pojo DEBUG [main] - Find JAR URL: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/pojo/User.class DEBUG [main] - Not a JAR: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/pojo/User.class DEBUG [main] - Reader entry: ���� 1 N DEBUG [main] - Checking to see if class com.neuedu.pojo.User matches criteria [is assignable to Object] DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - Find JAR URL: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/test-classes/com/neuedu/mapper DEBUG [main] - Not a JAR: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/test-classes/com/neuedu/mapper DEBUG [main] - Reader entry: UserMapperTest.class DEBUG [main] - Listing file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/test-classes/com/neuedu/mapper DEBUG [main] - Find JAR URL: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/test-classes/com/neuedu/mapper/UserMapperTest.class DEBUG [main] - Not a JAR: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/test-classes/com/neuedu/mapper/UserMapperTest.class DEBUG [main] - Reader entry: ���� 1 a DEBUG [main] - Find JAR URL: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/mapper DEBUG [main] - Not a JAR: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/mapper DEBUG [main] - Reader entry: UserMapper.class DEBUG [main] - Reader entry: UserMapper.xml DEBUG [main] - Listing file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/mapper DEBUG [main] - Find JAR URL: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/mapper/UserMapper.class DEBUG [main] - Not a JAR: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/mapper/UserMapper.class DEBUG [main] - Reader entry: ���� 1    findUserById (I)Lcom/neuedu/pojo/User; DEBUG [main] - Find JAR URL: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/mapper/UserMapper.xml DEBUG [main] - Not a JAR: file:/C:/Users/95638/Desktop/mybatis/ch02-mybatis01/ch02-mybatis01/target/classes/com/neuedu/mapper/UserMapper.xml DEBUG [main] - Reader entry: <?xml version="1.0" encoding="UTF-8" ?> DEBUG [main] - Checking to see if class com.neuedu.mapper.UserMapperTest matches criteria [is assignable to Object] DEBUG [main] - Checking to see if class com.neuedu.mapper.UserMapper matches criteria [is assignable to Object] DEBUG [main] - Opening JDBC Connection DEBUG [main] - Created connection 209833425. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@c81cdd1] DEBUG [main] - ==> Preparing: SELECT * FROM T_USER WHERE username LIKE '%袁超%' DEBUG [main] - ==> Parameters: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mybatis.t_user' doesn't exist ### The error may exist in com/neuedu/mapper/UserMapper.xml ### The error may involve com.neuedu.mapper.UserMapper.findUserByName-Inline ### The error occurred while setting parameters ### SQL: SELECT * FROM T_USER WHERE username LIKE '%袁超%' ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mybatis.t_user' doesn't exist at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141) at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59) at com.sun.proxy.$Proxy3.findUserByName(Unknown Source) at com.neuedu.mapper.UserMapperTest.testFindUserByName(UserMapperTest.java:68) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.junit.runner.JUnitCore.run(JUnitCore.java:160) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mybatis.t_user' doesn't exist at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) at com.mysql.jdbc.Util.getInstance(Util.java:383) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:980) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3847) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3783) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2447) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2594) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2545) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1901) at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1193) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59) at com.sun.proxy.$Proxy5.execute(Unknown Source) at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63) at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148) ... 29 more ``` # SqlMapConfig.xml ``` <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 加载属性文件 --> <properties resource="db.properties"> <!--properties中还可以配置一些属性名和属性值 --> <!-- <property name="jdbc.driver" value=""/> --> </properties> <!-- 全局配置参数,需要时再设置 --> <!-- <settings> </settings> --> <!-- 别名定义 --> <typeAliases> <!-- 针对单个别名定义 type:类型的路径 alias:别名 --> <!-- <typeAlias type="com.neuedu.mybatis.po.User" alias="user"/> --> <!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以) --> <package name="com.neuedu.pojo"/> </typeAliases> <!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理,事务控制由mybatis--> <transactionManager type="JDBC" /> <!-- 数据库连接池,由mybatis管理--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!-- 加载 映射文件 --> <mappers> <mapper resource="sqlmap/User.xml"/> <!--通过resource方法一次加载一个映射文件 --> <!-- <mapper resource="sqlmap/User.xml"/> --> <!-- 通过mapper接口加载单个 映射文件 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中 上边规范的前提是:使用的是mapper代理方法 --> <!-- <mapper class="com.neuedu.mapper.UserMapper"/> --> <!-- 批量加载mapper 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中 上边规范的前提是:使用的是mapper代理方法 --> <package name="com.neuedu.mapper"/> </mappers> </configuration> ``` # User ``` public class User { //属性名和数据库表的字段对应 private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]"; } } ``` 也不知道为什么,明明已经在UserMapper.xml里面把表名改了,但是报错信息里查找的还是T-user表 求大神指导!感恩! # 问题已解决 在maven文件里加上下面的代码 ``` <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*Mapper.xml</include> </includes> </resource> </resources> ```
执行delete没有报错,就是删不掉数据,sql语句也有,求大神
package edu.jmi.xyh.view; import java.awt.BorderLayout; public class DeleteView extends JFrame { private JPanel contentPane; private JTextField txID; private JTextField txName; private JPasswordField txPw; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { DeleteView frame = new DeleteView(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public DeleteView() { setTitle("\u5220\u9664\u5B66\u751F\u4FE1\u606F"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JLabel label = new JLabel("\u5220 \u9664 \u5B66 \u751F \u4FE1 \u606F"); label.setFont(new Font("宋体", Font.PLAIN, 16)); label.setBounds(140, 22, 147, 15); contentPane.add(label); JLabel lblId = new JLabel("\u7528 \u6237 ID\uFF1A"); lblId.setBounds(95, 55, 69, 15); contentPane.add(lblId); txID = new JTextField(); txID.setBounds(174, 52, 113, 21); contentPane.add(txID); txID.setColumns(10); JLabel label_2 = new JLabel("\u7528 \u6237 \u540D\uFF1A"); label_2.setBounds(95, 98, 66, 15); contentPane.add(label_2); JLabel label_3 = new JLabel("\u5BC6 \u7801\uFF1A"); label_3.setBounds(95, 143, 54, 15); contentPane.add(label_3); txName = new JTextField(); txName.setBounds(174, 95, 113, 21); contentPane.add(txName); txName.setColumns(10); JButton button = new JButton("\u5220\u9664"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String id=txID.getText(); String pw=txPw.getText(); String name=txName.getText(); Student student=new Student(); student.setStuId(id); student.setStuName(name); student.setStuPwd(pw); StudentDao studentDao=new StudentDao(); int result=studentDao.delete(id); if(result==0){ JOptionPane.showMessageDialog(null, "删除成功!"); } else{ JOptionPane.showMessageDialog(null, "删除失败!"); } System.out.println("id="+id+"pw="+pw); } }); button.setBounds(75, 189, 93, 23); contentPane.add(button); JButton button_1 = new JButton("\u53D6\u6D88"); button_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //生成一个对象 MainView mainView = new MainView(); //隐藏窗口 DeleteView.this.setVisible(false); mainView.setVisible(true); } }); button_1.setBounds(232, 189, 93, 23); contentPane.add(button_1); txPw = new JPasswordField(); txPw.setBounds(174, 140, 113, 21); contentPane.add(txPw); } public void setMainView(MainView mainView) { // TODO Auto-generated method stub } public void setID(Object id) { // TODO Auto-generated method stub } } 2.package edu.jmi.xyh.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import edu.jmi.xyh.bean.Student; public class StudentDao { //测试用 //ORM object relation mapping hibernate,ibaits //每一条记录映射每一个对象,记录集合映射成对象集合List //Dao data access object //save将一个java对象存储到数据库表中,就是将对象转换为记录 public int save(Student student){ //建立一个DBOperation,通过这个对象完成数据库的连接操作 DBOperation dboperation= new DBOperation(); //获取数据库连接 Connection connection=null; try{ connection=dboperation.getConnection(); Statement st=connection.createStatement(); //字符串拼接 String sql="insert into student(stuId,stuName,stuPwd)values('" +student.getStuId()+"','"+student.getStuName()+"','"+student.getStuPwd()+"')"; //用来在程序中指挥sql命令执行 st.execute(sql); System.out.println(sql); return 0; }catch(Exception ex){ ex.printStackTrace(); //返回上层判断 return -1; }finally{ dboperation.closeConnect(connection); } } public int update(Student student){ //建立一个DBOperation,通过这个对象完成数据库的连接操作 DBOperation dboperation= new DBOperation(); //获取数据库 Connection connection=null; try{ connection=dboperation.getConnection(); Statement st=connection.createStatement(); //字符串拼接 String sql="update student set stuName='"+student.getStuName()+ "', stuPwd='"+student.getStuPwd()+"' where stuId='"+ student.getStuId()+"'"; st.execute(sql); System.out.println(sql); return 0; }catch(Exception ex){ ex.printStackTrace(); //返回上层判断 return -1; }finally{ dboperation.closeConnect(connection); } } public int delete(Student student){ //建立一个DBOperation,通过这个对象完成数据库的连接操作 DBOperation dboperation= new DBOperation(); //获取数据库连接 Connection connection=null; try{ connection=dboperation.getConnection(); String sql="delete from student where stuId='?'"; //准备执行sql语句 PreparedStatement pst=connection.prepareStatement(sql); //替换上面的问号 pst.setString(1, student.getStuId()); pst.execute(); /* Statement st=connction.createStatement(); //字符串拼接 String sql="delete from student where Stuid='"+student.getStuid()+"'"; st.execute(sql);*/ //把sql语句打出来 System.out.println(sql); //返回值 return 0; //异常处理 }catch(Exception ex){ ex.printStackTrace(); //返回上层判断 return -1; }finally{ //关闭与数据库连接 dboperation.closeConnect(connection); } } //查询结果放到集合中,集合中的每一个对象都是student <>是泛型 public List<Student> query(){ //建立一个DBOperation,通过这个对象完成数据库的连接操作 DBOperation dboperation= new DBOperation(); //获取数据库 Connection connection=null; List<Student> list = new ArrayList<Student>(); try{ connection=dboperation.getConnection(); Statement st=connection.createStatement(); //查询语句 String sql="select* from student"; //查询语句执行exuecuteQuery,不是execte,执行后放回结果集resultset,把resultsest变成list,通过遍历实现 ResultSet rs=st.executeQuery(sql); //rs.next向下移动一行,刚开始在第0行。如果该行存在,返回true,否则会返回false, //每一行对应一个student对象,全部记录对应list //getInt,getString,getDate,getBoolean,获取该字段的值 //getInt(1),getInt("stuId") //可能有多条用while,最多用一条用if if(rs.next()){ Student student=new Student(); String stuId=rs.getString("stuId"); String stuName=rs.getString("stuName"); String stuPwd=rs.getString("stuPwd"); student.setStuId(stuId); student.setStuName(stuName); student.setStuPwd(stuPwd); //最后将student对象存放到集合中 list.add(student); } System.out.println(sql); return list; }catch(Exception ex){ ex.printStackTrace(); //返回上层判断 return null; }finally{ dboperation.closeConnect(connection); } } //重载 public static Student query(String id) { // TODO Auto-generated method stub //建立一个DBOperation,通过这个对象完成数据库的连接操作 DBOperation dbOperation=new DBOperation(); //获取数据库连接 Connection connction=null; try{ connction=dbOperation.getConnection(); Statement st=connction.createStatement(); //查询语句 String sql="select * from student where stuid='"+id+"'"; //查询语句执行exuecuteQuery,不是execute,执行后放回结果集resultset,把resultset变成list,通过遍历实现 ResultSet rs=st.executeQuery(sql); //可能有多条用while,最多一条就用if可以了。码农 Student student=null; if(rs.next()){ //如果有记录,新建一个student对象,将查到的结果封装到student对象中。 student=new Student(); String stuId=rs.getString("stuId"); String stuName=rs.getString("stuName"); String stuPwd=rs.getString("stuPwd"); student.setStuId(stuId); student.setStuName(stuName); student.setStuPwd(stuPwd); } return student; }catch(Exception ex){ ex.printStackTrace(); //返回上层判断 return null; }finally{ dbOperation.closeConnect(connction); } } public static void main(String args[]){ StudentDao studentDao=new StudentDao(); List<Student> list=studentDao.query(); //for each语句 iterator for(Student student:list){ System.out.println(student.getStuName()); } /*Student student=new Student(); student.setStuId("152118130235"); student.setStuName("徐耀辉"); student.setStuPwd("979194874");*/ } public int delete(String id) { // TODO Auto-generated method stub return 0; } }
springboot 配置多库之后,mybatis在控制台不打印sql语句了
springboot项目 单库下,mybatis只需要添加如下配置,就可以打印sql语句 ```xml <!-- 打印查询语句 --> <setting name="logImpl" value="STDOUT_LOGGING" /> ``` 但是多库环境下,mybatis不论怎么设置,都无法打印sql语句..... ---- ---- 项目中的相关配置: mybatis配置: ```xml <!-- 设置运行参数 --> <settings> <!-- 全局映射器启用缓存 --> <setting name="cacheEnabled" value="true" /> <!-- 查询时,关闭关联对象及时加载以提高性能 --> <setting name="lazyLoadingEnabled" value="false" /> <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指定),不会加载关联表的所有字段,以提高性能 --> <setting name="aggressiveLazyLoading" value="false" /> <!-- 对于位置的SQL查询,允许返回不同的结果集以达到通用的效果 --> <setting name="multipleResultSetsEnabled" value="true" /> <!-- 允许使用列标签代替列明 --> <setting name="useColumnLabel" value="true" /> <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值), 数据表的pk生成策略将被覆盖 --> <setting name="useGeneratedKeys" value="true" /> <!-- 给予被嵌套的resultMap以字段-属性的映射支持 --> <setting name="autoMappingBehavior" value="PARTIAL" /> <!-- 对于批量更新操作缓存SQL以提高性能 --> <setting name="defaultExecutorType" value="REUSE" /> <!-- 数据库超过25000秒仍未响应则超时 --> <!--<setting name="defaultStatementTimeout" value="25000" />--> <!-- 打印查询语句 --> <setting name="logImpl" value="STDOUT_LOGGING" /> <!-- 开启驼峰--> <setting name="mapUnderscoreToCamelCase" value="true" /> </settings> ``` logback配置: ```xml <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true"> <!-- 属性1:每个logger都关联到logger上下文,默认上下文名称为“default”。 但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过%contextName来打印日志上下文名称。 --> <contextName>logback</contextName> <!--属性2:定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <!-- <springProfile name="dev"> <property name="LOG_PATH" value="D://care-management-statisticserver-logs"/> </springProfile> <springProfile name="test"> <property name="LOG_PATH" value="/data/tomcat_jar/taixin_care/care-management-statisticserver/logs"/> </springProfile> <springProfile name="prod"> <property name="LOG_PATH" value="/data1/logs/care-management-statisticserver"/> </springProfile> --> <property name="LOG_PATH" value="${LOG_FILE}"/> <!--appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。--> <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,,,, --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>info</level> </filter> <encoder> <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern> </encoder> </appender> <!--<include resource="org/springframework/boot/logging/logback/base.xml"/>--> <!-- 说明: 1、日志级别及文件 日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中 例如:error级别记录到log_error_xxx.log或log_error.log(该文件为当前记录的日志文件),而log_error_xxx.log为归档日志, 日志文件按日期记录,同一天内,若日志文件大小等于或大于2M,则按0、1、2...顺序分别命名 例如log-level-2013-12-21.0.log 其它级别的日志也是如此。 2、文件路径 若开发、测试用,在Eclipse中运行项目,则到Eclipse的安装路径查找logs文件夹,以相对路径../logs。 若部署到Tomcat下,则在Tomcat下的logs文件中 3、Appender FILEERROR对应error级别,文件名以log-error-xxx.log形式命名 FILEWARN对应warn级别,文件名以log-warn-xxx.log形式命名 FILEINFO对应info级别,文件名以log-info-xxx.log形式命名 FILEDEBUG对应debug级别,文件名以log-debug-xxx.log形式命名 CONSOLE将日志信息输出到控制上,为方便开发测试使用 --> <!-- 日志记录器,日期滚动记录 --> <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${LOG_PATH}/error_statisticserver.log</file> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <fileNamePattern>${LOG_PATH}/error-statisticserver-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 表示只保留最近30天的日志,以防止日志填满整个磁盘空间。--> <maxHistory>30</maxHistory> <!--用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志。--> <totalSizeCap>1GB</totalSizeCap> <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始, 命名日志文件,例如log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 追加方式记录日志 --> <append>true</append> <!-- 日志文件的格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志文件只记录error级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 日志记录器,日期滚动记录 --> <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${LOG_PATH}/info_statisticserver.log</file> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <fileNamePattern>${LOG_PATH}/info-statisticserver-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 表示只保留最近30天的日志,以防止日志填满整个磁盘空间。--> <maxHistory>30</maxHistory> <!--用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志。--> <totalSizeCap>1GB</totalSizeCap> <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,命名日志文件,例如log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 追加方式记录日志 --> <append>true</append> <!-- 日志文件的格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志文件只记录info级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。 --> <logger name="org.springframework" level="INFO"/> <logger name="org.apache" level="ERROR"/> <logger name="org.hibernate.validator" level="ERROR"/> <!--<logger name="org.thymeleaf" level="ERROR"/>--> <logger name="org.springframework.context.annotation" level="ERROR"/> <!-- springProfile多环境日志输出,据不同环境(prod:生产环境,test:测试环境,dev:开发环境)来定义不同的日志输出--> <springProfile name="dev" /> <root level="INFO"> <appender-ref ref="FILEERROR"/> <appender-ref ref="FILEINFO"/> <appender-ref ref="STDOUT"/> </root> <!-- 可以启动服务的时候指定 profile (如不指定使用默认),如指定prod 的方式为: java -jar xxx.jar –spring.profiles.active=prod--> </configuration> ``` application.properties部分配置: ```properties #配置文件 logging.level.tk.mybatis=TRACE spring.freemarker.cache=false spring.freemarker.request-context-attribute=request mybatis.type-aliases-package=com.mtpf.domain mybatis.mapper-locations=classpath:mapper/*.xml mapper.mappers=com.mtpf.util.MyMapper mapper.not-empty=false mapper.identity=MYSQL pagehelper.helperDialect=mysql #true 是超出最大页码返回数据 false超出最大页码不返回数据 pagehelper.reasonable=${PAGEHELPER_REASONABLE} pagehelper.supportMethodsArguments=true pagehelper.params=count=countSql ```
hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改?
hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.list().iterator(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; //q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; // q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.list().iterator(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; //q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; // q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [color=red]按 jones 的意思是不是 read-only 形式下,不能对二级缓存中的对象做任何修改,但可以修改该对象在数据库中的状态 是吗?那么我还有个,在前面的基础上,即在第一次查询 和第二次查询的之间放入一段修改缓存中某对象的时咋出现题呢,代码如下[/color] [code="java"]s = HibernateUtils.getSession() ; //s.setCacheMode(CacheMode.GET) ; User u = new User() ; u.setId("8aa3b33c1d8eb43b011d8eb441300001") ; u.setName("yushan5118") ; s.saveOrUpdate(u) ; s.beginTransaction().commit() ; s.close() ;[/code] [color=red]出现一个异常: ERROR ReadOnlyCache:42 - Application attempted to edit read only item: com.c35.hibernate.po.User#8aa3b33c1d8eb43b011d8eb441300001 且数据库中的该对象属性未变化? 按理不是说不能修改缓存里面的,但可以操纵数据库吗?谢谢[/color] [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.list().iterator(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; //q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; // q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.list().iterator(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; //q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; // q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [color=red]按 jones 的意思是不是 read-only 形式下,不能对二级缓存中的对象做任何修改,但可以修改该对象在数据库中的状态 是吗?那么我还有个,在前面的基础上,即在第一次查询 和第二次查询的之间放入一段修改缓存中某对象的时咋出现题呢,代码如下[/color] [code="java"]s = HibernateUtils.getSession() ; //s.setCacheMode(CacheMode.GET) ; User u = new User() ; u.setId("8aa3b33c1d8eb43b011d8eb441300001") ; u.setName("yushan5118") ; s.saveOrUpdate(u) ; s.beginTransaction().commit() ; s.close() ;[/code] [color=red]出现一个异常: ERROR ReadOnlyCache:42 - Application attempted to edit read only item: com.c35.hibernate.po.User#8aa3b33c1d8eb43b011d8eb441300001 且数据库中的该对象属性未变化? 按理不是说不能修改缓存里面的,但可以操纵数据库吗?谢谢[/color] read-only只是Hibernate用来决定如何处理缓存数据的,如果你的缓存对象是read-only的,Hibernate可不负责你的缓存与数据库之间的同步处理,因为Hibernate认为你这个对象根本就永远都不会改变。 [color=red]那么 Hibernate 只对缓存里面的对象read-only,当我修改某个对象的时候,hibernate难道还会判断我修改的对象是否是缓存中已经有的,如果有就不接受修改 是吗?要是这样,想修改该对象在数据库中的内容 该咋办,又不影响read-only?能否帮忙解释一下为何会出现ERROR ReadOnlyCache:42错误?[/color] 在此感谢jones [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.list().iterator(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; //q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; // q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.list().iterator(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; //q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; // q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [color=red]按 jones 的意思是不是 read-only 形式下,不能对二级缓存中的对象做任何修改,但可以修改该对象在数据库中的状态 是吗?那么我还有个,在前面的基础上,即在第一次查询 和第二次查询的之间放入一段修改缓存中某对象的时咋出现题呢,代码如下[/color] [code="java"]s = HibernateUtils.getSession() ; //s.setCacheMode(CacheMode.GET) ; User u = new User() ; u.setId("8aa3b33c1d8eb43b011d8eb441300001") ; u.setName("yushan5118") ; s.saveOrUpdate(u) ; s.beginTransaction().commit() ; s.close() ;[/code] [color=red]出现一个异常: ERROR ReadOnlyCache:42 - Application attempted to edit read only item: com.c35.hibernate.po.User#8aa3b33c1d8eb43b011d8eb441300001 且数据库中的该对象属性未变化? 按理不是说不能修改缓存里面的,但可以操纵数据库吗?谢谢[/color] [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.list().iterator(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; //q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; // q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.list().iterator(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; //q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; // q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [color=red]按 jones 的意思是不是 read-only 形式下,不能对二级缓存中的对象做任何修改,但可以修改该对象在数据库中的状态 是吗?那么我还有个,在前面的基础上,即在第一次查询 和第二次查询的之间放入一段修改缓存中某对象的时咋出现题呢,代码如下[/color] [code="java"]s = HibernateUtils.getSession() ; //s.setCacheMode(CacheMode.GET) ; User u = new User() ; u.setId("8aa3b33c1d8eb43b011d8eb441300001") ; u.setName("yushan5118") ; s.saveOrUpdate(u) ; s.beginTransaction().commit() ; s.close() ;[/code] [color=red]出现一个异常: ERROR ReadOnlyCache:42 - Application attempted to edit read only item: com.c35.hibernate.po.User#8aa3b33c1d8eb43b011d8eb441300001 且数据库中的该对象属性未变化? 按理不是说不能修改缓存里面的,但可以操纵数据库吗?谢谢[/color] read-only只是Hibernate用来决定如何处理缓存数据的,如果你的缓存对象是read-only的,Hibernate可不负责你的缓存与数据库之间的同步处理,因为Hibernate认为你这个对象根本就永远都不会改变。 [color=red]那么 Hibernate 只对缓存里面的对象read-only,当我修改某个对象的时候,hibernate难道还会判断我修改的对象是否是缓存中已经有的,如果有就不接受修改 是吗?要是这样,想修改该对象在数据库中的内容 该咋办,又不影响read-only?能否帮忙解释一下为何会出现ERROR ReadOnlyCache:42错误?[/color] 在此感谢jones [color=red]还有就是 当我开启 s.setCacheMode(CacheMode.GET) ,应该是不该把这个修改的对象放到二级缓存中,由此我认为应该不会与二级缓存的read-only产生冲突啊,请jones 帮忙解释一下,小弟不胜感激啊[/color] [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.list().iterator(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; //q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; // q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.list().iterator(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("from User") ; //q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; s.beginTransaction() ; User user = new User() ; user.setUserName("yu") ; user.setPwd("123") ; Serializable id = s.save(user) ; s.beginTransaction().commit() ; s.close() ; System.out.println("----------------------------") ; s = HibernateUtils.getSession() ; q = s.createQuery("from User") ; // q.setCacheable(true) ; for(Iterator iter=q.iterate(); iter.hasNext();){ User u = (User)iter.next() ; System.out.println("user.getName ="+u.getUserName()) ; } s.close() ; } [/code] 输出结果: Hibernate: select user0_.id as id0_, user0_.userName as userName0_, user0_.pwd as pwd0_, user0_.createTime as createTime0_ from User user0_ user.getName =yushan ---------------------------- Hibernate: insert into User (userName, pwd, createTime, id) values (?, ?, ?, ?) ---------------------------- Hibernate: select user0_.id as col_0_0_ from User user0_ user.getName =yushan user.getName =yu 以上代码前提是已经开启查询缓存和二级缓存,User设置为read-only,第一次取出一条,然后增加条,为何第二次取的时候会有两条呢,而且还是从缓存中取得的?按理来说经过第一次取后二级缓存中只有一条记录,当save的时候也会往二级缓存中增加一条记录,但是第二次取的时候,因为二级缓存生存周期还未失效,且还是read-only,那么二级中应该只有一条啊?为何呢,请详解谢谢! [color=red]按 jones 的意思是不是 read-only 形式下,不能对二级缓存中的对象做任何修改,但可以修改该对象在数据库中的状态 是吗?那么我还有个,在前面的基础上,即在第一次查询 和第二次查询的之间放入一段修改缓存中某对象的时咋出现题呢,代码如下[/color] [code="java"]s = HibernateUtils.getSession() ; //s.setCacheMode(CacheMode.GET) ; User u = new User() ; u.setId("8aa3b33c1d8eb43b011d8eb441300001") ; u.setName("yushan5118") ; s.saveOrUpdate(u) ; s.beginTransaction().commit() ; s.close() ;[/code] [color=red]出现一个异常: ERROR ReadOnlyCache:42 - Application attempted to edit read only item: com.c35.hibernate.po.User#8aa3b33c1d8eb43b011d8eb441300001 且数据库中的该对象属性未变化? 按理不是说不能修改缓存里面的,但可以操纵数据库吗?谢谢[/color] [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 [b]问题补充:[/b] hibernate 二级缓存 中将映射文件设置为 read-only,为何还能进行增删改? 例如某User对象; <hibernate-mapping> <class name="com.c35.hibernate.po.User"> <cache usage="read-only"/> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="pwd"/> </class> </hibernate-mapping> 为何还可以进行User进行增删改呢?不是只读吗?谢谢 测试代码如下: [code="java"] public void testCache1(){ Session s = HibernateUtils.getSession() ; Query q = s.createQuery("fro
使用Springmvc开发微信公众号数据传输问题
返回给微信服务器的XML格式的字符串,发现在公网Linux服务器中,tomcat的catalina.out文件打印的该字符串少了<ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> 这几行标签,手机微信提示该订阅号无法提供服务,请稍后再试。 该问题找了好久都找不出原因。是springmvc的数据传输有问题吗? 我贴一下springmvc.xml配置,求帮忙解答!!~ <!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 --> <!-- 加载controller的时候,不加载service,因为此时事物并未生效,若此时加载了service,那么事物无法对service进行拦截 --> <context:component-scan base-package="org.jeecgframework.web.*,weixin.*"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan> <!-- ApplicationContext --> <bean class="org.jeecgframework.core.util.ApplicationContextUtil"></bean> <!-- 避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射, 配置一个基于注解的定制的WebBindingInitializer,解决日期转换问题,方法级别的处理器映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="cacheSeconds" value="0" /> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter" /><!-- json转换器 --> </list> </property> <property name="webBindingInitializer"> <bean class="org.jeecgframework.core.interceptors.MyWebBinding" /> </property> </bean> <!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- --> <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="3"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="contentType" value="text/html" /> <property name="prefix" value="/webpage/" /> <property name="suffix" value=".jsp" /> </bean> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8"> <property name="maxUploadSize"> <value>104857600</value> </property> <property name="maxInMemorySize"> <value>4096</value> </property> </bean> <!-- Bean解析器,级别高于默认解析器,寻找bean对象进行二次处理 --> <bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0"> </bean> <!-- Excel 处理 根据用户输入进行对象处理 --> <bean id="jeecgExcelView" class="org.jeecgframework.poi.excel.view.JeecgSingleExcelView" /> <!-- 方言 --> <bean id="dialect" class="org.jeecgframework.core.common.hibernate.dialect.DialectFactoryBean"> <property name="dbType" value="${jdbc.dbType}" /> </bean> <!-- 异常处理类 --> <bean id="exceptionHandler" class="org.jeecgframework.core.common.exception.MyExceptionHandler" /> <!-- 系统错误转发配置[并记录错误日志] --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="defaultErrorView" value="500"></property> <!-- 默认为500,系统错误(error.jsp) --> <property name="defaultStatusCode" value="404"></property> <property name="statusCodes"><!-- 配置多个statusCode --> <props> <prop key="error">500</prop> <!-- error.jsp --> <prop key="error1">404</prop> <!-- error1.jsp --> </props> </property> <property name="exceptionMappings"> <props> <!-- 这里你可以根据需要定义N多个错误异常转发 --> <prop key="java.sql.SQLException">dbError</prop> <!-- 数据库错误(dbError.jsp) --> <prop key="org.springframework.web.bind.ServletRequestBindingException">bizError</prop> <!-- 参数绑定错误(如:必须参数没传递)(bizError.jsp) --> <prop key="java.lang.IllegalArgumentException">bizError</prop> <!-- 参数错误(bizError.jsp) --> <prop key="org.springframework.validation.BindException">bizError</prop> <!-- 参数类型有误(bizError.jsp) --> <prop key="java.lang.Exception">unknowError</prop> <!-- 其他错误为'未定义错误'(unknowError.jsp) --> </props> </property> </bean> <!-- 拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="org.jeecgframework.core.interceptors.EncodingInterceptor" /> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="org.jeecgframework.core.interceptors.AuthInterceptor"> <property name="excludeUrls"> <list> <value>loginController.do?goPwdInit</value> <value>loginController.do?pwdInit</value> <value>loginController.do?login</value> <value>loginController.do?checkuser</value> <value>repairController.do?repair</value> <value>repairController.do?deleteAndRepair</value> <value>cmsMenuController.do?index</value> <value>cmsArticleController.do?cmsArticleListShow</value> <value>cmsArticleController.do?datagridwx</value> <value>cmsArticleController.do?cmsArticleShow</value> <value>cmsController.do?goPage</value> <value>cmsController.do?getMenuList</value> <value>wechatController.do?wechat</value> <value>zpController.do?iscontinue</value> <value>zpController.do?saveZpPrize</value> <value>zpController.do?getZpPize</value> <value>zpController.do?saverecord</value> <value>zpController.do?ggl_new</value> <value>zpController.do?ggl</value> <value>zpController.do?zp</value> <value>zpController.do?goZhuanpan</value> <value>weixinCmsStyleController.do?upload</value> <value>newsItemController.do?newscontent</value> <!-- 保存用户 --> <value>userController.do?saveUser</value> </list> </property> </bean> </mvc:interceptor> </mvc:interceptors>
如何用Hibernate查询备份表(表名与实体定义的表名不相同了)
<p>遇到的问题:</p> <p> </p> <p>用Hibernate查询备份表中的记录,比如实体对象Student,映射的表名是<span style="color: #ff0000;">student</span>。</p> <p>在oracle数据库中为这个student表定义了触发器,每个月生成一张备份表,</p> <p>表名如:<span style="color: #ff0000;">student_201201,student_201202,student_201203,student2012_04.....</span>;</p> <p> </p> <p>现在要从这些<span style="color: #ff0000;">备份表</span>里面查询记录,可是由于Student实体已经映射了表名为student,所以现在用<span style="color: #ff0000;">StudentDao</span>查询备份表中的记录就会报错:</p> <p> </p> <p><span style="color: #ff0000;">org.hibernate.hql.ast.QuerySyntaxException:student_2012_05 is not mapped...;</span></p> <p> </p> <p>我在<span style="color: #ff0000;">StudentDao</span>中的查询方法是这么写的:</p> <p> </p> <p> </p> <pre name="code" class="java">public List&lt;Student&gt; getBackupStudent(String year,String month){ List&lt;Student&gt; students = new ArrayList&lt;Student&gt;(); String sql = " SELECT student FROM student_"+year+month+" student ";" Query query = this.createQuery(sql); students = query.list(); return students; }</pre> <p> </p> <p>Hibernate 后台生成的查询语句是这样的:</p> <p> </p> <p><span style="color: #ff0000;">SELECT student FROM student_201205 student </span></p> <p> </p> <p>问题即使那个错误,这个<span style="color: #ff0000;">student_201205</span>没有对应的实体,应为他是用数据库的触发器生成的表,Hiberanate 就说它没有<span style="color: #ff0000;">Mapped...</span></p> <p>像我这样的问题,我想大家也应该可能遇到过吧,请问大家是如何解决的啊!!!!</p>
[极品难]关于hibernate如何把原生sql查出的结果转化为对象
例如我们有一个照片的PO <br /> <br />Java code <br />//照片po <br />class Photo <br />{ <br />&nbsp;&nbsp; int id; <br />&nbsp;&nbsp; string title; <br />&nbsp;&nbsp; double avgScore;//平均分,这个字段在数据库中是没有映射的,也就是 非持久化属性 <br />} <br /> <br />//投票po ,每张照片对应多个vote记录 <br />class Vote <br />{ <br />&nbsp;&nbsp; int id; <br />&nbsp;&nbsp; int photoId; <br />&nbsp;&nbsp; int score; <br />} <br /> <br /> <br /> <br />用sql = "select {p.*,avg(v.score) as p.avgScore} from photo p left join vote v on p.id = v.photoId "; <br />单纯的sql结果很满意,包含照片的信息和每张照片的平均分数。 <br /> <br />代码如下: <br />Query query = session.createSQLQuery(sql.toString()).addEntity(Photo.class); <br /> <br />运行后,没有错误,但是在SQL语句中的avg(v.score) as p.avgScore} 这一部分,没有被像我们预期的那样set进photo的avgScore属性中。 <br /> <br /> <br />问题: <br />我们如果遇到要用原生sql进行查询,并要将结果set进一个po中,其中set进po中的属性,不完全是被可持久化的,例如本例 <br />中的avgScore属性。 <br /> <br />期待大家来解答这个疑惑~谢谢! thanks a lot ! <br /> <br />PS: 请别和我说完全可以用hql等方式,这只是个简单的示例,目前是想研究原生sql对象映射问题。 <br /><br /><strong>问题补充:</strong><br />首先谢谢yangtao309您的回答!~ <br /> <br />我仔细看了那篇文章,addScalar这个的意思似乎只是把查出来的非属性结果进行类型绑定,我现在的困惑是如果把这个值自动绑定进po中~~ <br /> <br />就像上面的例子,select出一个po,然后这个po中要有那个avgScore的属性值,目前我试过即使用addScalar明确avgScore的类型,还是不会自动set进po中。。 <br /> <br />是不是我哪弄错了,还是什么原因,希望大家再帮我看看<br /><strong>问题补充:</strong><br />谢谢您 walsh 的回答,我觉得您说的很有道理 ,我现在用的MYSQL5,按您的提示,运行后,控制台打出下样异常,繁请帮忙看下,谢谢! <br /> <br /> <br /> <br />打印出的SQL: <br />sql:&nbsp; select {p.id,p.user_id,p.url,p.state,avg(v.score) as p.avgScore} from photos p&nbsp; where p.user_id = :userId and p.state in ( 0, 1 )&nbsp; group by p.id&nbsp; order by&nbsp; p.id desc <br /> <br /> <br /> <br /> <br /> <br />报了个这个错: <br />44187 [http-8080-1] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1064, SQLState: 42000 <br />44187 [http-8080-1] ERROR org.hibernate.util.JDBCExceptionReporter - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from photos p&nbsp; where p.user_id = 13 and p.state in ( 0, 1 )&nbsp; group by p.id&nbsp; orde' at line 1 <br />2009-9-3 12:04:39 org.apache.catalina.core.StandardWrapperValve invoke <br />严重: Servlet.service() for servlet default threw exception <br />com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from photos p&nbsp; where p.user_id = 13 and p.state in ( 0, 1 )&nbsp; group by p.id&nbsp; orde' at line 1 <br /> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936) <br /><br /><strong>问题补充:</strong><br />为什么要对所有字段字组??这原因和自动set进po应该没直接关系吧? <br /><img src="/images/smiles/icon_surprised.gif"/> <br /><strong>问题补充:</strong><br />改成group by p.id, p.user_id,p.url,p.state仍然是之前的错误。 <br /> <br />如果不加{}那么就报在数据库找不到p.avgScore这列,因为p.avgScore是一个虚似的临时变量,非持久化属性。 <br /> <br />谢谢,再帮忙想想~~~<br /><strong>问题补充:</strong><br />谢谢,WALSH再次的回答。 <br /> <br />我提问题时只是简单写的示例,省略了几个字段, <br />sql = "select p.id,avg(v.score) from photo p , vote v where p.id = v.photoId&nbsp; group by p.id";&nbsp;&nbsp; <br /> <br />这么写是可以,但不会被自动绑定进PO,我来问就是想知道在不调用SET方法的情况下能否自动把非字段属性绑定进PO。 <br /> <br />如果是单调set方法,我是知道的~~有没有自动的方式,谢谢walsh不遗余力的帮我解决这个问题。谢谢! <br /> <br />您看看有没有自动的方式绑定进PO的。。 <br /><br /><strong>问题补充:</strong><br />您好walsh,我也知道hibernate会找set方法,但有可能还会只限制在*.hbm.xml文件中声明,或者只被@Cloumn注解的属性字段。。 <br /> <br />因为我返回avg(v.score) as p.avgScore,其实在p这个po中是有setAvgScore()这个方法的,可是终始不会被调用 。。。 <br /> <br />我甚至做过这个测试,把avgScore()设成@Cloumn(insertable=false,updateable=false),还是不会自动set进po中。。 <br /> <br /> <br />对这个问题看来基本明确了。。可能就是不行,只能返回object[]来一个个的set了吧? <br /> <br />
hibernate缓存不解
大家看一下这段代码<pre name="code" class="java"> SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session s = sessionFactory.openSession(); s.beginTransaction(); for(int i=0;i&lt;10;i++) { Cat cat = new Cat(); cat.setWeight(20.1f); cat.setName("cat_"+i);//此处改变了name属性的值,即使不改变,我也要求它插入新的十条数据 s.save(cat); } s.getTransaction().commit(); </pre> <br />映射文件:Cat.hbm.xml<pre name="code" class="xml"> &lt;hibernate-mapping&gt; &lt;class name="org.hibernate.entity.Cat" table="CAT"&gt; &lt;!-- A 32 hex character is our surrogate key. It's automatically generated by Hibernate with the UUID pattern. --&gt; &lt;id name="id" type="string" unsaved-value="null" &gt; &lt;column name="CAT_ID" sql-type="char(32)" not-null="true"/&gt; &lt;generator class="uuid.hex"/&gt; &lt;/id&gt; &lt;!-- A cat has to have a name, but it shouldn' be too long. --&gt; &lt;property name="name"&gt; &lt;column name="NAME" length="16" not-null="true"/&gt; &lt;/property&gt; &lt;property name="sex"/&gt; &lt;property name="weight"/&gt;&lt;!-- --&gt; &lt;/class&gt; &lt;/hibernate-mapping&gt; </pre>第一次执行插入操作时, <strong><span style="color: red">i</span></strong> 的范围是从0到10,执行没有问题,向数据库中插入了十条正确的数据。 <br />当第二次执行插入操作时,将&nbsp; <strong><span style="color: red">i</span></strong>&nbsp; 的范围改为从10到20,执行没有问题, <br />但<span style="color: red">此次操作的结果</span>“看起来”仅仅是对前面的数据进行修改,因为仅仅改变了其<span style="color: red">name</span>属性的值,其他的没有改变,而不是重新插入,这是为什么呢?也许是由于映射文件中对CAT_ID的设置有问题吗?<br/><strong>问题补充</strong><br/><div class="quote_title">肉嘎嘎 写道</div><div class="quote_div">为什么是修改,LZ说的修改是update吗?,你的代码上怎么没看出来有什么修改的啊?顶多就是又新增了10条数据!不解? <br /> <br />另外,对于save方法来说,当第一次持久化对象的时候,对象状态是从零时状态到了持久状态,这样数据库中存在了相应的记录(前10条记录),并且在缓存中保存了这10个对象和数据的快照,当你修改了循环次数,再次执行此方法的时候,由于你的属性没有任何改变,因此缓存快照的对象数据和你新创建的对象数据是一致的,所以在提交的时候,仅会对原有的数据重新做insert操作! <br /> <br />个人的分析,如有错误,请牛人指出,谢谢!~~~~~~</div> <br />我的name属性已经发生了变化,即使没有发生变化,我执行的插入操作,它也应该给我执行插入操作!也许是某个设置上有问题,但一直没有找到解法<br/><strong>问题补充</strong><br/><div class="quote_title">amwiacel 写道</div><div class="quote_div">看看你的save是怎么实现的</div> <br />兄弟,没用过hibernate吧!<br/><strong>问题补充</strong><br/><div class="quote_title">肉嘎嘎 写道</div><div class="quote_div"><div class="quote_title">xiexifeng113 写道</div><div class="quote_div"><div class="quote_title">肉嘎嘎 写道</div><div class="quote_div">为什么是修改,LZ说的修改是update吗?,你的代码上怎么没看出来有什么修改的啊?顶多就是又新增了10条数据!不解? <br /> <br />另外,对于save方法来说,当第一次持久化对象的时候,对象状态是从零时状态到了持久状态,这样数据库中存在了相应的记录(前10条记录),并且在缓存中保存了这10个对象和数据的快照,当你修改了循环次数,再次执行此方法的时候,由于你的属性没有任何改变,因此缓存快照的对象数据和你新创建的对象数据是一致的,所以在提交的时候,仅会对原有的数据重新做insert操作! <br /> <br />个人的分析,如有错误,请牛人指出,谢谢!~~~~~~</div> <br />我的name属性已经发生了变化,即使没有发生变化,我执行的插入操作,它也应该给我执行插入操作!也许是某个设置上有问题,但一直没有找到解法</div> <br /> <br />为什么没有变化也应该做插入操作呢?能说一下你的理由吗?</div> <br />你好好看一下主帖嘛!难道我没说明白。我是说执行之后的结果,仅仅是修改了name的值,其他的没有变化,包括id。而我确实是需要进行插入操作。两次执行完之后,数据库的表中应该有20条数据,即对应的name值从cat_0到cat_19,而现在表中只有十条数据cat_10到cat_19。希望后来的人能看明白。
对充血模型的疑问
小弟我在坛子上看到关于贫血模型和充血模型的讨论后一直再想这对于我这种代码小工意味着啥? <br />是否可以更快更迅速更敏捷的完成代码完成开发。 <br />一直做的项目都是SSH 然后分层 action,service,dao,entity;有时候我觉得dao层没什么必要啊,既然 <br />hibernate是面向对象为何还要 dao.save(entity)&nbsp;&nbsp; dao.update(entity) 这样操作? <br />感觉如果去掉dao层 直接entity.update(),entity.delete();&nbsp; 这样是否会更形象? <br />然后小弟开始尝试,首先搭了个struts2+spring3+Hibernate3.6的ssh工程用的是全注解搭法这样开发就不用写配置文件了还是相当的爽啊 <br /> <br />首先我觉得应该有一个公共的类充当所有entity的父类 <br /><pre name="code" class="java"> import java.beans.PropertyDescriptor; import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import javax.annotation.Resource; import org.hibernate.SessionFactory; import org.springframework.beans.BeanUtils; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.stereotype.Repository; @Repository("MagicH") public class MagicH extends HibernateTemplate { @Resource(name = "sessionFactory") public void setSuperSessionFactory(SessionFactory sessionFactory) { super.setSessionFactory(sessionFactory); } private Serializable id; // 标示 private Class clazz; // 实体 private Object entity; // 数据库实体 private PropertyDescriptor targetPds[]; //初始化后属性 private HashMap setMethodMap = new HashMap(); //set方法映射 private HashMap getMethodMap = new HashMap(); //get方法映射 /** * 模型初始化 * * @param clazz * @param id */ public boolean init(Class clazz, Serializable id) { this.id = id; this.clazz = clazz; PropertyDescriptor targetPds[] = BeanUtils.getPropertyDescriptors(clazz); for (PropertyDescriptor pdObj : targetPds) { setMethodMap.put(pdObj.getName().toLowerCase(), pdObj.getWriteMethod()); getMethodMap.put(pdObj.getName().toLowerCase(), pdObj.getReadMethod()); } this.entity = get(clazz, id); return this.entity==null?false:true; } /** * 获取对象实体 * * @return */ public Object getObj() { if (entity == null) { this.entity = get(clazz, id); } return entity; } /** * 删除对象实体 */ public void delObj() { if (entity != null) delete(entity); else delete(get(clazz, id)); } /** * 设置数据库实体属性 * @param propertyName * @param propertyValue */ public void setProperty(String propertyName, Object propertyValue) { Method writeMethod = (Method) setMethodMap.get(propertyName.toLowerCase()); try { writeMethod.invoke(entity, new Object[] {propertyValue}); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 获取属性的值 * @param propertyName * @return */ public Object getPropertyValue(String propertyName) { Method readMethod = (Method)getMethodMap.get(propertyName.toLowerCase()); Object returnValue = null; try { returnValue = readMethod.invoke(entity,null); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return returnValue; } /** * 更新对象 */ public void updateObj() { update(entity); } /** * 保存对象 * @param obj * @return */ public Serializable addObj(Object obj) { Serializable id = save(obj); init(obj.getClass(),id); return id; } } </pre> <br /> <br />建立一张用户表测试,对应实体如下 <br /><pre name="code" class="java"> import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; import org.springframework.stereotype.Repository; import com.usoft.core.dao.impl.MagicH; /** * MagicUser entity. @author MyEclipse Persistence Tools */ @Repository("MagicUser") @Entity @Table(name = "MAGIC_USER") public class MagicUser extends MagicH implements java.io.Serializable { // Fields private String userId; private String userNam; private String userSex; private String userPhone; // Constructors /** default constructor */ public MagicUser() { } /** full constructor */ public MagicUser(String userNam, String userSex, String userPhone) { this.userNam = userNam; this.userSex = userSex; this.userPhone = userPhone; } // Property accessors @GenericGenerator(name = "generator", strategy = "uuid.hex") @Id @GeneratedValue(generator = "generator") @Column(name = "USER_ID", unique = true, nullable = false, length = 32) public String getUserId() { return this.userId; } public void setUserId(String userId) { this.userId = userId; } @Column(name = "USER_NAM", length = 500) public String getUserNam() { return this.userNam; } public void setUserNam(String userNam) { this.userNam = userNam; } @Column(name = "USER_SEX", length = 1) public String getUserSex() { return this.userSex; } public void setUserSex(String userSex) { this.userSex = userSex; } @Column(name = "USER_PHONE", length = 11) public String getUserPhone() { return this.userPhone; } public void setUserPhone(String userPhone) { this.userPhone = userPhone; } } </pre> <br /> <br />这是本人测试用的service <br /><pre name="code" class="java"> import javax.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.usoft.magich.bs.ImagicServiceTest; import com.usoft.magich.vo.MagicUser; @Service("MagicService") @Transactional(readOnly = false, propagation = Propagation.REQUIRED) public class MagicServiceTestImpl implements ImagicServiceTest { @Resource private MagicUser magicUser; public void testMagicH() { //保存 magicUser.setUserNam("用户123"); magicUser.setUserPhone("12345"); magicUser.setUserSex("1"); magicUser.addObj(magicUser); //更新 magicUser.setProperty("UserNam", "1234567"); magicUser.updateObj(); System.out.print(magicUser.getPropertyValue("UserNam")); boolean b1 = magicUser.init(magicUser.getClass(), "aaa"); //id 不存在初始化失败 System.out.println(b1); boolean b2 = magicUser.init(magicUser.getClass(),"402881862da6ec3b012da6fb4f640004"); //id存在为 true System.out.println(b2); magicUser.delObj(); //删除 对象 } } </pre> <br /> <br />只是中午吃饭时脑子那么想了一下,然后回来就尝试写了个单表的增删改查,我个人举得无论是单表还是多表最后数据库查出来的无非是个二叉表,而其中的一条记录应该对应一个java类 多条记录则是该java类的List集合,然后所有的数据库操作不再是dao.doSomething 而是entity.doSomething <br />我这样做了后写的代码就只有actiong,service,entity层了,不知道这样是否可行,谁能解释一下我的疑问。 <br /> <br /><br/><strong>问题补充</strong><br/>看了大家的回复深受启发,感觉自己这个想法似乎不可取就不再钻牛角尖了。 <br />可能一直处于开发人员的角色,所以关系的核心问题无非就是 写最少的代码做最多的事
hibernate 采用session.save(Object)方法保存不了数据
代码如下: bean类: package org.hibernate.sample.modle; import java.io.Serializable; import org.apache.commons.lang.builder.ToStringBuilder; /** @author Hibernate CodeGenerator */ public class Student implements Serializable { private static final long serialVersionUID = 1L; /** identifier field */ private Integer studentId; /** persistent field */ private String name; /** persistent field */ private String sex; /** persistent field */ private Integer age; /** full constructor */ public Student(String name, String sex, Integer age) { this.name = name; this.sex = sex; this.age = age; } /** default constructor */ public Student() { } public Integer getStudentId() { return this.studentId; } public void setStudentId(Integer studentId) { this.studentId = studentId; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getSex() { return this.sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return this.age; } public void setAge(Integer age) { this.age = age; } public String toString() { return new ToStringBuilder(this) .append("studentId", getStudentId()) .toString(); } } 映射配置: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="org.hibernate.sample.modle"> <!-- Created by the Middlegen Hibernate plugin 2.1 http://boss.bekk.no/boss/middlegen/ http://www.hibernate.org/ --> <class name="Student" table="student" dynamic-update="true"> <id name="studentId" type="java.lang.Integer" column="student_id" unsaved-value="0"> <generator class="native"/> </id> <property name="name" type="java.lang.String" column="name" not-null="true" length="45"/> <property name="sex" type="java.lang.String" column="sex" not-null="true" length="45"/> <property name="age" type="java.lang.Integer" column="age" not-null="true" length="45"/> <!-- Associations --> </class> </hibernate-mapping> 配置文件: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!-- SessionFactory 配置 --> <session-factory> <!-- MySQL配置 --> <!-- 数据库URL --> <property name="connection.url"> <![CDATA[ jdbc:mysql://localhost:3306/bms?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8]]> </property> <!-- 数据库JDBC驱动 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!--数据库用户名 --> <property name="connection.username"><![CDATA[root]]></property> <!--数据库用户密码 --> <property name="connection.password"></property> <!--dialect ,每个数据库都有其对应的Dialet以匹配其平台特性 --> <property name="dialect"> org.hibernate.dialect.MySQLDialect</property> <!-- 是否将运行期生成的SQL输出到日志以供调试 --> <property name="show_sql">true</property> <!--映射文件配置,注意配置文件名必须包含其相对于根的全路径 --> <mapping resource="org/hibernate/sample/modle/Student.hbm.xml"/> </session-factory> </hibernate-configuration> 测试类: package test; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.Session; import org.hibernate.sample.modle.Student; import junit.framework.Assert; import junit.framework.TestCase; public class HibernateTest extends TestCase { Session session = null; /** * JUnit中setUp方法在TestCase初始化的时候会自动调用 一般用于初始化公用资源 此例中,用于初始化Hibernate Session */ protected void setUp() { try { /** * 采用hibernate.properties配置文件的初始化代码: Configuration config = new * Configuration(); config.addClass(TUser.class); */ // 采用hibernate.cfg.xml配置文件 // 请注意初始化Configuration时的差异: // 1.Configuration的初始化方式 // 2.xml文件中已经定义了Mapping文件,因此无需再Hard Coding导入 // POJO文件的定义 Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); session = sessionFactory.openSession(); } catch (HibernateException e) { e.printStackTrace(); } } /** * 与setUp方法相对应,JUnit TestCase执行完毕时,会自动调用tearDown方法 一般用于资源释放 * 此例中,用于关闭在setUp方法中打开的Hibernate Session */ protected void tearDown() { try { session.close(); } catch (HibernateException e) { e.printStackTrace(); } } /** * 对象持久化(Insert)测试方法 * * JUnit中,以”test”作为前缀的方法为测试方法,将被JUnit自动添加 到测试计划中运行 */ public void testInsert() { try { Student student = new Student(); // student.setStudentId( Integer.valueOf(1)); student.setName("哈哈"); student.setSex("男"); student.setAge(Integer.valueOf(13)); session.save(student); session.flush(); System.out.println(student.getStudentId()); } catch (HibernateException e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } /** * 对象读取(Select)测试 请保证运行之前数据库中已经存在name=’Erica’的记录 */ public void testSelect() { String hql = " from Student where name='哈哈'"; try { Query query= session.createQuery(hql); List list=query.list(); Student student = (Student) list.get(0); Assert.assertEquals(student.getName(), "哈哈"); } catch (HibernateException e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } } [b]问题补充:[/b] 数据库表的 create table student( student_id integer unsigned auto_increment, name varchar(45) not null, sex varchar(45) not null, age integer not null );
hibernate中单向多对一的关联疑惑(管理员勿将帖子转到问答,那里不好交流)
本人初学hibernate,希望大家多多指教! <br />我假设person和card的多对一的关系(实际这两者的关系不是多对一) <br />他们对应的映射文件是: <br /><strong>person.hbm.xml</strong> <br /><pre name="code" class="xml"><!----> &lt;hibernate-mapping schema="hibernatequickuse"&gt; &lt;class name="mypack.person" table="person"&gt; &lt;id name="id" column="id" type="java.lang.Integer"&gt; &lt;generator class="identity"&gt; &lt;/id&gt; &lt;property name="name" column="name" type="java.lang.String" not-null="true"&gt;&lt;/property&gt; &lt;many-to-one name="mycard" column="card_id" class="mypack.Card" cascade="all"&gt;&lt;/many-to-one&gt; &lt;/class&gt; &lt;/hibernate-mapping&gt; </pre> <br /><strong>Card.hbm.xml</strong> <br /><pre name="code" class="xml"><!----> &lt;hibernate-mapping&gt; &lt;class name="mypack.Card" table="card"&gt; &lt;id name="id" column="ID" type="java.lang.Integer"&gt; &lt;generator class="identity"&gt; &lt;/id&gt; &lt;property name="name" column="NAME" type="java.lang.String" not-null="true"&gt;&lt;/property&gt; &lt;/class&gt; &lt;/hibernate-mapping&gt; </pre> <br />假设当我们先把many-to-one中的cascade属性值去掉,改为: <br /><pre name="code" class="xml">&lt;many-to-one name="mycard" column="card_id" class="mypack.Card"&gt;&lt;/many-to-one&gt; </pre> <br />然后执行如下代码: <br /><pre name="code" class="java"> person p=new person(); p.setName("jack01"); Card c=new Card(); c.setName("card0031"); p.setMycard(c); Session session=null; Transaction tran=null; try{ session=factory.openSession(); tran=session.beginTransaction(); session.save(p);//为什么是update,而不是Insert tran.commit(); 。。。。。。。 </pre> <br />执行结果本来应该会报一个异常,因为只持久化了person对象。而card是临时对象,所以当hibernate自动清理缓存中的持久化对象时会发现p引用了c临时对象,而在person表中对应的card_id字段值为0,这说明person持久化对象的状态和数据库的记录不一致,所以应该会抛出异常!但是它却并没有抛出异常, <br />而是插入了一条person记录,其card_id=0这是为什么??? <br /><pre name="code" class="sql">Hibernate: insert into hibernatequickuse.person (name, card_id) values (?, ?)</pre> <br />当我把cascade="all"加上去之后,本来这时应该是先插入card记录,然后插入Person记录。但结果却是: <br /><pre name="code" class="sql">Hibernate: insert into hibernatequickuse.person (name, card_id) values (?, ?) Hibernate: update card set NAME=? where ID=? </pre> <br />而且抛出异常,表示无法更新!这又是为什么???????? <br /><pre name="code" class="java">Exception executing batch: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 </pre> <br /><strong>表结构如下:</strong> <br /><pre name="code" class="sql">-- -- 表的结构 `card` -- CREATE TABLE `card` ( `id` int(11) NOT NULL auto_increment, `name` varchar(20) collate latin1_general_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=7 ; CREATE TABLE `person` ( `id` int(11) NOT NULL auto_increment, `name` varchar(32) collate latin1_general_ci NOT NULL, `card_id` int(11) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `card_id` (`card_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=4 ; </pre> <br /><strong>POJO如下:</strong> <br /><strong>person</strong> <br /><pre name="code" class="java">package mypack; public class person implements java.io.Serializable{ private int id; private String name; private Card mycard; public person(){ } private void setId(int id){ this.id=id; } public void setName(String name){ this.name=name; } public void setMycard(Card mycard){ this.mycard=mycard; } public int getId(){ return this.id; } public String getName(){ return this.name; } public Card getMycard(){ return this.mycard; } } </pre> <br /> <br /><strong>Card</strong> <br /><pre name="code" class="java">package mypack; public class Card { private int id; private String name; public Card(){ } public void setId(int id){ this.id=id; } public void setName(String name){ this.name=name; } public String getName(){ return this.name; } public int getId(){ return this.id; } } </pre> <br /> <br /><br /><strong>问题补充</strong><br />补充下:我是参照网友的教程来做的,地址是:http://ryanpoy.iteye.com/blog/189783 <br />奇怪的是他的结果是正确的!程序里面唯一不同的是我主键的设置上,我用的是auto_increment,映射xml中用的是identity! <br /> <br /><br /><strong>问题补充:</strong><br />谢谢kulinglei的回答,问题是我将cascade="save-update"; 它也没报任何异常啊,正常的情况应该是会报你所说的异常啊 !我把源码上传下,能帮我看看吗?<br /><strong>问题补充:</strong><br />这是源码,希望大家帮帮忙!<br /><strong>问题补充:</strong><br />谢谢etank帮忙,但我也用的是hibernate3的包,并且把identity改为了native。把cascade设为none,结果还是没报任何异常啊?我用的是mysql的数据库
一对多嵌套查询 mysql 8小时问题
刘老师你好: 我在结果映射中使用了collection,一对多嵌套查询,dbcp连接池; 但是间隔一段时间再访问就会出现异常: java.sql.SQLException: No operations allowed after statement closed. 再重新请求一次就好了,添加以下配置也没能解决: ``` <!--指定数据库的默认自动提交--> <property name="defaultAutoCommit" value = "true" /> <!--是否自动回收超时连接--> <property name="removeAbandoned" value="true" /> <!--超时时间(以秒数为单位)--> <property name="removeAbandonedTimeout" value="10" /> <!--记录中断事件 --> <property name="logAbandoned" value="true" /> <!-- 池中的连接空闲30分钟后被回收 --> <property name="minEvictableIdleTimeMillis" value="1800000" /> <!-- some positive integer --> <property name="timeBetweenEvictionRunsMillis" value="30000" /> <!--取得对象时是否进行验证,检查对象是否有效 --> <property name="testOnBorrow" value="true" /> <!--空闲时是否进行验证,检查对象是否有效 --> <property name="testWhileIdle" value="true" /> <!--返回对象时是否进行验证 --> <property name="testOnReturn" value="true"/> <property name="validationQuery" value="select 1" /> <!-- 下面这两个属性属于优化部分,加上这两个属性可以提高整体的响应时间 --> <!-- 表明是否开启statement cache,默认为false,也就是不开启 --> <property name="poolPreparedStatements" value="true" /> <!-- statement cache的大小,默认为-1,也就是不限制 --> <property name="maxOpenPreparedStatements" value="10" /> <!-- 在每次空闲连接回收器线程(如果有)运行时检查的连接数量 --> <property name="numTestsPerEvictionRun" value="1" /> ```
spring mvc+mybatis 事务控制不起作用
用的是spring mvc和mybatis框架。数据库是mysql。然后发现事务配置了不起作用。。业务逻辑是新增用户,用户新增成功之后再在其他表插入一条对应的用户角色关联信息。现在问题是假如用户插入成功之后。。插入对应的用户角色关联信息出错后,用户那条新增记录不能自动删除。看了很多人说是因为@service提前扫描的问题。那个我改过了。还有说是表的引擎不是InnoDB。但是我们建的表是InnoDB。还有说要抛出RuntimeException。我也抛出了。。但是还是没用。没办法。请大家看下: -serlet.xml: [code="xml"] <mvc:resources mapping="/resources/**" location="/resources/" /> <context:annotation-config /> <mvc:annotation-driven /> <!-- ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 --> <context:component-scan base-package="com.xuanyan.uebuycar.*"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> <!-- ②:启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="cacheSeconds" value="0" /> <property name="webBindingInitializer"> <bean class="com.xuanyan.uebuycar.admin.util.WebDataBinder4DateAndTime"/> </property> </bean> <!-- ③:对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".html"/> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="i18n/messages"/> [/code] applicationContext.xml: [code="xml"] <!-- 用于持有ApplicationContext,可以使用SpringContextHolder.getBean('xxxx')的静态方法得到spring bean对象 --> <bean class="com.xuanyan.uebuycar.admin.util.SpringContextHolder" lazy-init="false" /> <!-- define the SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="proxool" /> <property name="configLocation" value="classpath:mybatis-config.xml" /> </bean> <!-- 数据连接事务 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="proxool" /> </bean> <!-- 不扫描带有@Controller注解的类。因为这些类已经随容器启动时,在servlet-context中扫描过一遍了 --> <context:component-scan base-package="com.xuanyan.uebuycar"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- 激活annotation功能 --> <context:annotation-config /> <!-- 激活annotation功能 --> <context:spring-configured/> <!-- mybatis接口 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.xuanyan.uebuycar.admin.dao" /> </bean> <!-- 连接事务的注解配置 --> <tx:annotation-driven transaction-manager="transactionManager" /> <aop:config proxy-target-class="true"> <aop:pointcut id="fooServiceOperation" expression="execution(* com.xuanyan.uebuycar.admin.service..*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation" /> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- the transactional semantics... --> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> </tx:attributes> </tx:advice> [/code] 方法: [code="java"] public String addOrUpdate(SysUser record,SysUser currUser,String actionType,String roleId){ String str=getDefJsonString(false, "操作失败,请稍后再试!"); try { if(record!=null){ Date now=new Date(); SysUserExample example=new SysUserExample(); example.createCriteria().andUserCodeEqualTo(record.getUserCode()); List<SysUser> list=sysUserMapper.selectByExample(example); if("add".equalsIgnoreCase(actionType)){ if(list!=null&&list.size()>0){ str=getDefJsonString(false, "操作失败,该账号已存在!"); return str; } String userId=CommonUtil.getUUIDString(); record.setUserId(userId); record.setUserPassword(CommonUtil.getMD5Str(SystemCommonParam.DEFAULT_USER_PWD)); record.setUpdateUser(currUser.getUserCode()); record.setUpdateTime(now); if(sysUserMapper.insertSelective(record)>0){ SysRoleUser ru=new SysRoleUser(); // ru.setRoleUserId(CommonUtil.getUUIDString()); ru.setRoleId(roleId); ru.setUserId(userId); ru.setUpdateUser(currUser.getUserCode()); ru.setUpdateTime(now); if(sysRoleUserMapper.insertSelective(ru)>0){ str=getDefJsonString(true, "新增成功!"); } } }else if("edit".equalsIgnoreCase(actionType)){ if(list!=null&&list.size()>0){ if(!list.get(0).getUserId().equals(record.getUserId())){ str=getDefJsonString(false, "操作失败,该账号已存在!"); return str; } } record.setUpdateUser(currUser.getUserCode()); record.setUpdateTime(now); if(sysUserMapper.updateByPrimaryKeySelective(record)>0){ SysRoleUser ru=new SysRoleUser(); ru.setRoleId(roleId); SysRoleUserExample ex=new SysRoleUserExample(); ex.createCriteria().andUserIdEqualTo(record.getUserId()); if(sysRoleUserMapper.updateByExampleSelective(ru, ex)>0){ str=getDefJsonString(true, "修改成功!"); } } } } } catch (Exception e) { str=getDefErrorString(); e.printStackTrace(); throw new RuntimeException(); } return str; } [/code] 类路径:com.xuanyan.uebuycar.admin.services.sys.SysUserService 希望各位有知道能够告知一下。。是不是我service方法写的不对?
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
前端 | 2. 正则
转载请注明以下: 本文转自清自以敬的博客:https://blog.csdn.net/qq_45791147 文章目录1.转义2.正则表达式初步2.1.匹配字符2.1.1.组成元素2.1.2.基础正则的设计 1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转义...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
Docker 从入门到掉坑
Docker 介绍 简单的对docker进行介绍,可以把它理解为一个应用程序执行的容器。但是docker本身和虚拟机还是有较为明显的出入的。我大致归纳了一下,可以总结为以下几点: docker自身也有着很多的优点,关于它的优点,可以总结为以下几项: 安装docker 从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Doc...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
金山办公上市,雷军心愿了却!
作者 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 11月17日,大周末的,雷军微博发了个重磅消息: “明天将是里程碑式的一天,金山办公终于成功在科创板挂牌上市了! 从1988年金山创办到今天,WPS走了整整31年。 从1999年以金山办公为主体准备上市算起,这一天,我们等了20年。 WPS和金山的历程,这是一个坚持梦想并最终取得胜利的励志故事。期待大家的祝福!”...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车?某胡同口的煎饼摊一年能卖出多少个煎饼?深圳有多少个产品经理?一辆公交车里能装下多少个乒乓球?一个正常成年人有多少根头发?这类估算问题,被称为费米问题,是以科学家费米命名的。为什么面试会问这种问题呢?这类问题能把两类人清楚地区分出来。一类是具有文科思维的人,擅长赞叹和模糊想象,它主要依靠的是人的第一反应和直觉,比如小孩...
相关热词 基于c#波形控件 c# 十进制转十六进制 对文件aes加密vc# c#读取栈中所有的值 c# rsa256加密 好 学c# 还是c++ c# 和java的差距 c# curl网络框架 c# https证书请求 c# 中崎
立即提问