学习了hibernate这个持久层框架之后,在来学习Mybatis简直是无压力,因为Mybatis入门门栏很低,如果学习过了hibernate的话,对于Mybatis的学习很简单了,如果没学习过hibernate直接学习Mybatis也没关系,也很好理解。

      写Mybatis这一章节博客,大致分为这样一种思路 

        mybatis入门  -->  全局配置文件和映射文件详解  --> 高级映射(一对一,一对多,多对多) -->延迟加载机制  -->一级缓存,二级缓存(整合ehcache) --> spring整合mybatis --> 逆向工程

      如果你想直接查看mybatis的标准helloworld,那么跳过这章,看第二章。

一、Mybatis的简介

      mybatis封装了jdbc的持久层框架,前身为ibatis,在配置文件中编写sql,是不完全orm映射框架。

      查看百度百科的介绍

            

       1、支持普通sql查询

       2、高级映射

       3、存储过程

         4、消除了几乎所有jdbc代码和参数的手工设置以及结果集的检索,等等特点,都会讲解到,今天先认识一下为什么说mybatis消除了所有jdbc代码和参数的设置,通过普通的jdbc有哪些不足,从而认识到mybatis的好处。

二、分析jdbc的问题

              

         //1、注册驱动,什么是驱动?能够让java连接数据库,也就是实现jdbc接口规范就是驱动
Class.forName("com.mysql.jdbc.Driver");//硬编码
/*
* 2、通过驱动管理者获取数据库连接
* DriverManager是驱动实现类的管理者。
* url:连接数据库的位置,端口号,数据库名
* jdbc:mysql://localhost:3306/test_01
*/
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_1", "root", "root");//(硬编码)
/*
* 3、获得sql语句执行者
* statement:执行sql语句对象
* sql语句必须是完整的。
* preparedStatement:预处理(常用)
* sql语句可以不是完整的,可以将参数用?替代,然后在预编译后加入未知参数
*
*/
//定义sql语句,?表示占位符
String sql = "select * from user where id = ?"; //硬编码
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 1); //硬编码
//4、获取sql语句执行结果,resultset
/*
* executeQuery():查询操作
* executeUpdate():增删改操作
*/
ResultSet rs= ps.executeQuery();
//5、处理结果
while(rs.next()){
System.out.println(rs.getInt(1));;//index代表第几列,从1开始
} //6、关闭连接
rs.close();
ps.close();
conn.close();

        

        这种方式的缺陷

          1、创建连接存在硬编码

          2、执行statement时存在硬编码

          3、频繁的开闭数据库连接,会影响数据库的性能。

        现在就对这个所产生的问题与使用mybatis进行对比。

三、初级的mybatis

      跟hibernate一样,也是需要拥有两个配置文件,

          全局配置文件  和  映射文件,在编写这两个映射文件之前,必须创建mybatis环境(jar包等)

      创建java工程

      3.1、jar包

          mysql(1)

            

          Mybatis(1个核心包+9个依赖包)

              

          总共11个jar

                 

      3.2、初始化数据库脚本

          暂时只需要一张表  id是自增的,为主键

                

      3.3、添加log4j.properties

                

                

            该内容可以在mybatis的jar包中找到

                

 # Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

      3.4、全局配置文件

          建议使用sqlMapConfig.xml,内容如下

            

          此次的配置

            

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--
属性
<properties></properties>
全局参数设置
<settings></settings>
类型别名
<typeAliases></typeAliases>
类型处理器
<typeHandles></typeHandles>
对象工厂
<objectFactory></objectFactory>
插件
<plugins></plugins>
以上属性在后边会详细讲解到,现在我们就只需要关注一下下面的配置即可
如下所配置的就是使用这点东西。
environments(环境信息集合)
environment(单个环境信息)
transactionManager(事物)
dataSource(数据源)
environment
environments
mappers(映射器)
--> <!-- 配置mybatis的环境信息 -->
<environments default="development">
<environment id="development">
<!-- 配置JDBC事务控制,由mybatis进行管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源,采用dbcp连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test_1?useUnicode=true&amp;characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 加载mapper映射文件 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>

      3.5、映射文件和操作

            User.xml  暂时这样取。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:命名空间,对sql进行一个分类管理 -->
<!-- 注意:namespace在mapper代理时,具有重要且特殊的作用 -->
<mapper namespace="test">
//编写映射条件,也就是下面的
</mapper>

User.xml

            该映射文件是为了解决jdbc中statement的硬编码的问题,所以,在此映射文件中,只需要指定输入参数类型,返回结果参数类型,sql语句等就差不多了,也就是将原本jdbc所遇到的硬编码问题全部是使用xml配置文件来替代,有什么需要就修改配置文件即可,现在来看看该映射文件是如何编写的。

            通过增删改查这四个操作来讲解。

            3.6.1、查询 按id查询出user对象  注意看下面的注释

                

     <!--
