发表于: 2018-03-25 22:02:50

1 487


今天完成的事:

  继续学习了动态sql语句:

Choose标签:

如果我们只想从所有条件中择其一二,可采用choose元素。Choose相当于java语言中的switchChoose的用法和javaswitch类似,按照顺序执行,当when中有条件满足时,则跳出choose,所以在whenotherwise中只会输出一个,当所有when的条件都不满足就输出otherwise的内容。

name有参数的时候用name搜索,没有的话判断price是否有参数,有的话以price搜索,二者都没有的话,以最后一个id>1为条件进行搜索

这里可以看到前两句赋值语句被注释了

结果就是按照第三个条件进行了搜索,id为1的数据没有显示,大于1的显示了出来。

Set标签:

where标签类似的,在update语句里也会碰到多个字段相关的问题。在这种情况下,就可以使用set标签。

这里的话其实跟where的作用是相近的,name没有属性的时候,直接跳过,值也就不会被更改

这里是把id为6的price数据改为99.99

结果也是如此,name的数据没有被更改

Trim标签:

此为格式化标签,可以与其他标签完成where和set的功能

Profix 前缀增加  suffix 后缀增加  prefixOverrides自动判断前置 suffixOverrides自动判断后置

与上面的set语句对比,prefix=set是为sql语句设置前缀,suffixOverrides是自动判断后缀,,suffix=where id =#{id}是自动再加上后缀 ,最后的效果也是一样的。如果是代替where语句话,trim就会自动的添加前缀where和自动识别和去掉不用的and|or

Foreach标签:

Foreach主要用在构建in条件中,它可以在sql语句中进行迭代一个集合。Foreach元素的属性主要有item,index,collection,open,separator,close。Item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有以下三种情况:

1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

2. 如果传入的是单参数且参数类型是一个array数组的时候,collection属性值为array

如果传入的参数是多个的时候,在breast里面也是会把它封装成一个Map的,mapkey就是参数名,所以这个时候collection属性值就是传入的listarray对象在自己的封装的map里面的key

大致意思就是把list中的id相对应的元素提取出来

id分别去了1,3,5

结果也完美的验证了

之后我又了解到动态sql语句是基于OGNL表达式的。所以就去查了OGNL的一些信息:OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。从语言角度来说:它是一个功能强大的表达式语言,用来获取和设置 java 对象的属性 ,它旨在提供一个更高抽象度语法来对 java 对象图进行导航。另外,java 中很多可以做的事情,也可以使用 OGNL 来完成,例如:列表映射和选择。对于开发者来说,使用 OGNL,可以用简洁的语法来完成对 java 对象的导航。通常来说:通过一个“路径”来完成对象信息的导航,这个“路径”可以是到 java bean 的某个属性,或者集合中的某个索引的对象,等等,而不是直接使用 get 或者 set 方法来完成。(来自:http://www.cnblogs.com/renchunxiao/p/3423299.html)看过之后也只是有了个大概的了解

后面我还去找了数据池的一些资料:

最原始的数据库使用就是打开一个连接并进行使用,使用过后一定要关闭连接释放资源。由于频繁的打开和关闭连接对jvm包括数据库都有一定的资源负荷,尤其是应用压力较大时资源占用比较多容易产生性能问题。由此使用连接池的作用就显现出来,他的原理其实不复杂:先打开一定数量的数据库连接,当使用的时候分配个调用者,调用完毕后返回给连接池,注意返回给连接池后这些连接并不会关闭,而是准备给下一个调用者进行分配。由此可以看出连接池节省了大量的数据库连接打开和关闭的动作,对系统性能提升的益处不言而喻。

这里面还有集合概念:

最大维持连接数:没有任何请求时在连接池种可以存在的连接数

最大连接数:连接池中最多可以存在的连接个数

最大等待时间:当断开连接时,超过最大维持连接数的连接不会马上销毁,最大等待时间过后它才会销毁。

举个例子:最大维持连接数是10,最大连接数是20,最大等待时间是10000(毫秒)

过程如下:最开始在连接池中有10个(最大连接数),当有用户申请连接时,将一个连接分配给用户,直到连接池中的10个连接全都分配出去,当第11个用户申请时,它将创建第11个连接并分配给该用户,知道把第20个连接(最大连接数)分配给第20名用户,当第21个用户申请连接时,他就需要等待,知道前面的20个用户的某一个断开了连接,才会把那个连接分配给第21名用户,当用户断开连接时(第11至第20个连接),该连接不会立刻被释放而是需要等待10000毫秒(最大等待时间),才被释放,当没有用户连接时,连接池内还保持10个连接。

在开发中,使用连接池时若没有关闭连接(调用连接的close方法)会出现连接池疲劳的错误


明天计划的事:

    学习junit相关事宜


遇到的问题:

   在学习set标签的时候,如果后一句没有参数的话,不管数据库那边有没有数据,最后显示的数据会是0,数据库的值也更改为了0


后来感觉xml文件的代码有点问题,就试着改了以下

变更为

差距就是在test=""里面增加了“and  name=‘ ’  ”,然后即便那边的price代码注释掉,最后显示的结果也是正常的,没有变为0,具体的原因我也没弄懂



收获:

    了解到了数据池的作用,越来越觉得之前的大牛们的智慧真是太强大了





返回列表 返回列表
评论

    分享到