MyBatis (一) 基本使用
第一节:日志框架
1.1常见日志框架
在Java开发中,目前常用的日志框架包括Log4j 1,Log4j 2,Commons Logging,Slf4j,Logback,Jul。这些日志记录框架各有各的特点,各有各的应用场景。了解这些框架的特点及应用场景,有利于我们做技术选型的时候做出正确的判断。
1.2日志框架关系
1 Log4j 2与Log4j 1发生了很大的变化,Log4j 2不兼容Log4j 1。 2 Commons Logging和Slf4j是日志门面(门面模式是软件工程中常用的一种软件设计模式,也被称为正面模式、外观模式。它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用)。Log4j和Logback则是具体的日志实现方案。可以简单的理解为接口与接口的实现,调用者只需要关注接口而无需关注具体的实现,做到解耦。 3 比较常用的组合使用方式是Slf4j与Logback组合使用,Commons Logging与Log4j组合使用。 4 Logback必须配合Slf4j使用。由于Logback和Slf4j是同一个作者,其兼容性不言而喻。
未来使用Slf4j与Logback组合会越来越多
(1)Slf4j实现机制决定Slf4j限制较少,使用范围更广
(2)Logback拥有更好的性能。
(3)Logback文档免费。
1.3 log4j的使用
共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
使用maven来构建项目:
依赖信息
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
第一步:配置文件:log4j.properties :
### set log levels - for more verbose logging change 'info' to 'debug' , 'off' ###
log4j.rootLogger=info, stdout,file
###1 direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
###2 direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
###3每天生成一个文件
log4j.appender.daily=org.apache.log4j.DailyRollingFileAppender
log4j.appender.daily.File=d:\\logs\\soso.log
log4j.appender.daily.Append=true
log4j.appender.daily.Threshold=INFO
log4j.appender.daily.ImmediateFlush=true
#生成一个配置文件 命名 soso.8888-88-88-88 时间
log4j.appender.daily.DatePattern='_'yyyy-MM-dd'.txt'
log4j.appender.daily.layout=org.apache.log4j.PatternLayout
log4j.appender.daily.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
###4控制每个滚动日志文件大小和个数
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.Threshold=DEBUG
log4j.appender.R.File=d:\\logs\\test.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
log4j.appender.R.MaxFileSize=1kb
log4j.appender.R.MaxBackupIndex=5
log4j 2.x版本的使用
依赖信息
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.1</version> </dependency>
第一步:配置文件:log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="warn">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>
第二节:MyBatis简介
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(sDAO)
mybaits的代码由github.com管理,下载地址:https://github.com/mybatis/mybatis-3/releases
依赖信息
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency>
学习地址:http://www.mybatis.org/mybatis-3/zh/index.html
2.1 概述
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
MyBatis主要就完成2件事情
-
封装JDBC操作
-
利用反射打通Java类与SQL语句之间的相互转换
MyBatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,所以方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。
2.2 特点
-
简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
-
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
-
解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
-
提供映射标签,支持对象与数据库的orm字段关系映射
-
提供对象关系映射标签,支持对象关系组建维护
-
提供xml标签,支持编写动态sql
2.3 体系结构
mybatis配置文件,包括Mybatis全局配置文件和Mybatis映射文件,其中全局配置文件配置了数据源、事务等信息;映射文件配置了SQL执行相关的信息。
-
mybatis通过读取配置文件信息(全局配置文件和映射文件),构造出SqlSessionFactory,即会话工厂。
-
通过SqlSessionFactory,可以创建SqlSession即会话。Mybatis是通过SqlSession来操作数据库的。
-
SqlSession本身不能直接操作数据库,它是通过底层的Executor执行器接口来操作数据库的。Executor接口有两个实现类,一个是普通执行器,一个是缓存执行器(默认)。
-
Executor执行器要处理的SQL信息是封装到一个底层对象MappedStatement中。该对象包括:SQL语句、输入参数映射信息、输出结果集映射信息。其中输入参数和输出结果的映射类型包括java的简单类型、HashMap集合对象、POJO对象类型。
第三节:MyBatis入门
3.2 搭建MyBatis环境
第一步:创建数据库
第二步:创建java项目,并添加依赖
第三步:加入配置文件
在resources目录中添加Mybatis的核心配置mybatis-config.xml、log4j日志文件log4j.properties
第四步:创建POJO
domain
bean
entity
pojo
在不同的场合使用的对象的分类:
po : Persistent Object (持久化对象)
vo:View Object (视图对象 ,PageBean)
dto: Data Transfer Object (数据传输对象 ,系统与系统之间传递数据)
bo : Business Object (业务对象)
什么是POJO: POJO是Plain Old Java Objects的缩写,POJO实质上可以理解为简单的实体类,顾名思义POJO类的作用是方便程序员使用数据库中的数据表,对于广大的程序员,可以很方便的将POJO类当做对象来进行使用,当然也是可以方便的调用其get,set方法。
第五步:加入sql映射文件
在resources目录下创建com.vince.mapper文件夹(注意要一个一个的创建),然后创建UserMapper.xml文件
第六步:加载映射文件
MyBatis框架需要加载UserMapper.xml映射文件,将UserMapper.xml添加在mybatis-config.xml,如下:
<mappers>
<mapper resource="com/qf/mapper/UserMapper.xml"/>
</mappers>
MyBatis框架中涉及到的几个API:
-
SqlSessionFactoryBuilder:该对象负责根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory实例
-
SqlSessionFactory:每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心。该对象负责创建SqlSession对象实例。
-
SqlSession:该对象包含了所有执行SQL操作的方法,用于执行已映射的SQL语句
#{}和${}的区别:
(1)#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它任意名称。 (2)${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
parameterType和resultType
parameterType:指定输入参数类型,MyBatis通过ognl从输入对象中获取参数值拼接在sql中。 resultType:指定输出结果类型,MyBatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中
MyBatis核心配置文件:
MyBatis的核心配置mybatis-config.xml中包含内容顺序如下:
properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境集合属性对象) environment(环境子属性对象) transactionManager(事务管理) dataSource(数据源) mappers(映射器)
5.1 properties(属性)
自定义db.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/MyBatis?characterEncoding=utf-8 jdbc.username=root jdbc.password=root
mybatis-config.xml文件中引用:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//MyBatis.org//DTD Config 3.0//EN"
"http://myBatis.org/dtd/MyBatis-3-config.dtd">
<configuration>
<!-- 是用resource属性加载外部配置文件 -->
<properties resource="db.properties">
<!-- 在properties内部用property定义属性 -->
<!-- 如果外部配置文件有该属性,则内部定义属性被外部属性覆盖 -->
<property name="jdbc.username" value="root" />
<property name="jdbc.password" value="root" />
</properties>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
MyBatis 将按照下面的顺序来加载属性:
(1)在 properties 元素体内定义的属性首先被读取。
(2)然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性
typeAliases(类型别名)
MyBatis支持的别名
别名 映射的类型 _byte byte _long long _short short _int int _integer int _double double _float float _boolean boolean string String byte Byte long Long short Short int Integer integer Integer double Double float Float boolean Boolean date Date decimal BigDecimal bigdecimal BigDecimal map Map
自定义别名:
<typeAliases>
<!-- 单个别名定义 -->
<typeAlias alias="user" type="com.vince.MyBatis.pojo.User" />
<!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) -->
<package name="com.vince.pojo" />
<package name="其它包" />
</typeAliases>
mappers(映射器)
Mapper配置的几种方法: 1. <mapper resource=" " /> 使用相对于类路径的资源(现在的使用方式) 如:<mapper resource="sqlmap/User.xml" /> 2. <mapper class=" " /> 使用mapper接口类路径 如:<mapper class="com.qf.mapper.UserMapper"/> 注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。 3. <package name=""/> 注册指定包下的所有mapper接口 如:<package name="com.qf.mapper"/> 注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
把java目录中配置也编译程序中:
mapper接口动态代理方式:
pom文件中添加:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!-- 是否替换资源中的属性-->
<filtering>false</filtering>
</resource>
</resources>
</build>
总结:
编码步骤:
1 创建builder
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder ();
2 获取流读取mybatis-config.xml
3 创建SqlSessionFacotry
4 获取SqlSession
5 执行 selectOne selectList insert update delete
6 提交 关闭