发表于: 2020-05-03 23:19:48

1 1488


1.Mybatis有哪些常用标签?怎么使用标签来完成动态查询?

以下内容来自 mybatis 文档:https://mybatis.org/mybatis-3/zh/dynamic-sql.html

常用标签:
  • if

  • choose ( when, otherwise)

  • trim ( where, set)

  • foreach


(a)if

这是很常用的标签,但是通常和 where 等标签一起使用,这里简单写一下单独使用的情况

<select id="findActiveBlogLike"     resultType="Blog">
    SELECT * FROM BLOG
    WHERE state = ‘ACTIVE’
    <if test="title != null">
        AND title like #{title}
     </if>
     <if test="author != null and author.name != null">
        AND author_name like #{author.name}
     </if>
</select>


(b)choose where otherwise

<select id="findActiveBlogLike"     resultType="Blog">
 SELECT * FROM BLOG
 WHERE state = ‘ACTIVE’
  <choose>
   <when test="title != null">
     AND title like #{title}
    </when>
   <when test="author != null and author.name != null">
     AND author_name like #{author.name}
    </when>
   <otherwise>
     AND featured = 1
    </otherwise>
 </choose>
</select>

(c)trim where set

这些标签一般与 if 标签搭配使用

上面的标签都无法解决一个情况:任意选择想查询的字段或不选择任何字段。

仅使用 if 标签(查询失败):

SELECT * FROM BLOG
WHERE

仅使用 choose where otherwise 标签(查询失败):

SELECT * FROM BLOG
WHERE
AND title like someTitle


这时,我们可以使用 where 标签:

<select id="findActiveBlogLike"     resultType="Blog">
 SELECT * FROM BLOG
  <where>
   <if test="state != null">
        state = #{state}
    </if>
   <if test="title != null">
       AND title like #{title}
    </if>
   <if test="author != null and author.name != null">
       AND author_name like #{author.name}
    </if>
 </where>
</select>

where 标签中,会自动去掉拼接后 sql 语句最前面的 AND。


或者我们可以使用 trim 标签自定义一个 where 标签(以下标签与 where 标签等价):

<trim prefix="WHERE" prefixOverrides="AND |OR ">
 ...
</trim>


trim 标签有几个特殊属性:

prefix 增加指定的前缀文本

prefixOverrides 属性会去掉指定的前缀文本

suffix 增加指定后缀文本

suffixOverrides 去除指定的后缀文本


set 语句用于包含需要更新的字段

<update id="updateAuthorIfNecessary">
 update Author
    <set>
     <if test="username != null">username=#{username},</if>
     <if test="password != null">password=#{password},</if>
     <if test="email != null">email=#{email},</if>
     <if test="bio != null">bio=#{bio}</if>
   </set>  
where id=#{id}
</update>

set 标签中,会自动去掉拼接后的 sql 中最后面的逗号。


等价的 trim 表达如下:

<trim prefix="SET" suffixOverrides=",">
 ...
</trim>


(d)foreach

foreach 用于对集合进行遍历(尤其是构建 IN 语句的时候)

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
     open="(" separator="," close=")">
       #{item}
  </foreach>
</select>

foreach 非常强大,可以让我们指定一个集合(任何可以迭代的对象Map,List,set 等),声明可以在元素体内使用的集合项(item)和索引(index)变量。

index 是当前迭代的序号,item 是本次迭代获取到的元素。


2.什么叫反射?反射的坏处是什么?有哪些反射的应用场景?

反射是指程序可以访问,检测和修改本身状态或者行为的一种能力。

在 java 语言中,反射是指在 java 运行时:

1.给定的一个 class 对象,通过反射获取这个 class 对象的所有成员结构

2.给定一个具体的对象,能够动态的调用它的方法以及对任意属性值进行获取和赋值


