关于jdbc的缺点:

1.数据库链接创建释放频繁造成系统资源浪费从而影响系统性能。如果使用数据库连接池可以解决此问题。

2.sql语句在代码中硬编码,不利于维护,sql变动需要改变java代码

3.使用preparedStatement向占有位符号传参数存在硬编码,修改sql还要修改代码,系统不易维护

4.对结果集解析存在硬编码(查询列名),修改sql还要修改代码,系统不易维护。

(关于jdbc的具体操作,参见如下链接。)

而上述jdbc的缺点,MyBatis都很好的解决了。

MyBatis架构如下:

mybatis是一个持久层框架, 作用是跟数据库交互完成增删改查

mybaties是对jdbc的一个轻量级的封装,跟dbutils有一些像,不是orm框架,它是把sql语句放在xml文件里,然后去调用它。
sqlsessionfactory用来加载xml里面一些全局的东西,然后再创建sqlsession会话,利用此会话可以调用sql语句,执行sql语句的时候。

Mybaties内部会调用executor来执行。执行分为基本执行器和缓存执行器。

mappedstatement把里面的东西转换为对象。

先创建数据库,以下用user表做一个简单例子

下面开始创建工程

在这里我用的是myecplise.

1.创建java工程

2.jar包(分为核心包和依赖包)

Mybaties里所有的包都不允许替换。版本必须是以下指定的版本。不然会出错。

上面这个包是核心包,在github里可以下载。

以下为所有的jar包。

3.配置文件

创建的sourceFolder,取名为config,

sourceFolder的默认编译目录在MyBaties0606/bin

在config下创建配置文件:log4j.properties    MyBaties默认使用log4j作为输出日志信息

在config下创建SqlMapConfig.xml,在这里使用properties文件将数据库连接的一些信息保存下来了。

SqlMapConfig.xml是myBatis的核心配置文件,上边配置的内容只是一部分,后面还会配置。

在config下创建db.properties

4.po类

用在持久层,还可以再增加或者修改的时候,从页面直接传入action中,它里面的java bean 类名等于表名,
 属性名等于表的字段名,还有对应的get set方法。

在这里使用user类。(咳咳,忽略我的包名是pojo)

代码如下:

5.sql映射文件

在config目录下创建sql映射文件User.xml,以下为约束。

6.加载sql映射文件。

在SqlMapConfig,xml中,将User,xml添加进去。

以上把基础的环境都配置好了,

下面开始:MyBatis最原始的实现curd的操作

1.首先是查询操作,根据id查询用户信息。

  在User.xml中定义:

MyBatis的好处就是,将sql语句写在配置文件中,方便DBA优化sql语句。这一点上,由于hibernate封装的有点过,自动生成sql语句,导致sql语句没法优化。

下面是测试代码:

在这里用junit测试代码,输出结果如下:

1.1  根据用户名查询用户信息

同理,在user.xml中配置sql语句

注意:这里使用的是拼接符${},而不是占位符#{}。

拼接符和占位符的区别:、

#{}占位符,起占位作用,如果传入的是(String,long,double,int,boolean,float)等基本类型,那么#{}里面可以随便写。

#{}如果传入的是pojo类型,那么#{}中的变量名称必须 是pojo中对应的属性.属性.属性......

${}拼接符,字符串原样拼接,如果传入的参数是(String,long,double,int,boolean,float)等基本类型,那么${}里的值必须为value。但是注意:拼接符会有sql注入风险,需谨慎使用。

sql语句中,like后面一般跟的是拼接符,但其实,Like后面也可以跟占位符,只是like后面跟占位符了以后,如果进行如上例子的查询%value%时,需要在传入的参数上面手动加%,这样不太利于参数的传递。

测试程序:

在上例中,由于查询的结果可能不只是一条,于是用selectList进行查询,返回值为list类型。user.xml中配置的返回值参数类型为返回值list类型的泛型。

以下为运行结果:

以上是查询操作,

2.同理,插入操作也是一样的,现在user.xml中配置sql语句,然后再调用test方法进行插入。

在这里,传入的参数是一个po类型的user对象,所以占位符#{}中的变量名称为po中对应的属性。

测试代码:

mybatis会自动开启事务,但不知道何时提交,所以需要手动提交,不提交事务也能运行成功,但是数据插不到数据库里面。

运行结果:

2.1  需要返回自增主键的插入操作

(这里假设id为主键)

数据库中存在一条语句:select LAST_INSERT_ID()  ,可以返回自增的主键

于是我们只需要在正常的插入sql语句执行成功后,再执行一条返回自增主键的sql语句,就ok了。

于是我们可以这样写:

由于这里我的表结构设计的比较简陋,一共只有两个字段,当id变为主键时,插入语句只需要插入username的值就行。

test代码保持不变。只是多了一个int类型的返回值。返回值即为主键。

由于我这里的表结构没有主键,这里只是简单演示一下怎么做,没有运行结果。

3.删除操作

同理,配置删除的sql语句:

parameterType里可以传入完整的类名,也可以传入别名。

由于占位符中传入的是基本数据类型,这里的#{}里面可以随便写,为了规范起见,这里我写的是id。

下面为测试代码,同理,这个也需要提交

运行结果:

4.更新操作

同理~~懒得解释

