zoukankan      html  css  js  c++  java
  • 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的文件,并把下面的代码拷备到里面。

     

     

     

     

     

     

     

  • 相关阅读:
    训练总结
    图论--最短路--SPFA模板(能过题,真没错的模板)
    图论--最短路-- Dijkstra模板(目前见到的最好用的)
    The 2019 Asia Nanchang First Round Online Programming Contest B Fire-Fighting Hero(阅读理解)
    关于RMQ问题的四种解法
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 K题 center
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 XKC's basketball team
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 D Carneginon
    ZOJ 3607 Lazier Salesgirl (枚举)
    ZOJ 3605 Find the Marble(dp)
  • 原文地址:https://www.cnblogs.com/wzscom/p/10484090.html
Copyright © 2011-2022 走看看