mybatis的基本构架

Mybatis–基础环境搭建

mybatis框架介绍

mybatis是Apache软件基金会下的一个开源项目,前身是iBatis框架。2010年这个项目由apache 软件基金会迁移到google code下,改名为mybatis。2013年11月又迁移到了github。

mybatis的优点

  1. 简单易学:mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个SQL映射文件即可。
  2. 使用灵活:Mybatis不会对应用程序或者数据库的现有设计强加任何影响。SQL语句写在XML里,便于统一管理和优化。
  3. 解除SQL与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易进行单元测试。SQL语句和代码的分离,提高了可维护性。

mybatis的不足

  1. 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
  2. SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
  3. 框架还是比较简陋,功能尚有缺失,二级缓存机制不佳

ORM的概念

  1. ORM概念:Object Relational Mapping 对应关系映射

    java语言是面向对象的,mysql是关系型数据库,两者需要有一个映射机制,这个映射机制称为ORM。由框架自动去完成的。

  2. mybatis的两种映射方式

    1. 通过XML的配置文件

    2. 通过注解

入门案例:环境的搭建

需求

利用mybatis框架,从MySQL中查询所有的用户

数据准备:

create table user (
  id int primary key auto_increment,
  username varchar(20) not null,
  birthday date,
  sex char(1) default '男',
  address varchar(50)
);

insert into user values (null, '孙悟空','1980-10-24','男','花果山水帘洞');
insert into user values (null, '白骨精','1992-11-12','女','白虎岭白骨洞');
insert into user values (null, '猪八戒','1983-05-20','男','福临山云栈洞');
insert into user values (null, '蜘蛛精','1995-03-22','女','盤丝洞');

select * from user;
环境搭建步骤
  1. 创建项目(模块)

  2. 创建lib目录,复制以下包

    1. 日志记录包

    2. mysql驱动

      在这里插入图片描述

    3. mybatis框架的包

      在这里插入图片描述

  3. 核心配置文件:sqlMapperConfig.xml放在src目录下

  4. 日志记录的配置文件:log4j.properties

  5. 编写用户DAO接口(UserMapper)

  6. 编写用户DAO接口映射文件(UserMapper.xml)放在src目录下

  7. 修改核心配置文件中sqlMapConfig.xml,加载UserMapper.xml

  8. 编写测试代码

mybatis配置文件分两种,这2种都是XML文件

  1. 核心配置文件:配置数据库连接,连接池等属性
  2. 实体类映射文件:编写SQL语句,指定表与类ORM之间映射关系
环境图示

在这里插入图片描述

入门案例:配置文件和接口

核心配置文件: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>
    <typeAliases>
        <!--将一个包下的实体类 统一定义别名,类名小写-->
        <package name="com.itheima.entity"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--1. 配置连接池参数-->
            <dataSource type="POOLED">
                <!--数据库驱动类名-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--连接字符串-->
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <!--用户名-->
                <property name="username" value="root"/>
                <!--密码-->
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- 指定实体类映射文件位置,这里不是包名,而是路径 -->
        <mapper resource="ContactMapper.xml"/>
    </mappers>
</configuration>
映射文件配置:ContactMapper.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:命名空间,指定接口的完全限定名字-->
<mapper namespace="ContactMapper">
    <!--
    id:表示接口中方法名
    resultType:表示方法返回的数据类型,如果返回的是集合,这里指定集合中每个元素类型
    select标签标签体就是SQL语句
    -->


    <select id="findAllContact" resultType="com.itheima.entity.Contact">
        select * from contact
    </select>

    <select id="findById" resultType="com.itheima.entity.Contact" parameterType="java.lang.Integer">
        select * from contact where id=#{id}
    </select>
</mapper>
测试类:
public class Tset {
    @Test
    public void select() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapperConfig.xml");
        //1.创建会话工厂建造类
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //2.创建会话工厂对象,读取核心配置文件
        SqlSessionFactory factory = builder.build(inputStream);
        //3.从工厂中获取会话对象,相当于获取数据库的连接对象
        SqlSession sqlSession = factory.openSession();
        List<Object> objects = sqlSession.selectList("ContactMapper.findAllContact");
        for (Object object : objects) {
            System.out.println(object);
        }
        sqlSession.close();
    }
}

小结:核心配置文件功能:设置数据库连接参数等

​ 映射配置文件功能:你要执行的sql语句

​ 注意里面的标签,和sql语句对应

​ 在测试类中调用:

​ 1、使用mybatis提供的输入流读取核心配置文件
​ 2、获取sql会话对象

​ 3、使用映射文件namespace属性点调用id属性值,就像对象名.方法名。

核心配置文件属性介绍:

properties:

作用:加载外部的属性文件,扩展名为.properties

编写数据库连接属性资源文件(db.properties)

放在src目录下

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root

在核心配置文件中引入:

<!--
加载外部的属性文件,自动在类路径下去找,将属性文件中所有的键和值加载到内存中
下面就可以通过${键名}获取值
resource:读取类路径下属性文件
url: 在网络上或本地其它路径读取属性文件
<properties url="file:///d:/db.properties"/>
<properties resource="db.properties"/>

如果内部和外部有同名键,先加载内部的,再加载外部,外部后加载会覆盖先加载的
-->
<properties resource="db.properties">
    <!--在文档内定义键和值-->
    <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
    <property name="jdbc.url" value="jdbc:mysql://localhost:3306/day25"/>
    <property name="jdbc.username" value="root"/>
    <property name="jdbc.password" value="root"/>
</properties>
typeAliases:

作用:给数据类型定义别名

在实体类映射文件中,编写SQL语句属性
resultType=“com.itheima.entity.User” 能不能简化它的写法呢?可以的
可以在核心配置文件中使用typeAliaes来给实体类定义别名

内置别名:

别名是小写的,以下类型可以直接使用

parameterType="java.lang.Integer" 换成 parameterType="int"
别名真实类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator
自定义类的别名定义

分为两种:

​ 单个定义

​ 一个包下的自动扫名

<!--
给类型定义别名
子元素 typeAlias 属性:
    type:指定实体类的完全限定名
    alias:表示类的别名,可以省略。省略后默认就是类名,别名不区分大小
    <typeAlias type="com.itheima.entity.User"/>

子元素:package 给整个包下实体类定义别名,别名就是类名
1. name属性指定要扫描包名
2. 如果有多个包在同一个父包下,只要配置父包就可以了,所有的子包会自动扫描
3. 也可以指定多个package来设置不同的名
-->
<typeAliases>
    <package name="com.itheima.entity"/>
</typeAliases>

mappers

作用:加载外部的实体类映射文件,是XML配置文件

方式一:加载单个映射文件mapper

方式二:包扫描加载映射文件package

<!-- 加载其它映射文件 -->
<mappers>
    <!--
    子元素:mapper
        属性:
        resource:加载类路径下指定的配置文件,注:分隔符是/,而不是点号
        url: 读取指定路径下配置文件,或者网络的配置文件
        <mapper url="file:///d:/UserMapper.xml"/>
        class: 指定接口的完全限定名,用于注解的配置,不需要XML文件。现在用不到
        <mapper class="com.itheima.dao.UserMapper"/>

    子元素:package
        1. 指定扫描哪个包下所有的DAO接口,如果使用这种写法,接口名与配置文件名字要相同。
        如:接口名UserMapper.java 配置文件名:UserMapper.xml
        2. 接口与配置文件必须放在同一个包下
    -->
    
    <package name="com.itheima.dao"/>
</mappers>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值