测试代码~~然后~~记得提交~~

emmm,以上为最原始的myBaris的curd操作,重复的代码比较多,也比较麻烦。

稍微用拼凑的截图总结一下上述内容。(*^__^*) ……

MyBatis中还有两种方式,原始Dao开发方法和Mapper接口开发方法。详情见我的下一篇博客~~

MyBatis最原始的实现curd的操作的更多相关文章

  1. SpringBoot+Mybatis+MybatisPlus整合实现基本的CRUD操作

    SpringBoot+Mybatis+MybatisPlus整合实现基本的CRUD操作 1> 数据准备 -- 创建测试表 CREATE TABLE `tb_user` ( `id` ) NOT ...

  2. 初识Mybatis框架,实现增删改查等操作(动态拼接和动态修改)

    此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ...

  3. 初识Mybatis框架,实现增删改查等操作

    此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ...

  4. JDBC最原始的代码做查询操作

    首先编写一个User类. public class User { private String username; private String password; public String get ...

  5. 使用zookeeper自带的zkCli.sh客户端工具实现对zk的CURD常见操作详解

    一.zookeeper自带的 zkCli.sh 客户端工具 1. 应急和测试使用到的一个工具. 还有C# dirver java dirver (驱动)   二.driver的使用方式有两种 zkCl ...

  6. 【mybatis】service层中一个方法中使用mybatis进行数据库的 多个修改操作,可能是update也可能是delete操作,但是sql语句命名执行并且在控制台打印出来了,但是数据库中未更新到数据【事务的问题】

    问题描述: service层中一个方法中使用mybatis进行数据库的 多个修改操作,可能是update也可能是delete操作,但是sql语句命名执行并且在控制台打印出来了,但是数据库中未更新到数据 ...

  7. 零基础学习java------36---------xml,MyBatis,入门程序,CURD练习(#{}和${}区别,模糊查询,添加本地约束文件) 全局配置文件中常用属性 动态Sql(掌握)

    一. xml  1. 文档的声明 2. 文档的约束,规定了当前文件中有的标签(属性),并且规定了标签层级关系 其叫html文档而言,语法要求更严格,标签成对出现(不是的话会报错) 3. 作用:数据格式 ...

  8. 【mybatis深度历险系列】深入浅出mybatis中原始dao的开发和mapper代理开发

    使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法.mybatis在进行dao开发的时候,涉及到三姐妹,分别是SqlSessionFactoryBuilder ...

  9. Mybatis基础配置及增删查改操作

    一.简介 平时我们都用JDBC访问数据库,除了需要自己写SQL之外,还必须操作Connection, Statement, ResultSet 这些其实只是手段的辅助类. 不仅如此,访问不同的表,还会 ...

随机推荐

  1. arcgis raster clip and mask difference 栅格 提取 clip 和 mask 方法的区别

    建议使用 数据管理工具下的此工具进行操作: 在选择参数时,注意做如下选择,可以保证栅格不会轻微错开: 也就是勾选第一个,而不勾选第二个 看看效果,使用mask得到的裁剪结果,注意有错开现象: 使用cl ...

  2. Jenkins 配置邮件通知步骤

    Jenkins 配置邮件通知前言 可以在Jenkins 中配置邮件通知,比如在构建失败时发送邮件通知项目组来及时修复问题. Jenkins 邮件通知功能的插件主要包括: Mailer Plugin ( ...

  3. springboot 返回json字符串格式化问题

    在idea中yml文件中添加以下注解就可以格式化json字符串效果 spring: jackson: serialization: indent-output: true 原返回json格式为: {& ...

  4. gpu相关

    1.查看cuda版本 cat /usr/local/cuda/version.txt 2.查看cudnn版本 cat /usr/local/cuda/include/cudnn.h | grep CU ...

  5. c# 多线程简化

    编译器自动推断出ParameterizedThreadStart委托,因为Go方法接收一个单独的object参数,就像这样写: 1 2 Thread t = new Thread (new Param ...

  6. Spring教程笔记(3)

    getBean() ApplicationContext接口获取Bean方法简介: • Object getBean(String name) 根据名称返回一个Bean,客户端需要自己进行类型转换: ...

  7. 2018 ACM-ICPC青岛现场赛 B题 Kawa Exam 题解 ZOJ 4059

    题意:BaoBao正在进行在线考试(都是选择题),每个题都有唯一的一个正确答案,但是考试系统有m个bug(就是有m个限制),每个bug表示为第u个问题和第v个问题你必须选择相同的选项,题目问你,如果你 ...

  8. 此博客不再更新和分享UiPath文章

    由于版权问题,将不再分享我的笔记 警告:任何人不得拷贝及挪用我的uipath笔记作为商业用途,一旦发现,立刻发律师函,请知悉及慎重!!!!

  9. PIL库的运用

    PIL库学习及运用 1.库的介绍Python Imaging Library,简称PIL python图像处理库,这个库支持多种文件格式,并提供了强大的图像处理和图形处理能力. 下面是我的学习笔记 首 ...

  10. WMI设置有线网卡IP地址

    一.通过WMI获取物理适配器序号 NetEnabled: 是否启用了适配器,True为启用,False为禁用;PhysicalAdapter: 适配器是否物理或逻辑适配器,True为物理,False为 ...