Mybatis

Mybatis框架

一、基础详解

mybatis 是一个持久层框架,用java编写
封装了jdbc操作的细节,开发者只需关注sql语句本身,而无需关注注册驱动,创建连接池等
使用了ORM思想实现了结果集的封装

ORM:
    Object Relational Mappging 对象关系映射
        java中的实体类和数据库中的表的映射关系
            实体类    表
            属性      字段
        成员变量和属性的区别:
            一般情况下,成员变量和属性名一致
            成员变量:定义在成员位置的变量
            属性:setter和getter方法去掉set或者get,将首字母变小写

二、环境的搭建

1. 创建数据库,创建表,添加数据
2. 创建项目
3. 引入jar包<在pom.xml文件中编写>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    </dependencies>
4. 创建实体类
    注意:属性名和表中字段名保持一致
5. 编写dao接口
6. 创建Mybatis的主配置文件<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">
        <!-- mybatis的主配置文件 -->
        <configuration>
            <!-- 配置环境 -->
            <environments default="mysql">
                <!-- 配置mysql的环境-->
                <environment id="mysql">
                    <!-- 配置事务的类型-->
                    <transactionManager type="JDBC"></transactionManager>
                    <!-- 配置数据源(连接池) -->
                    <dataSource type="POOLED">
                        <!-- 配置连接数据库的4个基本信息 -->
                        <property name="driver" value="com.mysql.jdbc.Driver"/>
                        <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
                        <property name="username" value="root"/>
                        <property name="password" value="1234"/>
                    </dataSource>
                </environment>
            </environments>
        
            <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
            <mappers>
                <mapper resource="com/corn/dao/UserDao.xml"/>
            </mappers>
        </configuration>
7. 创建映射配置文件(和接口一样的路径包)<UserDao.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">
        <mapper namespace="com.corn.dao.IUserDao">
            <!--配置查询所有-->
            <select id="findAll" resultType="com.corn.domain.User">
                select * from user
            </select>
        </mapper>

三、SqlMapConfig.xml 中配置的内容和顺序

1. properties(属性)
    -- property
2. settings(全局配置参数)
    -- setting
3. typeAliases(类型别名)
    -- typeAliase
    -- package
4. typeHandlers(类型处理器)
5. objectFactory(对象工厂)
6. plugins(插件)
7. environments(环境集合属性对象)
    -- environment(环境子属性对象)
        --- transactionManager(事务管理)
        --- dataSource(数据源)
8. mappers(映射器)
    -- mapper
    -- package

1. properties:定义在核心配置文件中

1. 可以从外部引入配置文件
    <properties resource="类路径"></properties>
2. 另一属性:url
    1. 遵循以下规则:协议://ip地址:端口号/URI
        1. 协议:http ftp hdfs file  ...
    代码如下:
        <properties url="file:///绝对路径"></properties>
3. 将dataSource标签改变为引用上面的配置(修改value中的内容)

2. typeAliases:定义在核心配置文件

1. 作用:给实体类起别名(当指定了别名就再区分大小写)
2. type属性指定的是实体类全限定类名。alias属性指定别名
    1.(单个别名定义)
    <typeAliases>
        <typeAlias type="com.corn.domain.User" alias="user"></typeAlias>
    </typeAliases>
3. 用于指定要配置别名的包+
,当指定之后该包下的实体类都会注册别名,并且类名就是别名,不区分大小写 
    1. (批量定义别名,扫描整个包下的类,别名为类名)   
    <typeAliases>
        <package name ="com.corn.domain"></package>
    </typeAliases>
4. 使用:在映射文件中不管是parameterType   resultType resultMap都可以使用别名

3.mapper(映射器)

1. <mapper resource=""/>使用相对于类路径的资源
2. <mapper class=""/>使用mapper接口类路径
    注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
3. <package name=""/>注册指定包下的所有mapper接口
    注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。

四、环境搭建注意事项

