公司名称:西安泛网信息技术有限公司 公司地址:西安市碑林区企图时代大厦 公司规模:100-200人面试整体事项 至少写出3种ssh框架中常用的注解 @RequestMapping springMvc中访问地址映射 @ResponseBody springMvc中返回视图 @Table hibernate中实体类与数据库相对于的表 @Controller springMvc控制器的解释 @Resource 引入service方法 jdbc的原理,怎么连接数据库的? 需要深入的了解 1.注册和加载数据库驱动程序 2.建立与数据库的连接 3.构造sql语句 4.发送sql语句 5.执行sql语句 6.关闭数据库链接 1)在开发环境中加载指定的数据库驱动程序 导入数据库驱动包 2)加载驱动程序 java程序中,通过Class.forName来指定数据库的驱动程序 3)创建数据库连接对象 通过DriverManager类创建数据库连接对象Connection 4) 创建执行对象(statement)Statement类主要执行静态SQL语句并返回它所生成结果的对象 5)调用Statement对象执行相关SQL语句 6)关闭数据库链接 Hibernate的工作原理: 1)Hibernate初始化创建SessionFactory 创建Configeration类的实例, 在构造方法中将配置文件读入内存中, 一个Configeration 实例代表Hibernate所有java类到Sql数据库映射的集v合。 2) 通过实例化Configuration 就可以创建SessionFactory对象, 进一通过sessionFactory 实例来创建session对象 3)得到session后,可以进行持久化操作 4)还可以通过事务来管理 5)关闭资源。 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory ibatis 用过吗?怎么连接数据库的? myBatis是一个可自定义Sql,存储过程和高级映射的持久层框架,对jdbc进行了封装,使用简单的XML和注解来配置和映射基本数据类型,map接口和pojo到数据记录, 是一种半自动化的ORM实现。 1)首先创建Cinfiguration。xml文件 2)使用myBatis提供的工具类中的方法从类路径或配置问价所在位置加载资源文件, 3)创建SqlSessionFactory 4) 使用工厂创建SqlSession对象 5) 打开Session 。openSession()如果参数为true表示该会话具有自动提交事务的功能,否则需要手动提交。 6)使用sqlsession进行数据库的操作。 strust2的工作原理: 客户端发送一个HttpServletRequest请求给中央控制器(StrutsPrepareAndExecuteFilter) 中央控制器询问映射器(actionMapper)该请求是否是一个struts2请求,如果是,经过一系列的过滤器 然后由中央控制器把请求的出来交给ActionProxy(Action代理对象),ActionProxy通过配置信息找到 需要调用的Action类,根据反射机制实例化出struts.xml,全部执行完毕后再反向经过一系列拦截器,将根 据配置文件的Result找到对应的视图,把结果响应到客户端 客户端发送一个HttpServletRequest请求被struts2的拦截器所拦截,struts2 判断该请求是否是一个struts2请求,如果是,则将该请求交给ActionPoxy, ActionPoxy代理将查询struts.xml配置文件,找到对应的Action 及相关的方法, ActionPoxy实例化ActionInvocation,并进行初始化,ActionInvocation调用Action, 调用前后经过一系列的拦截器大概20个,调用完毕,在执行Invocation.Invoke()之后 的代码,全部执行完毕后再反向经过一系列拦截器,将根据配置文件的Result找到对应的 结果集进行渲染。 Struts2工作流程 1.用户提交表单 2.struts默认拦截器拦截用户请求,有其他拦截器的话 顺序执行拦截器 3.执行action的execute方法 4.根据返回的result跳转 springmvc和struts2的对比 首先它们都web层的框架 spring mvc 开发效率比struts2 要高,springMVC 请求只实列化一次 struts2 没请求一次都会实列化一次 springMVC 是基于方法级别的一种拦截设计 struts2 是基于类的设计 OA工作流 oa是做的是小型的,自己内部使用的办公系统里面的人使用的的工作流还没用到第三方框架 工作流就是一系列相互衔接、自动进行的业务活动或任务。 OA工作流就是建立于网络办公自动化基础上的事务行政审批,业务申请审批、公文、信息等的网上流转。 hibernate 基于orm技术的一个框架,把对表的操作转成对对象的操作 是基于JAVA的轻量级框架,封装了JDBC,是J2EE体系中的持久层框架,主要实现对数据库的操 作 hibernate提高系统性能的方法 延迟加载,抓取策略,缓存机制 简述一下OA系统及功能 oa是做的是小型的,自己内部使用的办公系统,主要功能有,公告管理,邮件管理,菜单管理,用户管理,角色管理 公告管理根据管理人员权限的不同看到的效果也不一样,普通人员只能查看所有审核通过的公告,管理员可以看到所有的公告 邮件管理实现公司内部的发送邮件和收邮件以及邮件转发功能 菜单管理和用户管理实现对菜单和用户的增删查改功能 角色管理实现了对角色权限的管理 aop(面向切面编程) 代码从上往下执行的过程中可以从任意一个点切进来一段代码来实现某些功能 例如日志或事务的应用把一些功能业务封装成一个模块,其他地方要用到时直接调用它的一个方法 邮件的设计思路 邮件含邮件表、邮件用户关系表、附件表 中间表包括邮件编号,用户编号,是否已读(0未读1已读),邮件状态 通过JSP页面填写信息 进入struts的action控制层 进入service层 调用持久层的实现方法 将数据写入数据库。 收件通dao实现层将数据从数据库中取出传到业务逻辑层再传到action层,再从action层传到页面显示出来 ORM 对象关系映射 它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候 就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。 IOC控制反转 new的过程交给spring容器去处理,不需要自己创建它 将你设计好的类交给系统去控制,而不是在你的类内部控制。比如我们需要一件衣服,直接去商店买就好了,不用知道他是怎么制造出来的,省掉了自己制造的过程 依赖注入 接口注入,属性注入,构造注入 连接池: 每一次web请求都要建立一次数据库连接。建立连接是一个费时的活动 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时 只需从“缓冲池”中取出一个,使用完毕之后再放回去。 二级缓存: 一级缓存存放在内存中,二级缓存可以存放在内存中也可以存放在硬盘中 分页思路 事务 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。 1、客户端浏览器发出HTTP请求。 2、根据web.xml配置,该请求被 FilterDispatcher接收。 3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。 4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。 5、Action执行完毕,根据 struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。 6、返回HTTP响应到客户端浏览器。 spring的工作原理: Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架业务对象,AOP就是可以 Spring的核心在于他的IOC(控制反转) 和 AOP(面向切面编程), IOC就是用来管理所有的在调用方法的前后植入附加的行为;di 依赖注入 springMVC的工作原理: 客户端发送一个请求过来--》 前端控制器接收--得到url地址,--》 由前端处理映射器(根据url地址得到相对应的类)--》 前端处理适配器调用方法执行方法里面的代码---》 由视图解析器解析出要返回的页面--》 响应到客户端 1.spring mvc请所有的请求都交给DispatcherServlet,它会委托其他应用系统的其他功能模块对请求进行处理。 2.DispatcherServlet查询一个或多个HandlerMapping,会找到处理请求的Controller. 3.DispatcherServlet把请求提交给目标Controller. 4.Controller进行业务逻辑处理后,会返回一个ModelAndView. 5.DispatcherServlet查询一个多个ViewResolvet视图解析器,找到ViewResolvet对象指定的视图对象。 6.视图对象负责渲染饭后客户端 数据库的优化: 1、调整数据结构的设计。这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等。 2、调整应用程序结构设计。这一部分也是在开发信息系统之前完成,程序员在这一步需要考虑应用程序使用什么样的体系结构, 是使用传统的Client/Server两层体系结构,还是使用Browser/Web/Database的三层体系结构。不同的应用程序体系结构要求的数据库资源是不同的。 3、调整数据库SQL语句。应用程序的执行最终将归结为数据库中的SQL语句执行,因此SQL语句的执行效率最终决定了ORACLE数据库的性能。 ORACLE公司推荐使用ORACLE语句优化器(Oracle Optimizer)和行锁管理器(row-level manager)来调整优化SQL语句。 4、调整服务器内存分配。内存分配是在信息系统运行过程中优化配置的,数据库管理员可以根据数据库运行状况调整数据库系统全局区(SGA区)的数据缓冲区、 、日志缓冲区和共享池的大小;还可以调整程序全局区(PGA区)的大小。需要注意的是,SGA区不是越大越好,SGA区过大会占用操作系统使用的内存而引起虚拟内存的页面交换,这样反而会降低系统。 5、调整硬盘I/O,这一步是在信息系统开发之前完成的。数据库管理员可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡。 6、调整操作系统参数,例如:运行在UNIX操作系统上的ORACLE数据库,可以调整UNIX数据缓冲池的大小,每个进程所能使用的内存大小等参数。 实际上,上述数据库优化措施之间是相互联系的。ORACLE数据库性能恶化表现基本上都是用户响应时间比较长, 需要用户长时间的等待。但性能恶化的原因却是多种多样的,有时是多个因素共同造成了性能恶化的结果, 这就需要数据库管理员有比较全面的计算机知识,能够敏感地察觉到影响数据库性能的主要原因所在。 另外,良好的数据库管理工具对于优化数据库性能也是很重要的。 1、ORACLE数据库在线数据字典, 2,操作系统工具,例如UNIX操作系统的vmstat,iostat等命令 3、SQL语言跟踪工具 4、ORACLE Enterprise Manager(OEM),这是一个图形的用户管理界面,用户可以使用它方便地进行数据库管理而不必记住复杂的ORACLE数据库管理的命令。 5、EXPLAIN PLAN——SQL语言优化命令,使用这个命令可以帮助程序员写出高效的SQL语言 oracle数据库优化策略: 1.调整数据库结构的设计 对访问频繁的数据,充分利用数据库cache和应用的缓存6、数据量比较大的,在设计过程中,为了减少其他表的关联,增加一些冗余字段,提高查询性能 原则上为创建的每个表都建立一个主键,主键唯一标识某一行记录,用于强制表的实体完整性。 为每一个外键列建立一个索引,如果确认它是唯一的,就建立唯一索引。 在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。 在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。 2.调整应用程序的结构设计 减少应用和数据库的交互次数、同一个sql语句的执行次数 设置Fetch Size 优化业务逻辑 使用存储过程 如果采用存储过程你可以将整个业务逻辑封装在存储过程里,然后在客户端直接调用存储过程处理,这样可以减少网络交互的成本。 3.调整数据库sql语句 应尽量避免在 where 子句中对字段进行 null 值判断 减少表之间的关联 or 是否会引起全表扫描 避免使用NOT IN,可以用LEFT OUTER JOIN代替它 尽量使用exists代替select count(*)来判断是否存在记录 select * 换成字段能提高一丁点效率 查询仅仅返回需要的行和列 避免使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 执行,耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序 避免在WHERE子句中使用in,not in,or 或者having 减少比较操作 合理使用排序 大量复杂运算在客户端处理 4.调整服务器内存的分配 可以根据数据库的运行状态调整数据库全局区(SGA)区的数据缓冲区,日志缓冲区,和共享池的大小;还可以调整全局区的大小; SGA主要有三部分组成:共享池,数据库缓冲区,日志缓冲区; 共享池:共享SQL区和数据缓冲区;共享SQL区是存放SQL命令的区域;数据字典缓冲区存放的是数据库运行的动态信息; 5.调整硬盘I/O 6.调整操作系统的参数 运行在UNIX操作系统上的ORACLE数据库,可以调整UNIX数据缓冲池的大小,每个进程所能使用的内存大小等参数。 减少数据库服务器CPU运算 多线程: 多线程是指单个程序中可以同时运行多个不同的线程执行不同的任务,他们共享一块内存空间,有可能相互影响; 线程的生命周期: 创建状态,可运行状态,运行状态,阻塞状态,消亡状态; 线程的同步: 一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。 释放锁是指持锁线程退出了synchronized同步方法或代码块。 synchronize: 修饰方法的时候叫做同步方法; java中每个单独的对象都有锁,当访问某个对象的synchronize方法的时候,首先将对象上锁,此时其他线程再也无法访问该对象的同步方法; 直至之前的线程完毕,才将该对象的锁释放掉;其他对象才有可能访问该对象的synchronized方法; 并发: 多个进程或线程同时(或者说同一时间段内)访问同一资源会产生并发的问题 线程安全: 首先,在单线程中不会出现线程安全的问题 而在多线程编程中,有可能出现同时访问同一个资源的情况,这种资源可以是各种类型的资源: 一个变量,一个对象,一个文件,一个数据库表等,而当多个线程同时访问同一个资源的时候,就先出现问题: 由于每个线程的执行过程是不可控的,所以很有可能导致最终的结果与预期的结果相违背,或者直接导致程序出错。 也就是说:当多个线程同时访问临界资源(共享资源:一个对象,对象中的属性,一个文件,一个数据库)时,可能会出现线程安全的问题。 如何解决线程安全: 采用“序列化访问临界资源”的方案,即在同一时刻,只能有一个线程访问临界资源,也称为同步互斥访问。 synchronize方法是一种细粒度的并发控制。 使用synchronized关键字修饰方法,当访问某个对象的synchronized方法的时候,首先将对象上锁,此时其他线程再也无法访问该对象的同步方法, 知道线程执行同步方法完毕,才将该对象的锁释放掉,其他对象才有可能访问该对象的synchronized方法; 或者使用同步块; 什么是死锁: 如果一个进程集合里面的每一个进程都在等待只能由这个集合中的其他一个进程(包括他自生)才能引发的事件, 这种情况就是死锁。 线程之间互相等待; 死锁的四个必要条件: 1.互斥条件:资源不能被共享,只能由一个进程使用。 2.请求与保持条件:已经得到资源的进程可以再次申请新的资源。 3.非剥夺条件:已经分配的资源不能从相应的进程中被强制的剥夺。 4.循环等待条件:系统中若干进程组成环路,该环路中的每一个进程都在等待相邻进程正占用的资源。 处理死锁: 1.鸵鸟算法。 2.检测死锁并恢复。 3.仔细的对资源进行动态的分配,以避免死锁; 4.通过破除死锁四个必要条件之一,来防止死锁。 处理高并发: 1)数据库方面: 设置事务可以解决数据库操作并发的问题; 数据库的性能优化; 2)系统的设计方面: 尽量使用缓存,包括用户缓存,信息缓存:可以大大减少与数据库的交互,提高性能; 负载均衡/加速 存储 3)HTML静态化: HTTP请求---Web服务器---Servlet--业务逻辑处理--访问数据--填充JSP--响应请求 HTTP请求---Web服务器---Servlet--HTML--响应请求 存储过程: 商业规则和业务逻辑可以通过程序储存在Oracle中,这个程序就是存储过程。 存储过程是SQL,PL/SQL,Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。 这样的结果就是,代码存储一次但是能被多个程序使用。 好处: 1)存储过程是预编译过的,并且经过优化后存贮于SQL内存中,使用时无需再次编译,提高了工作效率; 2)存储过程的代码直接存放于数据库中,一般有客户端直接通过存储过程的名字进行调用,减少了网络流量, 加快可系统的执行速度,例如在进行百万以上的大批数量查询时,使用存储过程分页要比其他方式分页快得多; 3)使用存储过程可以减少SQL注入式攻击,提高了系统的安全性,执行存储过程的用户要具有一定的权限才 能使用存储过程,没有数据库的操作权限的用户只能在其控制下间接的存取数据; 4)在进行主,从表及多表间的数据维护及有效性验证时,使用存储过程比较方便,而且可以有效利用SQL中的事务处理机制; 5)使用存储过程,可以实现存储过程设计和编码工作分开进行,只要将存储过程名,参数,及返回信息告诉编码人员即可: 6)但使用存储过程封装业务逻辑将限制应用程序的可移植性;另外,如果更改储存过程的参数或者返回的数据及类型的话 需要修改应用程序的相关代码,比较繁琐。 存储过程和函数的区别: function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。 本质上没有区别,都是PL/SQL程序,都可以有返回值。 最根本的区别是:存储过程是命令,而函数是表达式的一部分。 调用: 通过数据库函数来调用存储过程: 网络编程: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接端成为一个socket。也成为套接字。 用于描述ip地址和端口,是通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求, 可以用来实现不同虚拟机或不同计算机之间的通信。 网络中的进程是通过socket来通信的,socket是open-write/read-close模式的一种实现,socket提供了这些操作对应的函数接口, ArrayList和LinkList的区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkList是基于链表的数据结构。 2.对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。 若之对单条数据出入删除,ArrayList的速度反而优于LinkedList, 但是批量插入和删除数据的时候,LinkedList的速度大大优于ArrayList,因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。 Collection与collections的区别: Collection是接口,是集合中的接口,collections是一个类,是集合中的一个工具类; ajax同步和异步的区别: 同步需要返回结果才能继续,异步不必等待,一般需要监听异步的结果, 同步是一条直线上的队列,异步是不在一个队列上各走各的; 同步是按顺序处理,异步是并行处理。 同步vde情况下你点击页面上的一个按钮要等待处理结果才能点别的; 异步的情况下你点了一个按钮以后可以立即点另一个他们同时处理; 异步原理: ajax利用浏览器内置的xmlhttp组件,这个组件就是利用在不刷新页面的情况下,可以使用javascript来进行http请求的; 这样就做到了,不刷新当前页面,就可以进行数据交换了! java项目中那些场景需要用到多线程 看实际需求了,特别是一些维护线程,定时器程序,socket通信等 java有哪些api java.lang java.util java.io java.sql java.awt java.net java.applet java.swing java第三方api Commons Math是Apache上一个轻量级的数学和统计计算方法的包,包含大多数常用的数值算法 Jsoup是一款java的HTML解析器,可以直接解析某个url地址,html文本类容; Apache log4j 通过使用log4j 可以控制日志信息的殊荣目的地; jackson是用来处理JSON格式数据的java类库; 集合和数组之间的转换: 当list中的数据类型一致的时候可以将list转化为数组; Object[] array = list.toArray(); 在转化为其他类型的数据时需要强制类型转换,并且,要使用带参数的toArray方法,参数的对象数组: 将数组转换为集合list: for(int i=0;i<array.length;i++){ list.add(array); } 直接使用Arrays的asList方法: list = Arrays.asList(array); 将数组转化成list后,再用List构造Set: set new HashSet(Arrays.asList(array)); 将set清空,然后把数组转化成list全部的add set.clear(); set.addAll(Array.asList(array1)); 如何将list转换成set: List list = new ArrayList(set); Set set = new HashSet(list); list to set 最好确保list没有重复的数据; java基本数据类型: byte shot int long float double char boolean 面向对象的三大特征: 封装:类包含了属性和方法,将数据和方法放在一个类中就叫做封装; 继承:父子关系,是 从已有的类中派生出新的类,新的类能吸收已有类的数据和行为(方法),并能扩展新的能力。java是单继承的, 表示一个类只能从另外一个类继承,这个被继承的类叫父类,继承的类叫做子类。使用关键字extends; 多态:父类型的引用可以指向子类型的对象,接口类型的引用可以指向实现该接口的类的实例; 抽象类:使用abstract修饰的类叫抽象类; 抽象:抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。 接口:使用关键字Interface,接口不能实例化,接口中的所以方法都是抽象方法,可以省略掉abstract关键字; 抽象和封装的不同点 抽象和封装是互补的概念。一方面,抽象关注对象的行为。另一方面,封装关注对象行为的细节。一般是通过隐藏对象内部状态信息做到封装,因此,封装可以看成是用来提供抽象的一种策略。 堆栈的概念: java中吧内存分为两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本数据类型的变量和对象的引用变量都在函数的栈内存中分配; 当一段代码块定义一个变量的时候,java就在栈中为这个变量分配内存空间,当超过变量的作用域之后,j java会自动释放掉为该变量所分配的内存空间,改内存空间可以立即被另作他用; 堆内存用来存放new创建的对象和数组; 在堆内存中分配的内存,由java虚拟机的自动垃圾回收器来管理: 数组和对象在没有引用变量指向它的时候,才会变成垃圾,不能再被使用,但是任然占内存, 在一个不确定的时间被垃圾回收器释放掉,也是java比较占内存的原因, 实际上,栈中的变量指向对内存中的变量,这就是java的指针; 重载和重写的区别: 重载:一个类中有两个或者多个方法名相同,但是参数不同(参数的个数,参数的类型),方法的返回值与重载无关。 重写:父类和子类之间的多态性,父类的函数进行了重新的定义,如果在子类中定义某方法与其父类有相同的名称和参数 我们说该方法被重写。在java中子类可以继承父类中的所以方法,也可以对父类的方法进行修改和覆盖; 简单的说: 就是同样的一个方法能够根据输入的数据不同,做出不同的处理,即方法的重载; 而当子类继承自父类的相同的方法,输入的数据一样,但是要做出有别于父类的响应时,就要覆盖父类的方法,这就是重写; 重载是定义在同一个类内部的同名的多个方法,重写是发生在父子类之间的(伴随着继承)。 接口和抽象方法的区别: 1.接口中的所有的方法都是抽象方法,抽象类中可以有具体的方法,也可以有抽象方法; 2.接口可以多实现,抽象类只能继承一个; 3.接口中的原生数据类型都是public final static 而抽象类中的不是; 单例模式: 方法和属性都要私有化; public class Singleton{ private static Singleton instance; private Singleton(){} public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } } tcp/ip的套接字Socket。使用Socket,使程序员很方便的访问tcp/ip,从而开发网络应用程序。 定义:是连接在网络上的两个程序间的双向通信的节点; 服务端:服务器将一个套接字绑定到一个特定的端口号,并通过此套节字等待监听客户端的请求。 客户端:根据服务器程序所在的主机名和端口号发送请求。 数据库: 如何设置SQL数据库表与表的关联关系? 如果是父子关系,或者是一对多的关系。 可以通过创建外键的方式,在父表 与 子表之间,创建一个关联关系。 myBatis和hibernate的区别: mybatis是把sql语句与java代码分离了...sql语句在xml文件配置的... hibernate是ORM框架,它对jdbc进行了封装,在分层结构中处于持久化层, 它能建立面向对象的域模型和关系数据模型之间的映射. 它大大简化了dao层的编码工作 要实现多线程可以采用两种方式 继承Thread类 实现Runnable接口 |
逆风TO 发表于 2019-7-8 15:33
要认真一点呢
温柔一刀!喵! 发表于 2019-7-8 16:59
厉害了,谢谢分享 ~
duanshaobo 发表于 2019-7-8 17:38
我们处在一个竞争的时代,从单纯的产品竞争到现在人力资源的竞争,从生产资料的竞争到高新科技的竞争, ...
sdjadyhm 发表于 2019-7-8 18:52
666666666666666666666666666
小公举 发表于 2019-7-8 19:31
面试分享很厉害的
sdjadyhm 发表于 2019-7-8 18:52
666666666666666666666666666
小公举 发表于 2019-7-8 19:31
面试分享很厉害的
小公举 发表于 2019-7-8 19:31
面试分享很厉害的
manyihang 发表于 2019-7-9 14:26
666666666666
孙丽 发表于 2019-7-9 15:25
666666666666666666666
章鱼顶呱呱 发表于 2019-7-9 11:32
6666666666666666666666666666
yujq 发表于 2019-7-9 11:53
6666666666666666666
章鱼顶呱呱 发表于 2019-7-9 11:32
6666666666666666666666666666
小公举 发表于 2019-7-8 19:31
面试分享很厉害的
哦嗨呦 发表于 2019-7-9 10:38
6666666666666666
爱笑的姑娘 发表于 2019-7-9 10:49
6666666666666666666666666666666
专找bug 发表于 2019-7-9 10:52
66666666666666666666666666666666
小伙啊 发表于 2019-7-9 15:27
666666
Nancy121 发表于 2019-7-9 15:42
666666
小西西哦 发表于 2019-7-10 15:41
666666666666666666666666666666666666666666666666
小伙啊 发表于 2019-7-9 15:27
666666
Nancy121 发表于 2019-7-9 15:42
666666
举个栗子 发表于 2019-7-9 16:12
黑马666666666666
谢先森 发表于 2019-7-9 17:33
666666666666666
fujiangbo 发表于 2019-7-9 19:47
谢谢分享。。。。。。。。。。。。。。
零度☆黎明 发表于 2019-7-9 22:53
不错, 不错 .................. ..................
little_superman 发表于 2019-7-9 23:31
66666666666666666666666
superbaby 发表于 2019-7-10 07:39
感谢分享.................... ..................
JavaEE风清扬 发表于 2019-7-10 08:52
666666666666666666666
霍尔 发表于 2019-7-10 09:02
666666666666666666666666
1467584 发表于 2019-7-10 09:29
6666666666666666666666666666
kdhdjdj 发表于 2019-7-10 09:29
66666666666666666666666666666666666666666666
殷凯老师 发表于 2019-7-10 09:31
66666666666666666666666666666666666
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |