Mybatis入门

1、mybatis 介绍   : mybatis是一个持久层框架,他是对jdbc的完美的封装

2、mybatis和hibernate的区别 :

      1、Mybatis不是一个完全的ORM的框架,hibernate是一个完全的ORM的框架

      2、工作效率: mybatis的开发的工作量相对较大,hibernate的开发效率比较高

      3、SQL灵活:mybatis支持自定义sql,对SQL的支持较好。hibernate对SQL支持相对较差

      4、没有更好的框架,只有最适合的框架。要根据当前的业务、场景来决定选择哪种框架

3、Mapper的代理方式 :

      1、接口的权限定类名要和mapeer的映射文件中的namespace一致
      2、接口的方法名称要和映射文件中statementId 保持一致
      3、接口的方法的 参数类型 要和 映射文件中的 parameterType 保持一致
      4、接口的方法的返回值类型要和 映射文件中的 resultType 保持一致

4、

  4.1 #{}${} 区别   :

        #{}表示一个占位符号通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类 型值或pojo属性值 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

        ${}表示拼接sql通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value

  4.2 parameterTyperesultType

 

parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。

 

resultType:指定输出结果类型,mybatissql查询结果的一行记录数据映射为resultType指定类型的对象。

 4.3 mysql自增主键返回

 

通过修改sql映射文件,可以将mysql自增主键返回:

 

<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">

 

<!-- selectKey将主键返回,需要再返回 -->

 

<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">

 

select LAST_INSERT_ID()

 

</selectKey>

 

   insert into user(username,birthday,sex,address)

 

    values(#{username},#{birthday},#{sex},#{address});

 

</insert>

 

添加selectKey实现将主键返回

 

keyProperty:返回的主键存储在pojo中的哪个属性

 

orderselectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after

 

resultType:返回的主键是什么类型

 

LAST_INSERT_ID():mysql的函数,返回auto_increment自增列新记录id值。

 

4.4、Mysql使用 uuid实现主键

 

需要增加通过select uuid()得到uuid

 

<insert  id="insertUser" parameterType="cn.itcast.mybatis.po.User">

 

<selectKey resultType="java.lang.String" order="BEFORE"

 

keyProperty="id">

 

select uuid()

 

</selectKey>

 

insert into user(id,username,birthday,sex,address)

 

 values(#{id},#{username},#{birthday},#{sex},#{address})

 

</insert>

 

注意这里使用的order是“BEFORE

 

 

 

 

 

 

 5、配置内容 :

 SqlMapConfig.xml中配置的内容和顺序如下

properties(属性)

settings(全局配置参数)

typeAliases(类型别名)

 typeHandlers(类型处理器)

 objectFactory(对象工厂)

 plugins(插件)

 environments(环境集合属性对象)

  environment(环境子属性对象)

    transactionManager(事务管理)

    dataSource(数据源)

mappers(映射器)

6、SqlSession的使用范围

SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。

通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。

6.1 、SqlSessionFactoryBuilder

SqlSessionFactoryBuilder用于创建SqlSessionFacotySqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。

6.2、SqlSessionFactory

SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory

6.3、 SqlSession

SqlSession是一个面向用户的接口, sqlSession中定义了数据库操作方法。

每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。

打开一个 SqlSession;使用完毕就要关闭它。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭。如下:

SqlSession session = sqlSessionFactory.openSession();

try {

   // do work

} finally {

   session.close();

}

 

 

 

    

    

posted @ 2017-08-27 20:25  程序波  阅读(279)  评论(0编辑  收藏  举报