05_02_Mybatis||day02_Mybatis第二天||(总结篇,原文很详细)

今日课程内容介绍

第二章 Mybatis的curd(基于代理dao的方式)

2.1 回顾自定义Mybatis的流程

  1. 流程图
  • 不管使用哪种方式都只干了两件事:
    1. 查询结果,封装结果集
    2. 创建代理对象,调用查询结果
  1. 总结(自定义不是重点,重点还是如何去实现与执行Mybatis的使用

2.2 xml和注解重点流程【重点】

  1. 不要拘泥于某个技术点来得到某些内容
  2. 主要关注的是从里面拿出什么内容来解决什么内容【如下】
    1. 获取到连接数据库的信息
    2. 拿到映射配置的信息(映射配置里面提供的信息
    3. xml配置信息中
      1. 获取时所必须的key->唯一标志
      2. 封装到哪里去的->全限定类名
      3. 执行什么样的SQL语句
    4. 注解配置信息中【关键就是User要怎么拿到】
      1. 获取时所必须的key->唯一标志
      2. 封装到哪里去的->User
      3. 执行什么样的SQL语句
    • User要怎么拿到【了解】
      • 后面就是取出信息存到mappers里面
        • 目的:可以在创建代理对象的时候可以拿到我们想要的信息
    1. 创建代理对象,调用查询结果

2.3 回顾Mybatis的环境搭建【重点】

2.3.1 xml的
  1. 新建项目,什么都不选
  2. 组名和自定义名
  3. 导入依赖坐标(日志操作配置去day1中复制)
  4. 在java文件夹中创建实体类
  5. 在Resource文件夹中创建Mybatis的主配置文件
    1. 复制Config的约束
        <?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"> 
    
    1. mappers配置方式决定使用xml还是注解
  6. 创建dao的接口
  7. 对应着dao接口包来创建映射配置文件(必须一级一级来创建:否则会以点分隔创建成一个文件夹
    1. 复制Mapper的约束(叫mapper和dao是一样的,根据个人习惯)
        <?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">
    


8. 至此,环境搭建完成【下面写测试类来测试】

2.3.2 注解的
  • 注: 与2.3.1中(1, 2, 3, 4)步骤相同
  1. 在Resource文件夹中创建Mybatis的主配置文件
    1. 复制Config的约束
        <?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"> 
    
    1. mappers配置方式决定使用xml还是注解
      • 需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名
  2. 创建dao的接口
    • 在dao接口的方法上使用@Select注解,并且指定SQl语句
  3. 注解不需要xml映射配置文件
  4. 至此,环境搭建完成【下面写测试类来测试】
  • 注:我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式,不管使用XML还是注解的方式。
    • 但是Mybatis是支持写dao实现的。

2.4 Mybatis的CRUD 保存操作

2.4.1 xml的
  1. 在IUserDao接口中写方法
  2. 在映射配置IUserDao.xml中配置
    • 没有id是因为它是自增长的
  3. 在测试类中新增一个方法
    • 这里每个方法都需要做1,2,3,4,6步骤,所有都提了出来(优化代码)
    • 测试保存操作最后面要用到,提交事务操作(否则会回滚)
        public class MybatisTest {
            private InputStream in;
            private SqlSession sqlSession;
            private IUserDao userDao;
        
            /**
             * 来执行一些初始化的操作(减少重复代码)
             * * 这时候要有一些变量写到外面
             */
            @Before //用于在测试方法执行之前执行
            public void init() throws Exception{
                //1. 读取配置文件
                in = Resources.getResourceAsStream("SqlMapConfig.xml"); //会抛出异常
                //2. 创建SqlSessionFactory工厂(他是一个接口,需要找他的实现)
                /*SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
                SqlSessionFactory factory = builder.build(in);*/
                SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
                //3. 使用工厂产生SqlSession对象
                sqlSession = factory.openSession();
                //4. 使用SqlSession创建Dao接口的代理对象
                userDao = sqlSession.getMapper(IUserDao.class);
            }
        
            /**
             * 用来干释放资源
             */
            @After //用于在测试方法执行之后执行
            public void destroy() throws Exception{
                /**
                 * 测试保存操作最后面要用到
                 */
                //提交事务(否则会回滚)
                sqlSession.commit();
        
                //6. 释放资源
                sqlSession.close();
                in.close(); //也会抛出异常
            }
        
            /**
             * 入门案例
             * 总体思路:
             * 读取配置文件来准备一个工厂来生产一个对象,这个对象用于为我们提供Dao的实现,有了实现就可以用来执行方法
             *
             * 要点:
             * 1. 用代理的方式不用写Dao的实现
             * 2. IUserDao.xml配置当中,必须要说清楚封装到哪里去{<select id="findAll" resultType="com.kami.domain.User">}
             */
            @Test
            public void testFindAll(){
                //5. 使用代理对象执行方法
                List<User> users = userDao.findAll();
                for(User user : users){
                    System.out.println(user);
                }
            }
        
            /**
             * 测试保存操作
             */
            @Test
            public void stestSave() throws Exception {
                User user = new User();
                user.setUsername("Mybatis saveUser");
                user.setAddress("银川市西夏区");
                user.setSex("男");
                user.setBirthday(new Date());
        
                //5. 使用代理对象保存方法
                userDao.saveUser(user);
        
            }
        }
    
  • 注:当保存操作,存中文出现乱码的时候【重点】
    1. 打开SqlMapConfig.xml
    2. 修改url后面的value值
        <property name="url" value="jdbc:mysql://localhost:端口号/数据库名称?characterEncoding=utf-8"/>
    
2.4.2 注解的
  1. 在IUserDao接口中写方法
  2. SqlMapConfig.xml改成注解
  3. 在测试类中新增一个方法
    • 前面部分同xml的配置

2.5 Mybatis的CRUD 修改与删除操作

2.5.1 xml的
  1. 在IUserDao接口中写方法
  2. 在映射配置IUserDao.xml中配置
  3. 在测试类中新增方法
2.5.2 注解的
  1. 在IUserDao接口中写方法
  2. SqlMapConfig.xml改成注解
  3. 在测试类中新增方法
    • 前面部分同xml的配置

2.6 Mybatis的CRUD 查询一个和模糊查询(07)

2.6.1.1 xml的方式:查询一个的操作
  1. 在IUserDao接口中写方法
  2. 在映射配置IUserDao.xml中配置
  3. 在测试类中新增方法
2.6.1.2 注解的方式:查询一个的操作
  1. 在IUserDao接口中写方法
  2. 在测试类中新增方法
2.6.2.1 xml的方式:模糊查询的操作
  1. 在IUserDao接口中写方法
  2. 在映射配置IUserDao.xml中配置
  3. 在测试类中新增方法
2.6.2.2 注解的方式:模糊查询的操作
  1. 在IUserDao接口中写方法
  2. 在测试类中新增方法

2.7 Mybatis的CRUD 查询返回一行一列

2.7.1 XML的方式:查询总用户数
  1. 在IUserDao接口中写方法
  2. 在映射配置IUserDao.xml中配置
  3. 在测试类中新增方法
2.7.2 注解的方式:查询总用户数
  1. 在IUserDao接口中写方法
  2. 在测试类中新增方法

***以上是所有的CRUD操作

2.8 上面要注意的几点细节
2.8.1 模糊查询的另一种写法【了解,实际开发用上面的】
  1. IUserDao.xml配置中另一种写法
    <!-- 根据名称模糊查询(这里提供不了模糊查询的%,在测试类中提供) -->
    <select id="findByName" parameterType="String" resultType="com.kami.domain.User">
        <!-- 原来的-->
        select * from user where username like #{uname}
        <!-- 另一种写法-->
        select * from user where username like '%${value}%'
    </select>
  1. 在测试类中的修改
    @Test
    public void testFindByName(){
        //5. 使用代理对象保存方法
        //List<User> users = userDao.findByName("%王%");
        //另一种写法中已经提供了%,这里就不需要写了
        List<User> users = userDao.findByName("王");
        for(User user : users){
            System.out.println(user);
        }
    }
  1. 两者的区别
  • 注:PreparedStatement 使用crud的知识点
    1. PreparedStatement可以提高执行的效率(因为它有预编译的功能
    2. PreparedStatement可以防止sql注入,但是要求?(参数占位符)赋值的方式才可以。
2.8.2 保存操作的细节:获取保存数据的id
  • 新增用户后,同时还要返回当前新增用户的id
  1. 在IUserDao.xml的保存用户中新增配置
  2. 执行结果:

第三章 Mybatis的参数深入

  • 首先了解:OGNL表达式(apache公司开发的):
    1. 它是通过对象的取值方法来获取数据。在写法上把get给省略了。
    2. #{}或者${}括号中的值为pojo属性名称
3.1 使用实体类的包装对象作为查询条件【重点】
  • 实际开发中常用到:【由多个对象产生的查询条件】
  1. 在IUserdao接口中写方法
        /**
         * 根据queryVo的条件查询用户
         * @param vo
         * @return
         */
        int findUserByVo(QueryVo vo);
    
  2. 实际还是要根据名称来模糊查询,只不过查询的条件被封装到一个对象里面了
  3. 在映射配置IUserDao.xml中配置
        <!-- 根据QueryVo的条件查询用户-->
        <select id="findUserByVo" resultType="int" parameterType="com.kami.domain.QueryVo">
            select * from user where username like #{user.username}
        </select>
    
  4. 在测试类中新增方法
        /**
         * 测试使用QueryVo作为查询条件
         */
        @Test
        public void testFindByVo(){
            QueryVo vo = new QueryVo();
            User user = new User();
            user.setUsername("%王%");
            vo.setUser(user);
            //5. 使用代理对象保存方法
            List<User> userByVo = userDao.findUserByVo(vo);
            for(User u : userByVo){
                System.out.println(u);
            }
        }
    
3.2 Mybatis的输出结果封装
3.2.1 resultType(输出类型)
  1. 输出简单类型(查询总记录条数)
  2. 输出pojo对象(查询一个)
  3. 输出pojo列表(查询所有)
  • 注:当我们使用【查询封装】的时候,要求实体类必须和数据库的列名保持一致
    • 如果不一致(保存为例->删除,改都一样):
      1. 经过对后面的名称及keyProperty(id名)的修改
        • 能正常使用
    • 如果不一致->查询
      1. 结果:除了name之外的内容都为null
    • 除了name能封装,其他都为null的原因:
      1. 所有的属性都没有对象,所以封装不进去
      2. name能封装进去的原因:MySQL数据库在Windows系统下不区分大小写。实力类和数据库name名称相互匹配成功。(其他的完全不一样)
      3. 但是在Linux系统下MySQL数据库是区分大小写的。所以在Linux中name也封装不进去。
    • 解决方法:
      1. 在SQL语句中其别名【执行效率最高】
          <!-- 查询所有 -->
          <select id="findAll" resultType="com.kami.domain.User">
              select id as userId, username as userName, address as userAddress, sex as userSex, birthday as userBirthday from user;
          </select>
      
      1. Mybatis提供了一种配置方式并使用【开发效率更高】
        1. IUserDao.xml中写好
            <!-- 配置 查询结果的列名和实体类的属性名的对应关系-->
            <resultMap id="userMap" type="com.kami.domain.User">
                <!-- 主键字段的对应-->
                <id property="userId" column="id"></id>
                <!-- 非主键字段的对应-->
                <result property="userName" column="username"></result>
                <result property="userAddress" column="address"></result>
                <result property="userSex" column="sex"></result>
                <result property="userBirthday" column="birthday"></result>
            </resultMap>
        
        1. 查询所有的配置中将resultType替换成resultMap属性
            <!-- 查询所有 -->
            <select id="findAll" resultMap="userMap">
                select * from user;
            </select>
        

第四章 Mybatis实现DAO层开发

  1. 自己来写dao的实现类->【实际开发不自己来写
  2. 注:PreparedStatement对象,它的执行方法

第五章 SqlMapConfig.xml配置文件

  1. properties
    • 注:URL与URI的区别
  2. typeAliases标签和package标签
    • 注:Mappers下的package标签

详细的原文

详页连接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂野小白兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值