一起学习框架SSM之MyBatis(一)

引言

1.什么是框架

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法。简单理解就是为了方便我们程序员开发 减少代码量及代码质量的工具

2.什么是ORM框架

  • ORM:对象关系映射,将程序的一个对象与表中的一行数据一一对应
  • ORM框架提供了持久化类与表的映射关系,通过映射配置文件的信息,把对象持久化到数据库中

3.使用JDBC完成ORM操作的缺点

  • 存在大量的冗余代码
  • 手动创建Connetion,Statement等
  • 手动将结果集封装成实体对象
  • 查询效率低,没有对数据访问进行优化

Mybatis框架

1.概念

Mybatis是一个优秀的基于Java的持久层框架,最原有的JDBC操作进行了封装,使开发者只需要关注sql本身,配置相关的文件就可以达到自动完成ORM的操作

2.下载

官网:http://www.mybatis.org/mybatis-3/
下载:http://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.1

构建Maven项目

这个就不详细说了,不会的可以看“一起学习框架SSM之Spring”

Mybatis环境搭建

1.引入Mybatis依赖包

在这里插入图片描述

2.创建Mybatis配置文件

在这里插入图片描述

mybatis开发步骤

1.定义实体类

在这里插入图片描述
在这里插入图片描述

2.定义DAO接口

在这里插入图片描述
有了mybatis的话就不需要定义DAO接口的实现类,进行数据操作,编写Mapper.xml来做这样的工作

3.编写Mapper.xml

在这里插入图片描述
编写后,mybatis会启动后会动态生成Dao接口的实现类

4.注册Mapper

在这里插入图片描述
MyBatis启动只会加载MyBatis配置文件,所以要把mapper文件注册到MyBatis配置文件上

5.测试

在这里插入图片描述

优化以及细节

  • 数据库的连接信息和参数可以通过properties文件来统一管理,为以后更好的维护
    在这里插入图片描述
    在这里插入图片描述
  • mapper.xml文件下的resultType=“cn.ozl.entity.User” 由于会多次使用生成该实体类,避免每次都写如此冗长的代码,可以给其加个类的别名
    在这里插入图片描述
    在这里插入图片描述
    可是如果有多个实体类,就需要每次去更改别名,也是非常繁琐的,解决方案如下:
    在这里插入图片描述
    在 < typeAliases > 标签下定义实体类所在的包,每个实体类都会自动注册一个别名 这个别名就是实体类名
    在这里插入图片描述

创建log4j配置文件

1.pom.xml加入lo4j依赖

在这里插入图片描述

2.创建并配置log4.properties

在这里插入图片描述
在这里插入图片描述

这个以后会详细去讲的,这个就先看就可以

MyBatis的CRUD操作

1.查询

1.1 序号参数绑定

前面已经提到一个序号参数绑定就是

    <select id="queryUser" resultType="User">
         select id,username,password,gender,regist_time
         from mybatis
         where id=#{
    
    arg0}<!--第一个参数的值-->
    </select>

还有一个序号参数绑定就是

1.2 注解参数绑定

UserDao

  User queryUserByPasswordById(@Param("id") Integer id, @Param("password") String password);//注解参数

UserDao-Mapper.xml

    <!--注解参数绑定-->
    <select id="queryUserByPasswordById" resultType="User">
         select id,username,password,gender,regist_time
         from mybatis
         where id=#{
    
    id} and password=#{
    
    password}
    </select>

mybatistest

        User user4 = mapper.queryUserByPasswordById(1, "123");
        System.out.println(user4);

1.3 Map参数绑定

UserDao

User queryUserByPasswordById2(Map map);//map参数

UserDao-Mapper.xml

    <!--map参数绑定-->
    <select id="queryUserByPasswordById2" resultType="User">
         select id,username,password,gender,regist_time
         from mybatis
         where id=#{
    
    id} and password=#{
    
    password}
    </select>