1. mybatis的映射配置文件位置必须和dao接口的包结构相同
2. 映射配置文件的Mapper标签namespace属性的值必须是dao接口的全限定类名
3. 映射配置文件的操作配置(select),ud属性的取值必须是dao接口的方法名
遵循了以上三点,我们在开发中无需再写dao 的实现类

五、增删改查操作

1. 操作步骤:
    1. 在dao接口中写入方法
    2. 修改映射配置为文件
2. 属性:
    1. parameterType:设置参数的类型
    2. resultType:设置查询到的结果封装的类型
    3. statmentType:设置使用的sql语句执行对象
        1. 取值:
            1. PREPARED :使用PreparedStatment
            2. statment:使用Statment
3. 占位符的使用:
    1. #{}:
        1. 如果参数是基本数据类型或者基本数据类型的包装类型,String类型,#{}中的内容可以随便写
        2. 如果参数是对象,#{}中使用的是对象的属性名
    2. ${value}:(开发中不会使用)如果使用这种方式的话,字段类型是varchar类型或者date类型等,需要添加引号  
4. 使用的标签:
    1. 添加数据,使用insert标签
    2. 更新数据,使用update标签
    3. 删除数据,使用delete标签
    4. 查询数据,使用select标签
5. 实体类中属性名和表中字段名不一致的请求:
    1. 在sql中起别名
    2. 在映射配置文件中添加resultMap标签,配置实体类中的属性和表中字段的关系:
        1. 代码如下:
            <resultMap id="userMap" type="com.corn.domain.User">
                <!--主键字段的对应>
                <id property="userId" column="id"></id>
                <!--非主键字段的对应-->
                <result property="userName" colimn="username"></result>
                <result property="userAddress" colimn="address"></result>
                <result property="userSex" colimn="sex"></result>
                <result property="userBirthday" colimn="birthday"></result>
            </resultMap>
        2. 同时将属性resultType更换为resultMap并将参数换为resultMap的id

1.查询所有数据

<select id="findAll" resultType="全限定类名">
    SELECT * FROM user;
</select>

2.添加数据

1. selectkey的属性:
    1. keyProperty:实体类属性的名称
    2. keyColumn:表中字段的名称
    3. orderr="AFTER":表明在insert语句后执行