使用id进行查询
查询,使用select来表示一个查询的statement,相当于statement.executeQuery
id:表示该statement唯一标识
parameterType:输入参数类型
resultType:输出参数类型,使用的是User类,则会将查询出来的记录封装到该类中
#{id}:使用#{}接收输入的参数,其中的"id"属性名任意,可以为uid,也可以为别的。
-->
<select id="findUserById" parameterType="java.lang.Integer" resultType="com.wuhao.mybatis.domain.User">
SELECT * FROM user WHERE id= #{id}
</select>

            操作

              

     //根据用户id进行查询。findUserById
@Test
public void test() throws IOException{
//跟hibernate一样,需要获取一大堆东西
// 1、读取配置文件
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 2、根据配置文件创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 3、SqlSessionFactory创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4、SqlSession执行statement,并返回映射结果 /*
* test.findUserById:在映射配置文件中,mapper的namespace为test,
* 其中有一个select,也就代表查询的statement。
* 1:输入参数为1
* 返回的结果类型为User
*/
User user = sqlSession.selectOne("test.findUserById", 1);
System.out.println(user); //5、关闭sqlsession资源
sqlSession.close();
}

          3.6.2、查询, 模糊查询,对username字段进行模糊查询

              user.xml映射文件

                

              操作

                

            3.6.3、增加User, insert

               user.xml,insert操作,对主键id有几种不同的处理方式,具体看下图的解释

                    

                操作

                  

                3.6.4、删除 delete

                  映射文件

                    

                  操作

                      

                3.6.5、更新 update

                  映射文件

                      

                  操作

                          

          小总结:编写了最基础的全局配置文件和映射文件。

                全局配置文件:连接数据库所需要的帐号密码等属性,事务等操作

                映射文件:通过对比原始jdbc连接数据库,其实mybatis中的映射文件就是对statement的硬编码进行改进,我们配置的都市statement需要的东西

                      sql语句、输入参数类型代替sql语句中的占位符,输出参数类型表示输出结果,都可以对应着statement的操作

                      parameterType:指定输入参数的java类型,可以填写别名或Java类的全限定名。别名的用法在详细讲解全局配置文件的时候会讲解到,在那边可以配置

                      resultType:指定输出结果的java类型,可以填写别名或Java类的全限定名。

                      #{}和${}的用法

                         #{}:相当于预处理中的占位符?

                            #{}里面的参数表示接收java输入参数的名称

                            #{}可以接受HashMap、简单类型、POJO类型的参数

                              简单类型:#{}里面可以是value,可以是任意值

                              POJO类型的参数:必须是POJO中的属性名

                              hashmap:key值名                        

                         ${}:相当于拼接SQL串,对传入的值不做任何解释的原样输出。

                            ${}会引起SQL注入,所以要谨慎使用。

                            ${}可以接受HashMap、简单类型、POJO类型的参数。

                              当接受简单类型的参数时,${}里面只能是value。

                sqlSession操作时selectOne和selectList  

                    selectOne:只能查询0或1条记录,大于1条记录的话,会报错   

                          

                    selectList:可以查询0或N条记录

 

                对于增删改操作,切记需要commmit操作才能够生效。

              

四、开发dao的方式

        上面我们就单纯测试了使用mybatis对数据库的增删改查操作,在开发中,我们都是开发dao接口和dao实现类,那么就在dao实现类中调用sqlsession的方法对数据库的增删改差操作即可。

        4.1、dao接口

            

        4.2、daoImpl 实现类

              

        4.3、测试

              

        小总结:

            这样开发有一个不好的地方,就是不能够直接使用dao接口中的方法,而是使用的sqlSession中的方法,这样让人不能一目了然,所以我们在开发中都不使用这种方式进行开发,而是使用Mapper代理的方式,什么意思呢?接下来讲讲。

五、Mapper代理开发的方式

        Mapper代理开发方式就是开发mapper接口(相当于dao接口)

          1、mapper接口的全限定名要和mapper映射文件的namespace一致

          2、mapper接口的方法名称要和mapper映射文件的statement的id一致

          3、mapper接口的方法参数类型要和mapper映射文件的statement的parameterType一致

          4、mapper接口的方法返回值类型要和 mapper映射文件的statement的resultType一致

        这样直接看肯定不好理解,所以直接上代码。

        三样东西,mapper接口,两个配置文件,一个全局配置文件,一个映射文件,但是这个映射文件就有要求了,除了上面所说的四点之外,另外一点也最好遵循,这里用不到,但是后面会讲解为什么会这样使用,就是mapper接口的名称要和映射文件的名称相同,

            mapper接口,UserMapper.java

                  

            映射文件,UserMapper.xml

                               

            全局配置文件。sqlMapConfig.xml

               其他都跟上面一样,重点讲一下这个mappers加载映射文件的问题,为什么需要mapper接口和映射文件同名,并且放入同一目录下

                     

               为了方便批量加载映射文件。而使用这种方式,前提条件就是接口和映射文件同名并且放入同一目录下。

            测试

                

                直接调用方法名即可

