maven、mybais、mapper、${}、#{}、cache

it2025-07-18  14

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/>

最新回复(0)