Mybatis框架入门简介(手把手源码教程)

22 篇文章 1 订阅
7 篇文章 0 订阅

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

Mybatis的简介

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

1、支持普通sql查询

2、高级映射

3、存储过程

4、消除了几乎所有jdbc代码和参数的手工设置以及结果集的检索。

Mybatis官方中文文档:https://mybatis.org/mybatis-3/zh/index.html

为什么mybatis框架替代jdbc

代码示例

  //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();

1、创建连接存在硬编码

2、执行statement时存在硬编码

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

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

mybatis入门

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

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

创建java工程

导入jar包

mysql(1)

img

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

img

总共11个jar

img

初始化数据库脚本

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

img

添加log4j.properties

img

img

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

img

全局配置文件

建议规范命名:sqlMapConfig.xml,内容如下

img

此次的配置

 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     <!--
 7              属性 
 8         <properties></properties>
 9              全局参数设置
10         <settings></settings>
11              类型别名
12         <typeAliases></typeAliases>
13             类型处理器
14         <typeHandles></typeHandles>
15             对象工厂
16         <objectFactory></objectFactory>
17             插件
18         <plugins></plugins>
19         以上属性在后边会详细讲解到,现在我们就只需要关注一下下面的配置即可
20             如下所配置的就是使用这点东西。
21         environments(环境信息集合)
22             environment(单个环境信息)
23                 transactionManager(事物)
24                 dataSource(数据源)
25             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>

映射文件

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

操作增删改查

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

 1     <!-- 
 2             使用id进行查询
 3         查询,使用select来表示一个查询的statement,相当于statement.executeQuery
 4         id:表示该statement唯一标识
 5         parameterType:输入参数类型
 6         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     

操作

img

 1     //根据用户id进行查询。findUserById
 2     @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);
10         // 3、SqlSessionFactory创建SqlSession
11         SqlSession sqlSession = sqlSessionFactory.openSession();
12         // 4、SqlSession执行statement,并返回映射结果
13         
14         /*
15          * test.findUserById:在映射配置文件中,mapper的namespace为test,
16          *                     其中有一个select,也就代表查询的statement。
17          * 1:输入参数为1
18          * 返回的结果类型为User
19          */
20         User user = sqlSession.selectOne("test.findUserById", 1);
21         System.out.println(user);
22         
23         //5、关闭sqlsession资源
24         sqlSession.close();        
25     }

操作

img

查询模糊查询

img

操作

img

增加User, insert

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

img

操作

img

删除 delete

映射文件

img

操作

img

更新 update

映射文件

img

操作

img

基础的全局配置文件和映射文件

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

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

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

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

开发dao的方式

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

dao接口

[img#### daoImpl 实现类

[img

测试

[img

ps:这样开发有一个不好的地方,就是不能够直接使用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接口(Mapper.java)

[img

映射文件,Mapper.xml

[img

全局配置文件(sqlMapConfig.xml)

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

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

测试

[img
                直接调用方法名即可

文末总结

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值