六、总结

       mybatis的基本用法就是这样,我想大家应该都有点感觉了,就是在映射文件中编写statement,将输入参数和输出结果进行映射,所以说mybatis是不完全映射的框架。懂了基本的用法之后,那么之后就会详细讲解其中的问题,全局配置文件当中的配置,映射文件中的详细配置(高级映射),延迟加载,一级缓存二级缓存等用法。

Mybatis(一) mybatis入门的更多相关文章

  1. MyBatis(1)——快速入门

    MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...

  2. 【mybatis深度历险系列】mybatis的框架原理+入门程序解析

    在前面的博文中,小编介绍了springmvc的相关知识点,在今天这篇博文中,小编将介绍一下mybatis的框架原理,以及mybatis的入门程序,实现用户的增删改查,她有什么优缺点以及mybatis和 ...

  3. mybatis的快速入门

    说明: 在这个部分,会写个简单的入门案例. 然后,会重新写一个,更加严格的程序案例. 一:案例一 1.最终的目录结构 2.新建一个普通的Java项目,并新建lib 在项目名上右键,不是src. 3.导 ...

  4. (转) MyBatis(1)——快速入门

    MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...

  5. Spring MVC+Spring+Mybatis+MySQL(IDEA)入门框架搭建

    目录 Spring MVC+Spring+Mybatis+MySQL(IDEA)入门框架搭建 0.项目准备 1.数据持久层Mybatis+MySQL 1.1 MySQL数据准备 1.2 Mybatis ...

  6. MyBatis(1)-简单入门

    简介 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.My ...

  7. (转)MyBatis框架的学习(二)——MyBatis架构与入门

    http://blog.csdn.net/yerenyuan_pku/article/details/71699515 MyBatis框架的架构 MyBatis框架的架构如下图: 下面作简要概述: S ...

  8. 【Mybatis】mybatis3入门

    mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可 ...

  9. 【MyBatis】MyBatis 入门

    MyBatis 入门 文章源码 软件框架 软件框架伴随着软件工程的发展而出现,所谓的软件框架,是提取了特定领域的软件的共性部分所形成的软件体系,它并不是一个成熟的软件,更像是一个半成品.开发者在框架之 ...

  10. MyBatis笔记----MyBatis 入门经典的两个例子: XML 定义与注解定义

    ----致敬MyBatis官方开放文档让大家翻译,不用看书直接看文档就行了,mybatis的中文文档还需要完备的地方 简介 什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以 ...

随机推荐

  1. redux-form的学习笔记

    redux是一种常用的与react框架搭配的一种数据流架构,而伴随着redux的出现,也出现了许多基于redux开源的第三方库,而redux-form就是其中之一的开源组件库,到今天我写下这篇笔记为止 ...

  2. node c++多线程插件 第二天 c++指针

    虽然取名叫node多线程插件,但是目前还是在学习c++的情况. 今天谈一谈c++指针. c++指针就像是c#中的引用变量,例如一个Person类的实例zs{Name="张三",Ag ...

  3. 用TTL线在CFE环境下拯救半砖wrt54g路由器

    缘起:路由器被刷成半砖 Linksys wrt54gs v4路由器,已刷入 tomato-dualwlan 1.23.使用数年,未出现任何故障. 在日用的wifi网络上,通过web界面刷入了错误的to ...

  4. fopen参数

    此文用于学习交流 原作:http://www.cnblogs.com/ai616818/archive/2012/04/26/2470918.html FILE * fopen(const char ...

  5. JavaWeb之JSP技术总结

    刚接触JSP技术的时候让我想起了在大学学的Asp+VBScript,记得当时我还用aspstudy做了一个小的新闻发布系统作为期末作品,也正是在那时候在卢哥卢老师的指导下走向编程的道路,对编程越来越感 ...

  6. Java标准注释配置

    eclipse中java文件头注释格式设置 windows->preferences->java->Code Templates->comments->Type-> ...

  7. Vue学习之路---No.7(分享心得,欢迎批评指正)

    老规矩,先回顾一下上回的重点: 1.对于input框,若为单选框,如果没有对其设置value,那么其checked的值将在true Or false之间切换:如果设置了value,那么将会切换valu ...

  8. iOS 上传文件

    NSString *boundry = @"boundry";//分节符 NSMutableURLRequest *mutableRequest = [NSMutableURLRe ...

  9. 如何修改vsftpd的默认根目录/var/ftp/pub到另一个目录?

    修改ftp的根目录只要修改/etc/vsftpd/vsftpd.conf文件即可: 加入如下几行: local_root=/var/www/html chroot_local_user=YES ano ...

  10. Shell中一键添加作者,版权信息

    第一步:编辑/etc/vimrc文件 [root@proxy ~]# cp /etc/vimrc /etc/vimrc.ori [root@proxy ~]# vim /etc/vimrc 第二步:直 ...