• 11-2 mybatis入门细节


    mybatis

    Mybatis 单表CURD细节

    1. ${} 与#{} 区别(面试题)

      1. ${} 拼接sql 造成sql注入 #{} 使用?占位

      如果作为值, 推荐使用#{}

      1. ${} 实现一些动态排序,使用

    #{column}
    select * from tb_userinfo order by ? desc
    column: id 赋值
    sql: select * from tb_userinfo order by 'id' desc
    根据 'id'常数列排序
    结果: 
    [User{name='张三丰', gender='男', age=108, address='湖北', email='zhangsanfeng@163.com', qq='123456'}, User{name='李思琪', gender='女', age=21, address='上海', email='lisiqi@163.com', qq='12312321'}, User{name='李思思', gender='女', age=21, address='北京', email='lisisi@126.com', qq='3323422'}, User{name='李大海', gender='男', age=22, address='上海', email='lidahai@ss.com', qq='12212121'}, User{name='倪大红', gender='女', age=23, address='上海', email='asdsa@ss.com', qq='12312321'}, User{name='fsdsf', gender='男', age=43, address='北京', email='aadda@ww.com', qq='544554'}, User{name='wangwu', gender='女', age=18, address='上海', email='wangwu@163.com', qq='21321321'}, User{name='李四', gender='男', age=21, address='湖南', email='lisi@163.com', qq='222222'}, User{name='zhangsansan', gender='男', age=21, address='湖南', email='zhangsansan@163.com', qq='12321312'}, User{name='莫问归期', gender='女', age=21, address='北京', email='1234567@qq.com', qq='1234567'}, User{name='一个人挺好', gender='男', age=21, address='北京', email='sadsad@163.com', qq='2313128'}, User{name='张三', gender='男', age=21, address='长沙', email='zhangsan@qq.com', qq='1234678'}, User{name='张三', gender='男', age=21, address='长沙', email='zhangsan@qq.com', qq='1234678'}]
    ​
    1. resultType: 不是表示方法的返回值类型, 查询到结果集中记录映射到java那个实体类, 写的实体类

    too many paramNumber selectone所带所导致的结果

    先后顺序:(先执行插入操作,再执行这个查询生成id的命令)

    1. selectOne() 与selectList() 区别

      selectOne() 查询结果集最多有一行记录, 超出一行记录, 抛异常 TooManyResultsException

      selectList(): 查询结果集可以0 ,1 , 多条 返回的List, 可以使用selectList() 替换selectOne()

    1. 插入操作,

    mysql提供: select LAST_INSERT_ID(); 查找生成id值

    只能获取当前会话执行插入操作的产生的id

    Mybatis的Dao层开发模式

    1. 传统的Dao模式

    编写一个Dao接口, 提供Dao实现类

    package com.fs.dao;
    ​
    import com.fs.entity.User;
    ​
    import java.util.List;
    ​
    public interface UserDao {
        /**
         * 根据主键查询
         * @param id
         * @return
         */
         User selectById(Integer id);
    ​
        /**
         * 查询所有
         * @return
         */
        List selectAll();
    ​
        /**
         * 添加
         * @param user
         * @return
         */
        int insert(User user);
    ​
        /**
         * 根据主键删除
         * @param id
         * @return
         */
        int deleteById(Integer id);
    ​
        /**
         * 根据主键修改
         * @param user
         * @return
         */
        int updateById(User user);
    }
    ​
    package com.fs.dao.impl;
    ​
    import com.fs.dao.UserDao;
    import com.fs.entity.User;
    import com.fs.util.MybatisUtil;
    import org.apache.ibatis.session.SqlSession;
    ​
    import java.util.List;
    ​
    public class UserDaoImpl  implements UserDao {
        private SqlSession sqlSession;
    ​
        public UserDaoImpl() {
            this.sqlSession = MybatisUtil.getSqlSession();
        }
    ​
        @Override
        public User selectById(Integer id) {
            User user = sqlSession.selectOne("UserDao.selectById",id);
            sqlSession.close();
            return user;
        }
    ​
        @Override
        public List selectAll() {
            List users = sqlSession.selectList("UserDao.selectAll");
            sqlSession.close();
            return users;
        }
    ​
        @Override
        public int insert(User user) {
            int row  = sqlSession.insert("UserDao.addUser",user);
            //提交事务
            sqlSession.commit();
            sqlSession.close();
            return row;
        }
    ​
        @Override
        public int deleteById(Integer id) {
            int row = sqlSession.delete("UserDao.deleteById", id);
            sqlSession.commit();
            sqlSession.close();
            return row;
        }
    ​
        @Override
        public int updateById(User user) {
            return 0;
        }
    }
    ​

    传统Dao方式问题:

    1. 重复代码重复写

    2. StatementId硬编码方式,

    产生原因: Dao的实现类

    2. Mapper代理模式 重点

    Mybatis推荐,

    编写Dao接口,不需要编写实现类, 由Mybatis动态代理自动生成的实现类对象,

    方法调用哪一个是根据你的映射配置文件中的sql所决定,如果在进入一点,判断是selectOne还是selectList,这里是根据返回值类型所决定 ,如果是一个对象,就是selectOne

    ,如果说是一个集合也就是selectList,当然你可以直接用selectList替代selectOne

    方法名:selectById

    全限定名:namespace="UserDao"

    为了区分传统Dao方式, 把Dao 取名为Mapper 层: Mapper 接口 UserMapper

    使用Mapper代理模式前提条件:

    Sql映射文件的要求:

    1. namespace必须写成Mapper接口全限定名

    2. statement的id写成方法名

    package com.fs.mapper;
    ​
    import com.fs.entity.User;
    ​
    import java.util.List;
    ​
    public interface UserMapper {
        /**
         * 根据主键查询
         * @param id
         * @return
         */
         User selectById(Integer id);
    ​
        /**
         * 查询所有
         * @return
         */
        List selectAll();
    ​
        /**
         * 添加
         * @param user
         * @return
         */
        int insert(User user);
    ​
        /**
         * 根据主键删除
         * @param id
         * @return
         */
        int deleteById(Integer id);
    ​
        /**
         * 根据主键修改
         * @param user
         * @return
         */
        int updateById(User user);
    }
    ​

    sql映射文件:

    
    
    
    ​
    ​
        
    ​
        
            delete from tb_userinfo where id = #{id}
        
    ​
        
    ​
        
    ​
            
                select LAST_INSERT_ID()
            
            insert into tb_userinfo(name,gender,age,address,email,qq,photo) values(#{name},
             #{gender},#{age},#{address},#{email},#{qq},#{photo})
        
    

    Mybatis的配置

    mybatis主配置文件相关配置

    mybatis-config.xml

    一个项目中只有一个主配置文件

    https://mybatis.org/dtd/mybatis-3-config.dtd mybatis的主配置文件的约束文件 dtd约束文件

    限制xml包含哪些标签, 标签中能包含哪些属

    1. <configuration>
    2. 包含的子标签
    3. configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>
    4. //configuration 子元素有先后顺序
    5. configuration>

    ?表示量词 0 次或者1次

    *表示量词 0 次或者n次

    +表示量词 1次或者n次

    类似于正则表达式

    ELEMENT configuration:表示是标签

    1. environment
    2. id CDATA #REQUIRED

    ATTLIST environment: 声明environment标签的属性列表

    id CDATA #REQUIRED: 有一个id属性, CDATA: id属性的数据类型: 普通文本 #REQUIRED: 必须的

    1. typeHandler EMPTY>
    2. //表示typeHandler标签没有子元素, <typeHandler/>

    properties配置

    加载properties文件, 比如把数据库参数放在properties文件, 在主配置文件中, 根据key获取value:

    ${key} ONGL表达式 对象图导航语言: ${user.address.name}

    1. User
    2. Address address
    3. Address
    4. name

  • 相关阅读:
    给电脑换上鸿蒙字体吧~
    【Visual Studio 使用技巧分享】任务列表的使用
    ubuntu20.04蓝牙连接airpods
    Vuex
    CSS样式
    java 线程池执行流程源码讲解
    使用gen 结合gorm 生成表模型文件
    研发效能工程实践-利用Superset快速打造大数据BI平台
    安全渗透测试基础之-Nessus漏洞扫描工具(安装下载)
    ① MyBatis使用入门,解决IDEA中Mapper映射文件警告。
  • 原文地址:https://blog.csdn.net/weixin_53415999/article/details/134287194