代码改变世界

mybatis基础

2019-03-06 16:27  缩酒  阅读(176)  评论(0编辑  收藏  举报

流行的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的文件,并把下面的代码拷备到里面。