#
摘要: JSP 标准标记库( Standard Tag Library , JSTL) 是一组以标准化格式实现许多通用的 Web 站点功能的定制标记。 JSP 技术的优势之一在于其定制标记库工具。除了核心 JSP 标记,如 jsp:include 之外,定制标记库工具使您能够创建唯一的标记来描述以站点或应用程序为导向的操作。一旦您创建了定制标记库 ( 简称 taglib) ,当您扩展项目或转向另...
阅读全文
发表时间:2012-06-08 13:10:03 | | 楼主 引用 |
|
Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory
为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
2. Hibernate是如何延迟加载? 1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)
2. Hibernate3 提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、
4. 说下Hibernate的缓存机制
1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存
2. 二级缓存: a) 应用及缓存 b) 分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键数据 c) 第三方缓存的实现
5. Hibernate的查询方式 Sql、Criteria,object comptosition Hql: 1、 属性查询 2、 参数查询、命名参数查询 3、 关联查询 4、 分页查询 5、 统计函数
6. 如何优化Hibernate? 1.使用双向一对多关联,不使用单向一对多 2.灵活使用单向一对多关联 3.不用一对一,用多对一取代 4.配置对象缓存,不使用集合缓存 5.一对多集合使用Bag,多对多集合使用Set 6. 继承类使用显式多态 7. 表字段要少,表关联不要怕多,有二级缓存撑腰
7. Struts工作机制?为什么要使用Struts? 工作机制: Struts的工作流程: 在web应用启动时就会加载初始化ActionServlet,ActionServlet从 struts-config.xml文件中读取配置信息,把它们存放到各种配置对象 当ActionServlet接收到一个客户请求时,将执行如下流程. -(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息; -(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中; -(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法; -(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功; -(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的 Action实例不存在,就先创建这个实例,然后调用Action的execute()方法; -(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件; -(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;
为什么要用: JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。
基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件
8. Struts的validate框架是如何验证的? 在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。
9. 说下Struts的设计模式 MVC 模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数 据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的 Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用 Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对 象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动 态的网页,返回给客户。
10. spring工作机制及为什么要用? 1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。 2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller. 3.DispatcherServlet请请求提交到目标Controller 4.Controller进行业务逻辑处理后,会返回一个ModelAndView 5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象 6.视图对象负责渲染返回给客户端。
为什么用: {AOP 让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务 (比 如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。 IOC 允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。正如单词 倒置 所表明的,IOC 就像反 过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),每一个对象都是用其协作对象构造的。因此是由容器管理协作对象(collaborator)。 Spring即使一个AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。} |
当我们插入一条数据的时候,我们很多时候都想立刻获取当前插入的主键值返回以做它用。我们通常的做法有如下几种: 1、先 select max(id) +1 ,然后将+1后的值作为主键插入数据库; 2、使用特定数据库的 auto_increment 特性,在插入数据完成后,使用 select max(id) 获取主键值; 3、对于Oracle,使用 sequence 获取值。 对于以上3种方法都无法绝对保证在高并发情况下的操作的原子性。 现记录以下几种获取数据库主键值方法: 1、数据库原生支持的sql方法: SQLServer: INSERT INTO table_name (.....) VALUES(......) SELECT @@IDENTITY AS aliasname; 上面的语句相当于查询语句,从结果集中使用 getXXX(aliasname) 方法获取主键值。 Oracle: INSERT INTO table_name(......) VALUES(......) RETURNING[primaryKey INTO]:aliasname; 也是相当于查询语句,从结果集中使用 getXXX(aliasname) 方法获取主键值。 2、java.sql.Statement 返回键获取: a: 使用JDBC 3.0提供的 getGeneratedKeys(推荐使用) Statement stmt = ... ; stmt.executeUpdate("INSERT INTO table_name(......) VALUES(......)", Statement.RETURN_GENERATED_KEYS); ResultSet rs = stmt.getGeneratedKeys(); int keyValue = -1; if (rs.next()) { keyValue = rs.getInt(1); } b:使用特定数据库特有的SQL Statement stmt = ... ; stmt.executeUpdate("INSERT INTO table_name(......) VALUES(......)", Statement.RETURN_GENERATED_KEYS); ResultSet rs = stmt.executeQuery("SELECT LAST_INSERT_ID()"); int keyValue = -1; if (rs.next()) { keyValue = rs.getInt(1); } 那么现在我就一个例子来看一下原生的sql怎么能得到执行的返回结果 项目背景:数据库是oracle数据库,id生成规则是通过触发器插入数据的时候自动增长,所以在插入数据的时候在sql中就不需要指明id值。但是另外一张表需要引用这个id值作为外键,那么就必须获得被引用的这个表的ID,为了避免并发问题,我们只能在插入前面那张表的时候就获得他的ID,所以我使用了下面的方法来处理。 Connection con = DBConnector.getconecttion(); // 取得一个数据库连接 CallableStatement cst = null; con.setAutoCommit(false); String insertSql = "begin insert into TABLE (field_0,field_1) values (value_0,value_1) returning id into ?;end; "; try { cst = con.prepareCall(insertSql); //执行存储过程 cst.registerOutParameter(1, Types.INTEGER); //为存储过程设定返回值 int count = cst.executeUpdate(); //得到预编译语句更新记录或删除操作的结果 int id = cst.getInt(1); //得到返回值 System.out.println("成功执行了:" + count + "条数据,其ID值:" + id); } catch (SQLException e1) { con.rollback(); con.setAutoCommit(true); }finally{ con.commit(); con.close(); }
摘要: 一、 JAVA语言 1、 面向对象的三个基本特征 答:继承、封装、多态 2、 方法重载和方法重写的概念和区别 答:方法重载:方法名称相同但方法内的参数个数和参数类型不一样。 方法重写:在类的继承中,当子类的成员变量与父类的成员变量同名时,子类的成员变量会隐藏父类的成员变量;当子类的方法与父类的方法同名,参数列表、反回值类型相同时,子类的方法将覆盖父...
阅读全文
开发dao模型: 接口是用来定义操作的,在这里应该定义:添、删、改、查(ID查、查询全部、模糊查询)等操作。 import java.util.* ; // 规定出了操作person表在此项目里的全部方法 public interface PersonDAO { // 增加操作 public void insert(Person person) throws Exception; // 修改操作 public void update(Person person) throws Exception; // 删除操作 public void delete(String id) throws Exception; // 按ID查询操作 public Person queryById(String id) throws Exception; // 查询全部 public List queryAll() throws Exception; // 模糊查询 public List queryByLike(String cond) throws Exception; } 另创建一个类 import java.util.*; public class PersonDAOImpl implements PersonDAO { // 增加操作 public void insert(Person person) throws Exception { } // 修改操作 public void update(Person person) throws Exception { } // 删除操作 public void delete(String id) throws Exception { } // 按ID查询操作 public Person queryById(String id) throws Exception { } // 查询全部 public List queryAll() throws Exception { } // 模糊查询 public List queryByLike(String cond) throws Exception { } } 接下来我们按方法一个一个的实现功能: (1)添加操作,传入参数是Person person,同学们要理解为什么传入Person,因为Person是数据bean,是用来存放数据的不管从前台到后台数据库还是从后台数据库到前台,Person的角色都是用来传送数据的。 sql = "INSERT INTO person (id,name,password,age,email) VALUES (?,?,?,?,?)" ; (2)修改操作与添加操作类似传入参数也为person对象,只是SQL的执行语句不同,当然修改要有条件,即修改谁,这里是以id作为修改条件的。 sql = "UPDATE person SET name=?,password=?,age=?,email=? WHERE id=?" ; (3)删除操作,为什么这里没有以Person做参数呢,原因是使用的过程中删除操作都是通过id来标志一行记录的,为了使用方便所以传一个id就可以实现删除操作。 sql = "DELETE FROM person WHERE id=?" ; (4)查询操作一般分为三种:按ID查询、查询全部、模糊查询。 第一种:按ID查询操作,传入一个id号返回一条记录,也就是一个person对象,person对应着数据库里的一行记录,所以返回值应该为Person类型。 sql = "SELECT id,name,password,age,email FROM person WHERE id=?" ; 第二种:查询全部,也就是查询整张表的全部数据,因为整张表有多条记录,所以对应就应该有多个person对象,查询的时候我们可以用list存放多个person对象,查询之后将该list返回。 sql = "SELECT id,name,password,age,email FROM person" ; 第三种:模糊查询,所谓模糊查询是指在数据表中查找与指定字符串部分相匹配的字段的行,如我们可以在一个用户的数据库中查找姓名中含有“静”字的所有记录,可以用like语句来实现。由于结果可能有多条记录,所以返回值好是存放Person对象的List。 sql = "SELECT id,name,password,age,email FROM person "+"WHERE name LIKE ? or email LIKE ?" ;
打印出Ibatis最终的SQL语句 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.logger.com.ibatis=debug log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug log4j.logger.java.sql.Connection=debug log4j.logger.java.sql.Statement=debug log4j.logger.java.sql.PreparedStatement=debug,stdout
摘要: 全注解SSH 一,hibernate annotation Class注解: 1. @Entity:表明当前类是一个持久化类 2. @Table(name="team",catalog="NBA"):映射一个表team,所对应的数据库是NBA,可以省略 字段属性注解: 1. @GenericGenerator(name = "genera...
阅读全文
摘要: 在常见用法中,集合(collection)和数学上直观的集(set)的概念是相同的。 集是一个唯一项组,也就是说组中没有重复项。实际上,“集合框架”包含了一个 Set 接口和许多具体的 Set 类。但正式的集概念却比 Java 技术提前了一个世纪,那时英国数学家 George Boole 按逻辑正式的定义了集的概念。大部分人在小学时通过我们熟悉的维恩图引入的“集...
阅读全文
如何进入dos操作界面 开始键+R输入cmd回车 如何切换盘符 例:F:+enter这样就切换到F盘了,(C盘D盘E盘)同理。 1.进出文件夹 进入目录 cd 文件夹名 例:F:\>cd空格(文件夹名) F:\>cd (aa) F:\aa>cd (bb) F:\aa\bb>cd(cc) 2.录 cd .. 例:F:\aa\bb\cc>cd.. F:\aa\bb>cd.. F:\aa>cd.. F:> 3.清屏命令 cls 4.查看目录命令: 查看当前文件夹目录 dir 查看当前目录以及子目录中的所有文件 dir/s 分页查看当前目录以及子目录中的所有文件 dir/s/p 5. 创建文件夹 md空格(文件夹名字) 6.删除文件夹 rd 空格(文件夹名字) 7.建立一个 打不开 删不掉的文件夹 md\文件夹名字..\ 只能通过dos命令删除 rd\文件夹名字..\ 8.关机命令 shutdown空格-s空格-t(时间) 取消关机:shutdown空格-a 注销:shutdown空格-l 9.定时关机 At 12:00 shutdown –s 10:Copy 文件名1(带后缀) 文件名2(带后缀)
摘要: 1命名规范 1.1 package (*) 包名全部由小写的ASCII字母组成,用“.”分隔。 在此项目中,所有的包均以“com.prosten.ticket”开头。 1.2 class (*) 类名应当是名词,每个内部单词的头一个字母大写。应当使你的类名简单和具有说明性。用完整的英语单词或约定俗成的...
阅读全文