Mybatis(一) mybatis入门

      学习了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         //1、注册驱动,什么是驱动?能够让java连接数据库,也就是实现jdbc接口规范就是驱动
 2         Class.forName("com.mysql.jdbc.Driver");硬编码
 3         /*
 4          * 2、通过驱动管理者获取数据库连接
 5          *         DriverManager是驱动实现类的管理者。
 6          *         url:连接数据库的位置,端口号,数据库名
 7          *             jdbc:mysql://localhost:3306/test_01
 8          */
 9         Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_1","root","root");(硬编码)
10         11          * 3、获得sql语句执行者
12          *         statement:执行sql语句对象
13          *             sql语句必须是完整的。
14          *         preparedStatement:预处理(常用)
15          *             sql语句可以不是完整的,可以将参数用?替代,然后在预编译后加入未知参数
16          * 
17          18         定义sql语句,?表示占位符
19         String sql = "select * from user where id = ?";    20         PreparedStatement ps = conn.prepareStatement(sql);
21         ps.setInt(1,1);                硬编码
22         4、获取sql语句执行结果,resultset
23         24          * executeQuery():查询操作
25          * executeUpdate():增删改操作
26          27         ResultSet rs= ps.executeQuery();
28         5、处理结果
29         while(rs.next()){
30             System.out.println(rs.getInt(1));;index代表第几列,从1开始
31         }
32         
33         6、关闭连接
34         rs.close();
35         ps.close();
36         conn.close();
View Code

        

        这种方式的缺陷

          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包中找到

                

1 # Global logging configuration
2 log4j.rootLogger=DEBUG,stdout
3 # MyBatis logging configuration...
4 log4j.logger.org.mybatis.example.BlogMapper=TRACE
5 # Console output...
6 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
7 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
8 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
View Code

 

      3.4、全局配置文件

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

            

          此次的配置

            

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6     <!--
             属性 
 8         <properties></properties>
 9              全局参数设置
10         <settings></settings>
             类型别名
12         <typeAliases></typeAliases>
            类型处理器
14         <typeHandles></typeHandles>
            对象工厂
16         <objectFactory></objectFactory>
17             插件
18         <plugins></plugins>
19         以上属性在后边会详细讲解到,现在我们就只需要关注一下下面的配置即可
20             如下所配置的就是使用这点东西。
21         environments(环境信息集合)
22             environment(单个环境信息)
23                 transactionManager(事物)
                dataSource(数据源)
            environment
26         environments    
27         mappers(映射器)
28     -->
29     
30 
31 <!-- 配置mybatis的环境信息 -->
32 <environments default="development">
33     <environment id="development">
34         <!-- 配置JDBC事务控制,由mybatis进行管理 -->
35         <transactionManager type="JDBC"></transactionManager>
36         <!-- 配置数据源,采用dbcp连接池 -->
37         <dataSource type="POOLED">
38             <property name="driver" value="com.mysql.jdbc.Driver"/>
39             <property name="url" value="jdbc:mysql://localhost:3306/test_1?useUnicode=true&amp;characterEncoding=utf8"/>
40             <property name="username" value="root"/>
41             <property name="password" value="root"/>
42         </dataSource>
43     </environment>
44 </environments>
45     <!-- 加载mapper映射文件 -->    
46 <mappers>
47     <mapper resource="sqlmap/User.xml"/>
48 </mappers>
49 </configuration>
View Code

 

      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对象  注意看下面的注释

              

  

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

            操作

              

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

 

          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是不完全映射的框架。懂了基本的用法之后,那么之后就会详细讲解其中的问题,全局配置文件当中的配置,映射文件中的详细配置(高级映射),延迟加载,一级缓存二级缓存等用法。

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.pom.xml引入依赖 &lt;dependency&gt; &lt;groupId&gt;com.github.pagehelper&lt;/groupId&gt; &lt;artifactId&gt;pagehelper&lt;/artifactId&gt; &lt;version&gt;5
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt; &lt;!DOCTYPE configuration PUBLIC &quot;-//mybatis.org//DTD Config 3.0//EN&quot; &qu
准备工作 ① 创建数据库&amp;数据表 ## 创建数据库 CREATE DATABASE `dbtest1`; ## 创建数据表 CREATE TABLE `t_user` ( `id` INT NOT NULL AUTO_INCREMENT, `username` VARCHAR(20) DEF
MyBatis逆向工程是指根据数据库表结构自动生成对应的实体类、Mapper接口以及SQL映射文件的过程。这个过程可以通过MyBatis提供的逆向工程工具来完成,极大地方便了开发人员,避免了重复的代码编写,提高了开发效率。 创建逆向工程的步骤 1、添加依赖&amp;插件 &lt;!-- 控制Mave
MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值。 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自
resultMap作用是处理数据表中字段与java实体类中属性的映射关系。 准备工作 ① 创建数据库&amp;数据表 CREATE DATABASE `dbtest1`; CREATE TABLE `t_emp` ( `emp_id` int NOT NULL AUTO_INCREMENT, `em
EHCache缓存针对于MyBatis的二级缓存。 MyBatis默认二级缓存是SqlSessionFactory级别的。 添加依赖 &lt;!-- MyBatis-EHCache整合包 --&gt; &lt;dependency&gt; &lt;groupId&gt;org.mybatis.cac
MyBatis 提供了一级缓存和二级缓存的支持,用于提高数据库查询的性能,减少不必要的数据库访问。 一级缓存(SqlSession 级别的缓存) 一级缓存是 MyBatis 中最细粒度的缓存,也称为本地缓存。它存在于每个 SqlSession 的生命周期中,当 SqlSession 被关闭或清空时,
动态SQL是 MyBatis 中非常强大且灵活的功能,允许你根据不同的条件构建SQL查询。 这主要通过 &lt;if&gt;、&lt;choose&gt;、&lt;when&gt;、&lt;otherwise&gt;、&lt;foreach&gt;等标签实现。 查询场景 /** * 根据条件查询员工
本教程操作系统:windows10系统、DELL G3电脑。 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在 MyBatis 中,配置数据库连接是非常重要的第一步。下面将详细介绍如何配置 MyBatis 的
今天小编给大家分享的是MyBatis批量查询、插入、更新、删除如何实现,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。
今天小编给大家分享的是Mybatis操作多数据源实现的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
本篇文章和大家了解一下mybatis集成到spring的方式有哪些。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1 前言1.1 集成spring前使用mybat...
今天小编给大家分享的是mybatis-plus分页查询的3种方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
本篇内容主要讲解“mybatis之BaseTypeHandler怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mybatis...
这篇文章主要介绍了mybatisforeach怎么传两个参数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mybatisforeach怎...
这篇“MyBatis映射文件中parameterType与resultType怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的...
这篇文章主要介绍“MyBatis怎么获取自动生成的键值”,在日常操作中,相信很多人在MyBatis怎么获取自动生成的键值问题上存在疑惑,小编查阅了各式资料,整理出
这篇文章主要讲解了“怎么去掉IntelliJIDEA中mybatis对应的xml文件警告”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入...
这篇文章主要介绍“MybatisPlus使用@TableId主键id自增长无效如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这...