2.代码如下 
    <insert id="inserta" parameterType="全限定类名">
        <selectKey keyProperty="id" 
                   keyColumn="id" 
                   order="AFTER" 
                   resultType="int">
            SELECT last_insert_id();
        </selectKey>
        INSERT into USER(username,..)VALUES (#{username},...);
    </insert>

3.修改数据

<update id="updatea" parameterType="全限定类名">
    UPDATE user SET username=#{username},address=#{address},sex=#{sex},birthday=#{birthday}where id=#{id}
</update>

4.删除数据

<delete id="deleta" parameterType="Integer">
    DELETE from USER WHERE id=#{uid};
</delete>

5.单个查询

<select id="selectx" parameterType="Int" resultType="com.corn.daomain.User">
    SELECT *FROM USER where id=#{uid};
</select>

6.模糊查询

<select id="selectv" parameterType="String" resultType="com.corn.daomain.User">
    SELECT * FROM USER WHERE username like #{name}
</select>

7.总数查询

<select id="selectCount" resultType="int">
    SELECT COUNT(id) from user;
</select>

ognl表达式:

1. ognl是Apache提供的一种表达式语言,在struts2中也有应用
2. 全写为:Object Graphic Navigation Language 对象图导航语言
3. 语法格式:使用#{对象.对象}的方式
    1. #{user.username}他会先去找user对象,然后在user对象中找到username属性,并把值取出来

六、事务的管理

1. 设置自动提交事务
    openSession(boolean flag) --> 如果将flag设置为true
2. 设置手动提交事务
    openSession()

七、mybatis的连接池

1. <dataSource type="设置数据源类型"></dataSource>
    数据类型的取值:
        POOLED:实现了DataSource接口,使用了池的思想
        UNPOOLED:实现了DataSource接口,每次获取连接都会创建一个新的连接
        JNDI:使用 JNDI 实现的数据源

2. mybatis继承第三方的连接池
    1. 定义一个类C3p0DataSourceFactory继承UnPooledDataSourceFactory类
        public C3p0DataSourceFactory(){
            this.dataSource = new COmboPooledDataSource();
        }
    2. 使用自定义类,type写入全限定类名,根据配置文件写入所有的name
        注意:在使用c3p0的时候必须引入c3p0的jar包的坐标

八、动态sql语句

1. if标签:判断
    属性:test --> 条件表达式
2. where标签:替代sql语句中where关键字
    如果有条件,添加where关键字,没有条件,则不会添加where关键字
3. foreach标签:遍历传递的容器
    属性:
        collection:集合的名称
        open:起始的sql语句
        close:结束时要拼接的sql语句
        item:集合中元素的名称
        separator:分隔符

九、多表关联查询

1. 一对一
    1. 修改映射配置文件(未在核心配置文件中设置实体类的别名)
        <!--定义封装两个类的resultmap-->
        <resultMap id="起方法名" type="所关联类的全限定类名">
            <id property="id" column="表中名字"/>
            <result property="实体类参数名称" column="表中名字"/>
            ...
            <association property="实体类中user属性名" javaType="所关联类的全限定类名">
                <id property="id" column="表中名字"/>
                <result property="实体类参数名称" column="表中名字"/>
                ...
            </association>
        </resultMap>
    2. 修改实体类

2. 一对多
    1. 修改实体类
    2. 修改配置文件(未在核心配置文件中设置实体类的别名)
        <!--定义封装两个类的resultmap-->
        <resultMap id="起名" type="所关联类的全限定类名">
            <id property="id" column="表中名字"/>
            <result property="实体类参数名称" column="表中名字"/>
            ...
            <collection property="实体类中user属性名" ofType="指集合中元素类型的全限定类名">
                <id property="id" column="表中名字"/>
                <result property="实体类参数名称" column="表中名字"/>
                ...
            </collection>
        </resultMap>

十、延时查询

1. 开启延时查询,在核心配置文件中
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="flase"/>
    </settings>
2. 修改映射配置文件
    说明:多表查询的sql语句,不能实现延时加载
    1. 在xml配置文件中添加:
       <association property="实体类中属性名" column="关联的字段" javaType="所关联类的全限定类名" select="调用指定的id对应的sql语句进行数据的操作"></association> 

十一、缓存

1. 一级缓存
    属于sqlsession级别的
    不需要进行任何的设置可以直接使用的
2. 清空一级缓存的情况
    增删改操作
    close()
    clearCache()
3. 二级缓存
    1. 在核心配置文件中(此设置可以不进行配置,默认值就是true)
        <settings>
            <setting name="cacheEnabled" value="true"/>
        </settings>
    2. 在映射配置文件中进行配置
        <cache/>
        <select>上添加属性userCache="true"

十二、mybatis基于注解的使用

1. 作用:替代了映射配置文件
2. 包含:
    1. @Select
    2. @Insert
    3. @Update
    4. @Delete
3. 使用方法:
    1. 把UserDao.xml移除,在dao接口的方法上使用注解,并且指定SQL语句,
    2. 需要将SqlMapConfig.xml中的mappers配置时,使用class属性指定dao接口的全限定类名
4. 配置实体类中的属性名和表中的字段的对应关系,使用的注解是@Results
    @Results(id="别名",value={
            @Result(id=true,property="id",column="表中名字")@Result(property="实体类参数名称",column="表中名称")...
    }5. 引用关联:@ResultMap("已有的别名")
6. 配置多表关系:(配置加载的时机:fetchType)
    1. 一对一:使用@One注解,替代了association标签
        @Result(property="实体类中属性名",column="表中名称",one=@One(select="调用指定的id对应的sql语句进行数据的操作",fetchType=FetchType.EAGER))
    2. 一对多:使用@Many注解,替代了collection标签
        @Result(property="实体类中属性名",column="表中名称",many=@Many(select="调用指定的id对应的sql语句进行数据的操作",fetchType=FetchType.LAZY))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值