MyBatis学习

Posted miantiao312

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis学习相关的知识,希望对你有一定的参考价值。

1、Mybatis入门Demo实践

A、添加用户
B、更新用户
C、删除用户

重点:mysql自增主键返回

添加用户时候,如何返回自增主键?
<!-- 添加用户 -->
<insert id="insertUser" parameterType="com.kid.mybatis.pojo.User">
    <!-- selectKey将主键返回,需要再返回
         keyProperty:返回的主键存储在pojo中的哪个属性
         order:selectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,
          所以这里selectKey的执行顺序为after;resultType:返回的主键是什么类型
         LAST_INSERT_ID():是mysql的函数,返回auto_increment自增列新记录id值。 
     -->
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
        select LAST_INSERT_ID()
    </selectKey>
    
        insert into user(username,birthday,sex,address) 
        value(#{username},#{birthday},#{sex},#{address})
</insert>

添加selectKey实现将主键返回
    keyProperty:返回的主键存储在pojo中的哪个属性
    order:selectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after
    resultType:返回的主键是什么类型
    LAST_INSERT_ID():是mysql的函数,返回auto_increment自增列新记录id值。

Mysql使用 uuid实现主键

<insert id="insertUser" parameterType="com.kid.mybatis.pojo.User">
    <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">
        select uuid()
    </selectKey>
        insert into user(username,birthday,sex,address) 
        value(#{username},#{birthday},#{sex},#{address})
</insert>
注意这里使用的order是"BEFORE"

1、继续操作 User.xml实现用户的删除和更新

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

<!-- 更新用户数据 -->
<update id="updateUser" parameterType="com.kid.mybatis.pojo.User">
    update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
    where id=#{id}
</update>

2、测试文件

//创建会话工厂
private SqlSessionFactory sqlSessionFactory = null;

@Before
public void createSqlSessionFactory() throws Exception {
    //第一步:创建一个SQLSessionFactoryBuilder对象。
    SqlSessionFactoryBuilder sessionFactoryBuilder=new SqlSessionFactoryBuilder();
    //第二步:加载配置文件。
    InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    //第三步:创建SQLSessionFactory对象
    sqlSessionFactory = sessionFactoryBuilder.build(inputStream);
}

@Test   //添加用户信息
public void insertTest() {
    // 数据库会话实例
    SqlSession sqlSession = null;
    try {
        // 创建数据库会话实例sqlSession
        sqlSession = sqlSessionFactory.openSession();
        //创建User对象
        User user = new User();
        user.setUsername("赵云");
        user.setBirthday(new Date());
        user.setSex("2");
        user.setAddress("上海");
        //插入数据
        sqlSession.insert("insertUser",user);
        System.out.println(user.getId());
        //提交事务
        sqlSession.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        sqlSession.close();
    }
}

@Test //删除用户
public void deleteUserById() {
    //数据库会话实例
    SqlSession sqlSession=null;
    try {
        // 创建数据库会话实例sqlSession
        sqlSession=sqlSessionFactory.openSession();
        //删除用户
        sqlSession.delete("deleteUserById",16);
        sqlSession.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }
}

@Test //更新用户数据
public void uodateUserTest() {
    // 数据库会话实例
    SqlSession sqlSession = null;
    try {
        sqlSession = sqlSessionFactory.openSession();
        // 添加用户信息
        User user = new User();
        user.setId(26);
        user.setUsername("张小明");
        user.setAddress("陕西西安");
        user.setSex("1");
        sqlSession.update("updateUser", user);
        // 提交事务
        sqlSession.commit();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }
}

总结

1、Mybatis解决jdbc编程的问题

a、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
  解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。

b、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
  解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

c、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
  解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。

d、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
  解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。

2、mybatis与hibernate不同

a、Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML  
   或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

b、Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求  
   不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。  
   但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

c、Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发  
   可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

以上是关于MyBatis学习的主要内容,如果未能解决你的问题,请参考以下文章

markdown [mybatis参考]关于mybatis #mybatis的一些片段

Mybatis 学习笔记总结

Mybatis学习笔记:动态SQL

SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

mybatis动态sql片段与分页,排序,传参的使用

MyBatis动态SQL标签用法