Mybatis(一) mybatis入门

时间:2025-02-27 15:34:02

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

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

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

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

一、Mybatis的简介

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

      查看百度百科的介绍

            Mybatis(一) mybatis入门

       1、支持普通sql查询

       2、高级映射

       3、存储过程

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

二、分析jdbc的问题

              Mybatis(一) mybatis入门

         //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(一) mybatis入门

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

             Mybatis(一) mybatis入门 

          总共11个jar

              Mybatis(一) mybatis入门   

      3.2、初始化数据库脚本

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

                Mybatis(一) mybatis入门

      3.3、添加log4j.properties

                Mybatis(一) mybatis入门

                Mybatis(一) mybatis入门

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

                Mybatis(一) mybatis入门

 # 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,内容如下

            Mybatis(一) mybatis入门

          此次的配置

            Mybatis(一) mybatis入门

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

              Mybatis(一) mybatis入门  

     <!--
使用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>

            操作

              Mybatis(一) mybatis入门

     //根据用户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映射文件

                Mybatis(一) mybatis入门

              操作

                Mybatis(一) mybatis入门

            3.6.3、增加User, insert

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

                 Mybatis(一) mybatis入门   

                操作

                  Mybatis(一) mybatis入门

                3.6.4、删除 delete

                  映射文件

                    Mybatis(一) mybatis入门

                  操作

                     Mybatis(一) mybatis入门 

                3.6.5、更新 update

                  映射文件

                      Mybatis(一) mybatis入门

                  操作

                      Mybatis(一) mybatis入门    

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

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

                映射文件:通过对比原始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条记录的话,会报错   

                          Mybatis(一) mybatis入门

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

 

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

              

四、开发dao的方式

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

        4.1、dao接口

            Mybatis(一) mybatis入门

        4.2、daoImpl 实现类

            Mybatis(一) mybatis入门  

        4.3、测试

             Mybatis(一) mybatis入门 

        小总结:

            这样开发有一个不好的地方,就是不能够直接使用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

               Mybatis(一) mybatis入门   

            映射文件,UserMapper.xml

               Mybatis(一) mybatis入门                

            全局配置文件。sqlMapConfig.xml

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

               Mybatis(一) mybatis入门      

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

            测试

                Mybatis(一) mybatis入门

                直接调用方法名即可

六、总结

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