• mybatis基础


    流行的ORM框架

    对象关系映射(Object Relational Mapping,简称ORM)

    1.JPA:本身是一种ORM规范,不是ORM框架.由各大ORM框架提供实现.

    2.Hibernate:目前最流行的ORM框架.设计灵巧,性能一般(自己去控制性能,不是很好控制),文档丰富.(完全自动操作)

     

    Hibernate是一个完整ORM框架,常规CRUD我们不需要写一句SQL;

     

    3.MyBatis:本是apache的一个开源项目iBatis,提供的持久层框架包括SQL Maps(Mapper)Dao,允许开发人员直接编写SQL(更好灵活).(Sql操作方式)

     

    MyBatis 并不是一个完整的ORM框架,因为我们还需要自己去写全部SQL

     

    1.1. JDBC操作数据库缺陷

     

    首先,通过jdbc也能实现对象实体和数据库关系的映射.那就是采用硬编码方式,为每一种可能的数据库访问操作提供单独的方法。 也就是各种Dao(UserDao DeptDao)

     

    最大的缺点就是:

     

       1sql写在JAVA代码中改修改sql必须修改代码,需要重新编译。

     

       2、有很多重复性的操作(比如获取连接,释放资源等)

     

     

     ORM框架工作原理

     

    1、以一定的映射方式,实体模型和数据库关系的映射

     

    2ORM框架启动时加载这些映射和数据库配置文件

     

    3ORM通过对最原生jdbc的封装提供更加便利的操作API

     

     

     

    MyBatis核心配置文件(SqlSessionFactory)

     

    1.1. 配置MyBatis-Config.xml提示信息

    <configuration>

    <!-- 环境们 (很多环境的意思)

    default:默认使用哪一个环境(必需对应一个环境的id)

     -->

    <environments default="development">

    <!--

    一个环境  id:为这个环境取唯一一个id名称

    -->

    <environment id="development">

    <!--  

    事务管理   type:JDBC(支持事务)/MANAGED(什么都不做)

    -->

    <transactionManager type="JDBC" />

    <!-- 数据源, 连接池  type(POOLED):MyBatis自带的连接池 -->

    <dataSource type="POOLED">

    <!-- 连接数据库的参数 -->

    <property name="driver" value="com.mysql.jdbc.Driver" />

    <property name="url" value="jdbc:mysql:///mydb" />

    <property name="username" value="root" />

    <property name="password" value="admin" />

    </dataSource>

    </environment>

    </environments>

       <!-- 这个mappers代表的是相应的ORM映射文件 -->

    <mappers>

    <mapper resource="cn/itsource/domain/ProductMapper.xml" />

    </mappers>

    </configuration>

     

     

    MyBatis-Config.xml

    <configuration>

    <!-- 引入Properties文件 -->

    <properties resource="db.properties"></properties>

    <environments default="development">

    <environment id="development">

    <transactionManager type="JDBC" />

    <dataSource type="POOLED">

    <!-- 根据key拿到properties中的value-->

    <property name="driver" value="${db.driver}" />

    <property name="url" value="${db.url}" />

    <property name="username" value="${db.username}" />

    <property name="password" value="${db.password}" />

    </dataSource>

    </environment>

    </environments>

    <mappers>

    <mapper resource="cn/itsource/domain/ProductMapper.xml"/>

    </mappers>

    </configuration>

     

    db.properties

    db.driver=com.mysql.jdbc.Driver

    db.url=jdbc:mysql:///test0303

    db.username=root

    db.password=admin

    import java.io.Reader;

     

    import org.apache.ibatis.io.Resources;

    import org.apache.ibatis.session.SqlSession;

    import org.apache.ibatis.session.SqlSessionFactory;

    import org.apache.ibatis.session.SqlSessionFactoryBuilder;

    public class MyBatisUtils {

    // 保证SqlSessionFactory是单例

    private static SqlSessionFactory sqlSessionFactory;

    // SqlSessionFactory类似于JPAEntityManagerFactoryHibernateSessionFactory

    // SqlSession 类似于JPAEntityManagerHibernateSession

    static {

    try {

    Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");

    sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

    } catch (Exception e) {

    e.printStackTrace();

    throw new RuntimeException("解析MyBatis的配置文件或者映射文件出现异常:" + e.getMessage());

    }

    }

     

    // 对外提供一个类

    public static SqlSession getSession() {

    return sqlSessionFactory.openSession();

    }

    }

    官方的说法是该参数的作用是:“允许JDBC支持自动生成主键,需要驱动兼容”,如何理解这句话的意思?
    其本意是说:对于支持自动生成记录主键的数据库,如:MySQL,SQL Server,此时设置useGeneratedKeys参数值为true,在执行添加记录之后可以获取到数据库自动生成的主键ID。

    parameterType ,入参的全限定类名或类型别名

       keyColumn ,设置数据表自动生成的主键名。对特定数据库(如PostgreSQL),若自动生成的主键不是第一个字段则必须设置

       keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中

       useGeneratedKeys ,取值范围true|false(默认值),设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。MySQL和SQLServer执行auto-generated key field,因此当数据库设置好自增长主键后,可通过JDBC的getGeneratedKeys方法获取。但像Oralce等不支持auto-generated key field的数据库就不能用这种方法获取主键了
    -------------------

    mybatis三大核心对象

    SqlSessionFactoryBuilder

     这个类可以被实例化,使用和丢弃。一旦你创建了SqlSessionFactory后,这个SqlSessionFactoryBuilder类就不需要存在了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是本地方法变量)

    SqlSessionFactory

    一旦被创建,SqlSessionFactory应该在你的应用执行期间都存在。没有理由来处理或重新创建它。使用SqlSessionFactory的最佳实践是在应用运行期间不要重复创建多次。这样的操作将被视为是非常糟糕的。因此SqlSessionFactory的最佳范围是应用范围。

    有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。然而这两种方法都不认为是最佳实践。这样的话,你可以考虑依赖注入容器,比如Spring。这样的框架允许你创建支持程序来管理单例SqlSessionFactory的生命周期。

     

    SqlSession

    每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能被共享,也是线程不安全的。因此最佳的范围是请求或方法范围。

    绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中。

    也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Serlvet架构中的HttpSession

    如果你现在正用任意的Web框架,要考虑SqlSession放在一个和HTTP请求对象相似的范围内。

    parameterType:需要传入我们的对象

    useGeneratedKeys: 是否需要主键

    keyColumn:主键所在的列,这个可以不用写,但是建议写上

    keyProperty:对象中的属性(代表主键的那个属性)

     

     Log4j日志框架

     

    Log4j有三个主要的组件:Loggers(记录器)Appenders (输出源)Layouts(布局)

     

    1.1.1. 日志等级

     

    等级从低到高(大小写没有关系,但是在配置的时候建议都写大写)

     

    TRACE:详细  (建议开发的时候用)

     

    Debug:调试,类似于System.out.print

     

    Info:信息,类似于JPA打印sql等级

     

    Warn:警告,程序可以正常运行,出现提示

     

    Error:错误,出现异常  (建议正式环境)

     

    1.1.1. log4j.properties

     

    要在项目中打开日志,大家在资源文件根目录下创建一个log4j.properties的文件,并把下面的代码拷备到里面。

     

     

     

     

     

     

     

  • 相关阅读:
    python2的比较函数,cmp
    快速排序
    如果a,b,c为自然数,a+b+c=1000,a方+b方=c方,求出abc可能的组合(python实现)
    python之join
    python之functools partial
    Python 3 iter函数用法简述
    python线程之condition
    python 线程 event
    getattr getattribute setattr hasattr delattr
    Properties类
  • 原文地址:https://www.cnblogs.com/wzscom/p/10484090.html
Copyright © 2020-2023  润新知