mybatis

这篇博客详细介绍了MyBatis的使用,从处理逻辑和测试开始,讨论了连接池与非连接池的优缺点,特别是传统非连接池化。接着,讲解了如何在配置中利用if和foreach标签进行动态查询。然后,深入探讨了延迟加载的概念,以及在一对多、多对一模型中的应用。最后,作者阐述了MyBatis的缓存机制,包括一级缓存和二级缓存的工作原理及适用场景。
摘要由CSDN通过智能技术生成

1 处理逻辑:

1.创建实体类,一个实体类对应一个表格,创建setter,getter
2.创建Dao接口,定义相应的查询方法

package com.itheima.dao;
import com.itheima.domain.User;
import java.util.List;
public interface UserDao {
//    查询所有
    List<User> findAll();
}

3.配置mybatis主配置文件,主要包括配置sql环境,配置驱动,表,账户名和密码,最重要的mappers,对给个Dao进行配置

<?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>
    <!--配置环境-->
    <environments default="mysql">
        <!--配置msqyl环境-->
        <environment id="mysql">
            <!--配置事务类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源(连接池)-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="nopaimqq"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/itheima/dao/UserDao.xml"/>
    </mappers>
</configuration>

4.配置Dao文件,先让mybatis定位到相应的Dao,接着配置相应的查找方法,通过id属性配对

<?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">

<!--找到对应的dao-->
<mapper namespace="com.itheima.dao.UserDao">

    <!--id就是dao的方法名-->
    <select id="findAll" resultType="com.itheima.domain.User">
        select * from user
    </select>
</mapper>

2 测试

1.读取配置文件,连接数据库和获得映射
2.由工厂模式创建工厂,接着创建session
3.由于Dao里面的查询接口是没有实现的,所以,使用代理对象进行实例化一个Dao对象
4.执行Dao内的方法,并且进行相应输出
5.释放资源

package com.itheima.test;
import com.itheima.dao.UserDao;
import com.itheima.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
public class Test {
    public static void main(String[] args)throws Exception{
//        1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//        2. 创建工厂;
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
//        3. 使用工厂创建Session对象;
        SqlSession session = factory.openSession();
//        4. 使用Session创建Dao接口的代理对象;
        UserDao userDao = session.getMapper(UserDao.class);
//        5. 使用代理对象执行方法, 省略了接口的实现;
        List<User> users = userDao.findAll();
        for (User user : users) {
            System.out.println(user);
        }
//        6. 释放资源;
        session.close();
        in.close();
    }
}

3 连接池与非连接池

优点:使用连接池可以减少重复建立连接,断开连接的步骤,加速数据库的CRUD速度。

3.1 传统的非连接池化(UNPOOLED)

也就是几个步骤:
1.注册驱动:classforname
2.get connection

4 标签内的配置进行动态查询

4.1 在配置内使用if标签动态条件查询

1.先写接口。
2.配置

    <!--在配置内使用if标签进行条件查询-->
    <select id="selectbyCondition" parameterType="com.itheima.domain.User" resultType="com.itheima.domain.User">
        select * from user 
        <where>
	        <if test="username != null">
	            and  username like #{username}
	        </if>
	        <if test="sex != null">
	            and sex = #{sex}
	        </if>
        </where>
    </select>

首先看到传入的参数是User类型,我使用的类的属性和表的列名是一一对应的;原理就是通过配置生成了这样一个查询语句

select * from user where username like #{username} and sex = #{sex}

比如定义一个查询的user,其中username = “%王%”, sex = 男,那其实就是查询了表内名字带个王字的,而性别是男的的对象。

4.2 使用foreach标签进行子查询

子查询sql语句为

select * from user where id in (41,42,43)

配置如下

    <!--在配置内使用foreach标签进行子查询-->
    <select id="selectbyQueryVoIds" parameterType="com.itheima.domain.QueryVo" resultType="com.itheima.domain.User">
        select * from user
        <where>
            <if test="ids != null">
                 <!--对ids进行遍历取出来,拼凑成一个sql
                 select * from user where id in (conditions)-->
                <foreach collection="ids" open="and id in (" close=")" item="id" separator=",">
                    #{id}
                </foreach>
            </if>
        </where>
    </select>

5 延迟加载

5.1 延迟加载与立即加载

比如多对一与一对多中,一个用户可能有100个账户,那是不是100个账户要同时查询出来
延迟加载:就是不用时,那些级联的表多余的数据不加载出来
立即加载:不管如何,都加载出来

5.2 在一对多,多对一的模型里面进行延迟加载

比如acount与user是多对一,
对acount进行select * from acount,同时对user进行延迟加载
主要对association标签进行修改,增加一个select标签,select指向Iuser接口所指向的查询方法,这个查询方法一定是通过外键进行查询。和多对一的column标签相对应
原理:个人认为就是在执行查询时候,调用了association里面的select方法

6 缓存

6.1 什么是缓存

缓存是存在于内存中的临时数据;通过缓存可以减少与数据库的交互次数,提高查询效率。

6.2 什么样的数据适合缓存

经常查询并且value不经常改变的数据,
数据的正确与否对最终影响不大。因为缓存中的数据与数据库中的数据可能存在偏差,对于金融等应用不一定合适。

6.3 一级缓存

存在sqlSession中,当sqlsession.close时,缓存也消失
当执行一个update或者delete时,缓存也会消失

6.4 二级缓存

存在SqlSessionFactiory

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值