MyBatis学习笔记2-CURD          返回主页

注意点

  1. 注意,在mapper.xml中定义的statement的sql语句,不能写分号,否则无法识别
  2. parameterType支持基本数据类型,类类型
  3. 当插入的类型是实体POJO类型时,sql参数中写的#{}接受的是POJO的属性,可以使用Struts2的OGNL表达式解析,${}也可以使用Struts2的OGNL表达式解析实体中的属性
  4. 添加记录的主键返回: 在mysql中使用lastinsertid()获取刚刚插入的记录的自增主键值

插入 C


需求:user对象插入到数据库后,新记录的主键要通过user对象返回,通过user获取主键值。

解决思路: 通过LASTINSERTID()获取刚插入记录的自增主键值,在insert语句执行后,执行select LASTINSERTID()就可以获取自增主键。

        <!-- 插入用户
        selectKey:用于主键的返回
        在insert语句执行之后执行select LAST_INSERT_ID()就能获取到自增主键
        order:selectKey执行顺序,相对于insert而言
        keyProperty:将主键值赋值给那个属性

         -->
        <insert id="insertUser" parameterType="com.mybatis.po.User">
            <selectKey order="AFTER" resultType="int" keyProperty="id">
                select LAST_INSERT_ID()
            </selectKey>
            insert into user(username, birthday, sex, address)
            values(#{username},#{birthday},#{sex},#{address})
        </insert>

使用mysql的uuid机制生成主键:Before**

使用uuid生成主键的好处是不考虑数据库移植后主键冲突问题。

实现思路: 先查询uuid得到主键,将主键设置到user对象中,将user对象插入数据库。

实现 oracle数据库主键返回,如何做??Before** oracle没有自增主键机制,使用序列完成主键生成。

实现思路: 先查询序列得到主键,将主键设置到user对象中,将user对象插入数据库。

修改 U

    <!--
        用户更新
        要求必须有主键
        -->
        <update id="updateUser" parameterType="com.mybatis.po.User">
            update user set username=#{username}, birthday=#{birthday}, sex=#{sex}, address=#{address}
            where id=#{id}
        </update>

        @Test
        //更新用户
        public void updateUser() {
            //建立sqlSession
            SqlSession session = sessionFactory.openSession();
            //创建插入的数据对象
            User user = new User();
            user.setId(31);
            user.setUsername("ladygaga");
            user.setSex("1");
            user.setBirthday(new Date());
            user.setAddress("不要问我从哪里来");
            try {
                session.update("test.updateUser", user);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭sqlSession
                session.commit();
                session.close();
            }
            System.out.println("更新用户的id" + user.getId());
        }

查询 R

            <select id="findUserById" parameterType="int" resultType="com.mybatis.po.User">
                select * from user where id=#{id}
            </select>

            @Test
            //根据id查询用户,得到单条记录
            public void TestFindByid() {
                //建立sqlSession
                SqlSession session = sessionFactory.openSession();
                try {
                    user = session.selectOne("test.findUserById", 1);

                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    //关闭sqlSession
                    session.close();
                }
                System.out.println(user);
            }

删除 D

        <!-- 删除用户-->
        <delete id="deleteUser" parameterType="int">
            delete from user where id=#{id}
        </delete>

            @Test
            //删除用户
            public void testDelete() {
                //建立sqlSession
                SqlSession session = sessionFactory.openSession();
                try {
                    session.delete("test.deleteUser", 30);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    //关闭sqlSession
                    session.commit();
                    session.close();
                }
            }

Mybatis与Hibernate的区别

企业开发进行技术选型 ,考虑mybatis与hibernate适用场景。

mybatis:

  1. 入门简单,程序容易上手开发,节省开发成本 。
  2. mybatis需要程序员自己编写sql语句,是一个不完全 的ORM框架,对sql修改和优化非常容易实现 。
  3. mybatis适合开发需求变更频繁的系统,比如:互联网项目。

hibernate:

  1. 入门门槛高,如果用hibernate写出高性能的程序不容易实现。
  2. hibernate不用写sql语句,是一个 ORM框架。
  3. hibernate适合需求固定,对象数据模型稳定,中小型项目,比如:企业OA系统。

总之,企业在技术选型时根据项目实际情况,以降低成本和提高系统 可维护性为出发点进行技术选型。

小结

  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。 解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
  2. Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。 解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
  3. 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。 解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
  4. 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。 解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。