流行的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等)。
最大的缺点就是:
1、sql写在JAVA代码中改修改sql必须修改代码,需要重新编译。
2、有很多重复性的操作(比如获取连接,释放资源等)
ORM框架工作原理
1、以一定的映射方式,实体模型和数据库关系的映射
2、ORM框架启动时加载这些映射和数据库配置文件
3、ORM通过对最原生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类似于JPA的EntityManagerFactory,Hibernate的SessionFactory
// SqlSession 类似于JPA的EntityManager,Hibernate的Session
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的文件,并把下面的代码拷备到里面。