mybatistest

 Map map=new HashMap();
        map.put("id",2);
        map.put("password",456);
        User user5 = mapper.queryUserByPasswordById2(map);
        System.out.println(user5);

1.4 对象参数绑定

UserDao

   User queryUserByPasswordById3(User user);//对象参数

UserDao-Mapper.xml

    <!--对象参数绑定-->
    <select id="queryUserByPasswordById3" resultType="User">
         select id,username,password,gender,regist_time
         from mybatis
         where id=#{
    
    id} and password=#{
    
    password}
    </select>

mybatistest

 User user=new User();
        user.setId(1);
        user.setPassword("123");
        User user6 = mapper.queryUserByPasswordById3(user);
        System.out.println(user6);

1.5 模糊查询

UserDao

List<User> queryUserByName(@Param("username") String username);//模糊查询

UserDao-Mapper.xml

   <!--模糊查询-->
    <select id="queryUserByName" resultType="User">
         select id,username,password,gender,regist_time
         from mybatis
         where username like concat('%',#{
    
    username},'%')<!--拼接'%'-->
    </select>

mybatistest

         List<User> users = mapper.queryUserByName("q");
        System.out.println(users);
        for (User user7:users
             ) {
    
    
            System.out.println(user7);
        };

2.删除

UserDao

   void deleteUser(@Param("id") Integer id);//删除

UserDao-Mapper.xml

 <!--删除查询-->
    <delete id="deleteUser" parameterType="int">
        delete
        from mybatis
        where id=#{
    
    id}
    </delete>

mybatistest

  //        删除
        System.out.println("******************");
        mapper.deleteUser(1);
//        提交事务
        sqlSession.commit();

//        sqlSession.rollback();

3.修改

UserDao

  void updateUser(User user);//更新

UserDao-Mapper.xml

    <!--更新-->
    <update id="updateUser" parameterType="User">
        update mybatis
        set username=#{
    
    username},password=#{
    
    password}
        where id=#{
    
    id}
    </update>

mybatistest

//        更新
        User user = new User();
        user.setId(2);
        user.setUsername("tyu");
        user.setPassword("678");
        mapper.updateUser(user);
//        提交事务
        sqlSession.commit();

4.添加

UserDao

 void addUser(User user);

UserDao-Mapper.xml

    <!--添加-->
    <insert id="addUser" parameterType="User">
        insert into mybatis values(#{
    
    id},#{
    
    username},#{
    
    password},#{
    
    gender},#{
    
    regist_time})
    </insert>

mybatistest

//        添加
        User user=new User(3,"oko","34545",true,new Date());
        mapper.addUser(user);
//        提交事务
        sqlSession.commit();

主键回填

为什么要主键回填

       添加
        User user=new User(null,"oko1","345453",true,new Date());
        mapper.addUser(user);
//        提交事务
        sqlSession.commit();

        System.out.println(user);

最后的结果是:

 User{
    
    id=null, username='oko1', password='345453', gender=true, regist_time=Sun Sep 27 14:34:41 CST 2020}

在这里插入图片描述
数据库上id是有值的,但是实际上java程序中id是没有值的,这会导致后续的业务处理执行不了,因为缺少了id这个主键的值

1.通过last_insert_id()查询主键

 <!--添加-->
    <insert id="addUser" parameterType="User">
        <selectKey order="AFTER" resultType="int" keyProperty="id"><!--order决定执行的先后顺序,keyproperty是方法参数的属性名-->
            select last_insert_id()
        </selectKey>
        insert into mybatis values(#{
    
    id},#{
    
    username},#{
    
    password},#{
    
    gender},#{
    
    regist_time})
    </insert>

2.通过uuid()查询主键

    <insert id="insertStudent" parameterType="Student">
        <selectKey order="BEFORE" keyProperty="id" resultType="string">
            select replace(uuid(),'-','')
        </selectKey>
        insert into ok values (#{
    
    id},#{
    
    username})
    </insert>

未完待续。。。。

猜你喜欢

转载自blog.csdn.net/ozl520/article/details/108786023