这种动态获取类的内容,创建对象,以及动态调用对象的方法及操作属性的机制为反射,集是该对象的类型在编译期间是未知,该类的 .class 文件不存在,也可以通过反射直接创建对象


优势:

增加程序的灵活性,避免将固有的逻辑程序写死

代码简洁,可读性强,可以提高代码的复用率


劣势:

相较于直接调用,在大量的情境下反射性能下降

存在一些内部暴露和安全隐患


应用场景:

1. JDBC 的数据库连接

使用 Class.forName() 来加载驱动


2.Spring 框架的使用

通过 xml 配置来装载 Bean 的过程,解析 xml 或者 properties 里面的内容,获取对应的实体类字节码字符串以及相应的属性,使用反射机制获取某个 class 的实例



3.什么是SVN,小乌龟是什么,SVN的文件版本号是怎么来的,哪些文件应该上传到SVN,哪些不该上传?Git和SVN的区别又是什么? 

Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。


TortoiseSVN(小乌龟) 是 Subversion 版本控制系统的一个免费开源客户端。


SVN 中任意多文件与目录的修改作为一次原子操作,每接收到一次提交都会为文件系统创建一个新状态叫做一个版本号,后一个版本号比前一个大 1,初始版本号为 0。


GIT:

分布式存储,每个开发人员本地都有一份克隆,可以断网工作,联网推送到服务器。

按照元数据的方式存储,每一份克隆都有历史版本信息。

版本号是按照文件的内容或者目录计算出的 SHA-1 哈希值,全球唯一,只有发生改变的文件和目录才会更新版本号,没有一个全局版本号。

git 下一旦克隆,那么所有的代码和历史都会被他人知道,不可以分别设置权限。

git 采用哈希值确定版本号,同时也可以确保内容的完整,一旦发生篡改能够及时发现。


SVN:

集中存放在服务器,只能联网工作。

按照版本存放代码,里面没有历史版本信息。

版本号可以推测,全局唯一,无论文件有无更新,每次推送都会更新版本号。

可以按照目录设置权限,安全性更好。

GUI 工具更加友好。


4.什么是AOP,适用于哪些场景,AOP的实现方案有哪些?

AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。


适用场景:

记录日志

监控方法运行时间

权限控制

事务管理


实现方案:

静态 AOP(AspectJ)在编译的时候将 AOP 逻辑织入到代码中,需要专有的编译器与织入器。

优点:完成后织入的代码不影响性能

缺点:不够灵活


动态 AOP(JDK 动态代理)在运行期,目标类加载后,为接口动态生成代理类,将切面植入到代理类中。


动态字节码生成:在运行期,目标类加载后,动态构建字节码文件生成目标类的子类,将切面逻辑加入到子类中。

优点:没有接口也可以织入,灵活

缺点:扩展类的实例方法为 final 的时候无法织入代码


自定义类加载器:在运行前,目标加载前,将切面逻辑加到目标字节码中。

可以考虑javassist来实现。Javassist 是一个编辑字节码的框架,可以让你很简单地操作字节码。它可以在运行期定义或修改Class。使用Javassist实现AOP的原理是在字节码加载前直接修改需要切入的方法。

优点:可以对对大部分类织入

缺点:如果用了其他的类加载器则这些类无法织入



5.Map,List,Array,Set之间的关系是什么,分别适用于哪些场景,集合大家族还有哪些常见的类?


Array 数组是固定长度的,并且只能存放同一类型的数据。Java 集合可以存储与操作一组数目不固定的数据,所有的 java 集合类都位于 java.util 包中,并且只能存放引用类型的数据,不能存放基本数据类型。


集合实际上是对数组的扩展,


常见的接口:

Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法。 Set 和List 都继承了Conllection。

Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。

List的特征是其元素以线性方式存储,集合中可以存放重复对象,有顺序。

Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口。从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。



明天的计划:

继续完成深度思考。(应该慢工出细活还是囫囵吞枣呢?)



返回列表 返回列表
评论

    分享到