JDBC连接池原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jnshu_it/article/details/84133990

这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

【JDBC连接池原理】

大家好,我是IT修真院西安分院第4期的JAVA学员,一枚正直纯洁善良的JAVA程序员。今天给大家分享一下,修真院官网Java任务1,深度思考中的知识点JDBC连接池原理

一、.背景介绍

      mybatis是什么? 说起用JDBC访问数据库,除了需要自己写SQL之外,还要操作Connection, Statment, ResultSet 这些手辅助性质的代码; 访问不同的表,还会写很多雷同的代码,繁琐和枯燥。 而用Mybatis,只需要提供关键性的SQL语句,其他的工作,像加载驱动,建立连接,Statement, JDBC相关的一些动作交给Mybatis,减少重复性的工作,更多的关注在增删改查等操作层面上, 把技术细节封装在底层

        MyBatis在实际开发中,数据库的查询很难一蹴而就, 我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时, mybatis给我们提供了动态SQL,可以让我们根据具体的业务逻辑来拼接不同的SQL语句。 OK,那么我们今天就来看看如何使用mybatis中的动态SQL。

        

二、知识剖析

2.知识剖析

mybatis中的动态SQL中的主要元素

1、 if 是mybatis动态SQL中的判断元素,这个有点类似于Java中的if语句,不同的是这里的if一般常常和test配合使用。

当用户传入的address不为null或者空字符串的时候,我就加上一个where条件,否则就什么条件都不加入。

2、 choose有点类似于Java中的switch,常常配合when和otherwise一起来使用。在查询条件中,如果用户传来了id,那么我就查询该id的数据,如果用户传来了address,那么我就我们添加address的查询条件,如果用户传来了username, 那么我就添加username的查询条件,最后如果用户任何一个查询条件都没有添加进来,那么默认查询条件就是查询id小于10的所有数据。

3 、在上面的案例中小伙伴们可能都发现了一个问题,就是我们在添加查询条件的时候,在查询条件之前都先添加了where 1=1, 然后后面直接在这之后再追加and什么什么的,那么每次这样来写显然有点麻烦,有没有简单一点的方案呢?当然有,我们可以通过where元素,只有where元素中有条件成立,才会将where关键字组装到SQL中,这样就比前一种方式简单许多

4、 trim有点元素替换的意思,还是上面的案例,我们可以将and替换为where,

set是我们在更新表的时候使用的元素,通过set元素,我们可以逐字段的修改一条数据 在set元素中,如果遇到了逗号,系统会自动将之去除

5、foreach元素用来遍历集合,比如我想查询多个城市的人,我的sql语句可能是这样SELECT * FROM user2 WHERE address IN('西安','北京'),我在查询的时候可能只是传入了一个list集合,该集合中有西安和北京两个查询条件,那我如何将这个集合组装成一个sql语句呢?

6、collection表示传入的参数中集合的名称,index表示是当前元素在集合中的下标,open和close则表示如何将集合中的数据包装起来,separator表示分隔符,item则表示循环时的当前元素。这样一段配置最终组合成的sql就是SELECT * FROM user2 WHERE address IN('西安','北京')。

7、bind使用bind元素我们可以预先定义一些变量,然后在查询语句中使用

三、常见问题 

1、在使用MyBatis的动态SQL功能时,可能会出现单参数方法不执行或者抛出该属性没有get、set方法的异常

2 、choose标签 没有else标签.

3 、使用set标签 if语句中id=null时系统出现异常 UPDATE TABLE SET id= #{id,jdbcType=INTEGER} ,name = #{name,jdbcType=VARCHAR} where id = #{id,jdbcType=INTEGER}

四、解决方案解决方案

1 在Mapper接口中通过 @Param 来标记该参数即可

2 可以使用when otherwise标签来达到类似于if .... else...foreach标签 select * from tables where id in(3,6,...);要么3,要么6,...

3 节点标签:trim主要功能是可以在Trim包含的内容前加上某些前缀(prefix),也可以在Trim包含的内容之后加上某些后缀(suffix)还可以把Trim包含内容的首部的某些内容忽略掉(prefixOverrides) ,也可以把Trim包含的内容的尾部的某些内容忽略掉(suffixOverrides)utm_source=copy方法2:把更新条件标签内的内容,放在标签中

五、编码实战

```

public class Man implements Human { 

private QQCar car; public Man() { 

this.car = new QQCar(); } 

@Override public void xiabibi() { } 

public void driveCar(){ car.drive(); } }

```

接口Car暂有两个实现:奔驰车和QQ车,在以上Man类和QQCar类高度耦合的代码中,老司机通过构造器只创建了QQ车对象,所以只能开QQ车,那么老司机想开奔驰怎么办呢,你让他重新创建奔驰车的对象吗?这样高度耦合的代码似乎是毫无办法的,那么,我们通过注入对象的方式对上述代码做一番改进:

```

public class Man implements Human {

 private Car car; public Man(Car car) { this.car = car; }

  @Override public void xiabibi() { } public void driveCar() { car.drive(); }

   }

```

以上代码根据多态特性,通过构造器接口注入的方式屏蔽掉了具体的对象实现,这样,老司机就能想开什么车就开什么车了。这就是依赖注入带来的好处。

六、扩展思考

1 动态SQL还有哪种实现方式?

2 不同版本mybaits使用动态SQL时的差别?

七、参考文献

http://blog.csdn.net/jpzhu16/article/details/52810747

https://www.cnblogs.com/dongying/p/4092662.html

https://www.cnblogs.com/zkongbai/p/5336015.html

http://how2j.cn/k/mybatis/mybatis-tutorial/1087.html?p=13495

八、更多讨论

1 动态SQL还有哪种实现方式?

还可以使用注解的方式去实现动态SQL、脚本sql、在方法中构建sql、结构化SQL

2 动态SQL中,List传值错误,有时要对批量数据进行处理,难免会使用list做为参数

```

@SelectProvider(type = UserDaoProvider.class, method = "find")  

    public List<Map> find(List list);      

    class UserDaoProvider {  

        public String find(List list) {  

```

这是一个最简单的list传参,但是在运行时会报传参错误。这是mybatis内部机制造成的,其参数需要是key/value结构,当遇到这里不是key/value结构的list时,mybatis会自己把它转换成key/value结构,key就是他的名字"list",value就是他的值List,要正确传参需要使用key/value结构的map,如下

```

@SelectProvider(type = UserDaoProvider.class, method = "find")  

    public List<Map> find(List list);      

    class UserDaoProvider {  

        public String find(Map map) {  

            List list = (List) map.get("list");  

```

3mybatis对动态sql语句的解析过程?

推荐这篇文章,讲的很详细,通过解析源码来分析的

http://www.importnew.com/24160.html

九 鸣谢:

感谢XX、XX师兄,此教程是在他们之前技术分享的基础上完善而成。

十 结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

PPT链接 视频链接

更多内容,可以加入IT交流群565734203与大家一起讨论交流

这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地

猜你喜欢

转载自blog.csdn.net/jnshu_it/article/details/84133990