MyBatis 基础

MyBatis 是一个持久层半自动 ORM 框架,用来简化 JDBC 代码

  1. 数据持久化:
		把内存中的数据保存到硬盘上
        系统架构中用来做数据持久化的代码叫做持久层(dao)
  1. ORM:
		Object Relationship Mapping:对象关系映射
        通过配置来实现 model 和 数据库记录之间的相互转换,
        在这个过程中不用编写 JDBC 代码
  1. MyBatis 的使用:
	1. 创建 maven 项目
    2. 引入 mybatis 和 mysql 依赖
    3. 创建并编辑 mybatis-config.xml 配置文件
        1. 复制粘贴官网的模板内容
        2. 修改数据库连接的 4 个配置
        3. 修改 SQL 配置文件路径为 UserMapper.xml
    4. 创建 User model 类,属性名和数据库字段名保持一致
    5. 创建 UserDao 接口,声明数据库操作方法
        ArrayList<User> findAll();	
        User findByAccount(String account);	
    6. 创建并编辑 UserMapper.xml 代替以前的 UserDaoImpl
        1. 复制官方模板
            <?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="">
            
            </mapper>
        2. 一个配置文件对应于一个 Dao 接口
            通过 namespace 设置接口的全名进行绑定
            
        3. 在 mapper 标签内部编写每个方法用到的 SQL 语句
            <select></select> 用于编写查询语句
                通过 id 设置对应的方法名,绑定 SQL 和方法
                
                通过 resultType 设置方法返回数据的类型全名
                    如果返回值是集合,只需要配置集合中存储的类全名即可
                   
            <select id="findAll" resultType="com.zhiyou100.model.User">
                SELECT id, account, password FROM user;
            </select>

  		4. 创建 Application 使用 mybatis
      	 	// 1. 读取配置文件,Reader 导 io 包,Resources 导 ibatis 包,捕获异常
			Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
		
			// 2. 解析配置文件
			SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
		
			// 3. 获取执行 SQL 语句的 session 对象
			SqlSession session = factory.openSession();
		
			// 4. 从 session 获取 dao 对象
			UserDao userDao = session.getMapper(UserDao.class);
        
        	// 5. 调用 dao 中的方法
        	ArrayList<User> users = userDao.findAll();        
  1. 注意事项:
    mybatis-config.xml
        1. xml 中是 &amp; 表示 & 符号
        2. mapper 的路径从 resources 文件夹开始算
    UserMapper.xml
        namespace, id, resultType 复制粘贴,拒绝手写
    Model 类:
        属性名要和字段名保持一致
            model 和表的关联默认靠的是名字一致,
            如果不一致还需要进行其它配置才能关联

SQL 参数可以使用 #{} 或 ${} 区别在于
    #{} 自动为字符串添加 ""
    ${} 不会为字符串添加 ""
            
SQL 单参数赋值方案:
    #{_parameter} 表示参数
    
    <select id="findByAccount" resultType="com.zhiyou100.model.User">
		SELECT id, account, password FROM user WHERE account=#{_parameter};
	</select>
    
SQL 多参数赋值方案:
    方案1:通过参数的索引进行赋值:param1, param2 
        User findByAccountAndPassword(String account, String password);
    
        <select id="findAllByPageAndSize" resultType="com.zhiyou100.model.User">
            SELECT id, account, password FROM user LIMIT #{param1}, #{param2};
        </select>
    方案2:把参数封装到 model 类,通过属性名字赋值
        ArrayList<User> findByAccountOrPassword(User user);
    
        <select id="findByAccountOrPassword" resultType="com.zhiyou100.model.User">
            SELECT id, account, password FROM user WHERE account=#{account} OR password=#{password};
        </select>
  1. 增删改:
	<insert></insert>
    <update></update>
    <delete></delete>
    
    增删改默认是在事务中执行的,只有提交了事务,修改才能数据库生效
    session.commit();    
  1. 动态 SQL:
    if:表示判断
        <select id="findAllByPasswordLike" resultType="com.zhiyou100.model.User">
            SELECT id, account, password FROM user 
            <if test="_parameter != null">
                WHERE password LIKE #{_parameter}
            </if>
            ;
        </select>
        
    where:封装查询条件
        1. 只有有条件的时候才会添加 where 关键字
        2. 消除多余的 AND/OR
        
        	<select id="findAllByAccountAndPasswordLike" resultType="com.zhiyou100.model.User">
                SELECT id, account, password FROM user
            <where>
                <if test="account != null">
                    AND account LIKE #{account}
                </if>
                <if test="password != null">
                    AND password LIKE #{password}
                </if> 
            </where>
            ;
        </select>
        
    set:封装更新字段,只更新不为 null 字段的值
        1. 添加 SET 关键字
        2. 消除多余的 ,
        
        <update id="update">
		UPDATE user
                <set>
                    <if test="account != null">
                        account=#{account},
                    </if>
                    <if test="password != null">
                        password=#{password},
                    </if>
                </set>
            WHERE id=#{id};
        </update>
        
    foreach:
        通常用在 in 条件后,遍历集合并拼接内容,生成查询条件
    
        <select id="findAllByIds" resultType="com.zhiyou100.model.User"> 
            SELECT id, account, password FROM user WHERE id IN
		<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
			#{item}
		</foreach>
		;
	</select>
        
        遍历集合,拼接的内容为 (1,2,3,4)

图解如下:
图解

猜你喜欢

转载自blog.csdn.net/ilovehua521/article/details/83573038