1、什么是Maven?请描述中clean、compile、test、package、install、deploy这几个命令的作用。 Maven是一款帮组程序员构建项目的工具,我们只需要告诉Maven需要哪些jar包,它会帮组我们下载所有的jar包,极大的提升开发效率; clean:删除target文件夹,相当于清除缓存; complie:编译maven项目,并生成target文件夹(将java源文件编译成class文件); test:运行test目录下的测试文件,即测试; package:将项目打包,默认打包为jar格式,也可以打包成war格式用于服务器运行; install:将打包的jar文件安装到maven本地仓库,供其它项目使用; deploy:将maven的web项目部署到远程服务器上
2、请描述MyBatis框架的优缺点。 优点: 1、 与JDBC相比,减少了50%以上的代码量; 2、最简单的持久化框架、小巧简单易学; 3、SQL代码从程序代码中彻底分离出来,可重用; 4、 提供XML标签,支持编写动态SQL; 5、 提供映射标签,支持对象与数据库的ORM字段关系映射; 缺点: 1、 SQL语句编写工作量大,熟练度要高; 2、数据库移植性差,比如mysql移植到Orecle,SQL语句会有差异从而引起err;
3、MyBatis中#{}和${}的区别是什么? #{}: 1、#{}是预编译处理,能防止sql注入,提高系统安全性; 2、mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值; 3、将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号(列如: update t_student set s_adress = #{param}; 若param 传入 北京,则解析的sql为: update t_student set s_adress = "北京"; ) ${}: 1、$ {}是字符串替换(非预编译),不能防止sql注入; 2、mybatis在处理 $ { } 时,就是把 ${ } 替换成变量的值; 3、传递的参数会被当成sql语句中的一部分,比如传递表名,列名(列如: select * from ${param1} order by ${param2}; 若param1 传入 t_student,param2 传入 s_id,则解析的sql为: select * from t_student order by s_id; ) 总结: 1、 为了安全,能用#的地方就用#方式传参,这样可以有效的防止sql注入攻击; 2、关于预编译机制:预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。 4、通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗? Dao接口的工作原理: Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回; 总结: 1、Dao接口就是人们常说的Mapper接口; 2、接口的全限名,就是映射文件中的namespace的值; 3、接口的方法名,就是映射文件中MappedStatement 的id值,接口方法内的参数,就是传递给sql的参数; 4、在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MappedStatement对象; 5、Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement;
方法能重载吗? Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略; 参考链接:http://qingmei.co/interview/10023/question/100326.html 5、什么是MyBatis的一级、二级缓存? 什么是缓存(cache): Cache是高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问。在Java中简单的理解缓存就是实现数据的拷贝,提高系统性能,减少数据库压力。 缓存(cache)的作用: 如果使用了缓存,在缓存中有需要的数据,就不用从数据库中获取转而从缓存中获取,这样就大大提高了系统性能。 一级缓存: 1、Mybatis的一级缓存不需要任何配置,在每一个 SqlSession 当中都有一个一级缓存区,作用范围是 SqlSession ; 2、sqlSession 去执行插入、更新、删除(执行commit操作)就会清空SqlSession 中的一级缓存,这样做的目的为了让缓存存储的是最新的信息,避免脏读; 3、当第二次发起查询用户 ID 为1的用户信息,先去找缓存中是否有 ID 为1的用户信息,如果缓存中有则直接从缓存中获取用户信息。 二级缓存: 1、Mybatis 的二级缓存需要手动开启才能启动,与一级缓存的最大区别就在于二级缓存的作用范围比一级缓存大,二级缓存是多个 sqlSession 可以共享一个 Mapper 的二级缓存区域,二级缓存作用的范围是 Mapper 中的同一个命名空间(namespace)的 statement 。在配置文件默认开启了二级缓存的情况下,如果每一个 namespace 都开启了二级缓存,则都对应有一个二级缓存区,同一个 namespace 共用一个二级缓存区; 2、手动开启二级缓存? 第一个需要配置的地方是配置文件 SqlMapConfig.xml。(可以省略,因为它默认是开启的,配置的目的是方便维护); 第二个是 Mapper 文件,在需要开启二级缓存的 statement 的命名空间(namespace)中配置标签<cache/>