持久层优秀框架MyBatis
1 mybatis引入
https://mybatis.org/mybatis-3
MyBatis中文戳这里
1.1 框架
框架软件的半成品,解决了软件开发过程当中的普适性问题,从而简化了开发步骤,提供了开发的效率。
1.2 ORM框架
- ORM(Object Relational Mapping)对象关系映射,将程序中的一个对象与表中的一行数据一一对应。
- ORM框架提供了持久化类与表的映射关系,在运行时参照映射文件的信息,把对象持久化到数据库中。
1.3 使用JDBC完成ORM操作的缺点
存在大量的冗余代码。
手工创建 Connection、Statement 等。
手工将结果集封装成实体对象。
查询效率低,没有对数据访问进行过优化(Not Cache)。
2 MyBatis框架
2.1 概念
- MyBatis本是Apache软件基金会的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了Google Code,并且改名为MyBatis 。2013年11月迁移到Github。
- MyBatis是一个优秀的基于Java的持久层框架,支持自定义SQL,存储过程和高级映射。
- MyBatis对原有JDBC操作进行了封装,几乎消除了所有JDBC代码,使开发者只需关注 SQL 本身。
- MyBatis可以使用简单的XML或Annotation来配置执行SQL,并自动完成ORM操作,将执行结果返回。
2.2 访问与下载
官方网站:http://www.mybatis.org/mybatis-3/
下载地址:https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.1
3 Myabtis入门
文件配置可以直接官网cv
3.1 pom.xml中引入MyBatis核心依赖
<!-- 导入Mybatis的依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- 导入mysql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
3.2 创建MyBatis核心配置文件
在src-mian-resource路径下创建并配置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">
<!--mybatis的核心配置-->
<configuration>
<!--mybatis环境配置 default:选择环境配置 -->
<!--environments:多环境配置 default:选中环境-->
<environments default="development">
<!--mybatis具体环境配置-->
<!--环境配置 id:唯一表示-->
<environment id="development">
<!--mybatis的事务管理配置,默认使用的是JDBC的事务管理(未来使用Spring提供的事务管理) -->
<transactionManager type="JDBC"/>
<!--mybatis的数据源配置(配置数据类的连接信息),默认使用的是JDBC的数据源(未来使用Druid数据源)-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 关联接口的mapper映射配置文件 -->
<mappers>
<!--关联映射文件(加载配置文件)-->
<mapper resource="EmpMapper.xml"/>
</mappers>
</configuration>
dtd约束
<!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>
3.3 定义实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private Date hiredate;
private Double sal;
private Double comm;
private Integer deptno;
}
3.4 创建Mapper接口
public interface EmpMapper {
List<Emp> selectAll();
}
3.5 配置映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
mybatis 映射配置文件
namespace:命名空间(区分不同的接口,namespace要与接口的一致)
-->
<mapper namespace="priv.yinying.mapper.EmpMapper">
<!--
select标签:表示查询操作(insert、delete、update)
id属性:必填,表示接口的中方法的名称(完全一致)
resultType属性:返回的类型,必须要写全限定名
无论查询的结果是单个的实体类,还是List集合,都写单一类型
List<Emp>、Emp
-->
<select id="selectAll" resultType="priv.yinying.pojo.Emp">
select * from emp
</select>
</mapper>
3.6 关联映射文件
<!-- 关联接口的映射配置文件 -->
<mappers>
<mapper resource="EmpMapper.xml"/>
</mappers>
3.7 编写测试类
empList.forEach(new Consumer<Emp>() {
@Override
public void accept(Emp emp) {
System.out.println(emp);
}
});
for (Emp emp : empList) {
System.out.println(emp);
}
- 编写Mybatis核心配置文件(配置数据源以及mybatis的相关配置)
- 编写接口的Mapper映射文件
- 在主配置文件中关联Mapper映射文件
- 测试
- 创建SqlSession(Mybatis操作数据库的对象)对象
- 通过SqlSession创建接口的代理对象
- 通过接口代理对象调用接口中的方法
public class MybatisTest {
@Test
public void test01() throws IOException {
//1、获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
//2、通过sfb获取SqlSessionFactory对象 (加载mybatis的核心配置文件)
SqlSessionFactory sf = sfb.build(Resources.getResourceAsStream("mybatis-config.xml"));
//3、通过sf获取SqlSession对象。
SqlSession sqlSession = sf.openSession();
//4、通过SqlSession对象获取Mapper对象(EmpMapper接口的实现类是由Mybatis使用动态代理技术实现的)
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
//最终的目的(获取EmpMapper的对象,对象selectAll方法)
List<Emp> empList = empMapper.selectAll();
for (Emp emp : empList) {
System.out.println(emp);
}
}
}
4 mybatis三种开发方式
4.1 方式1 (开发常用)
- 编写Mapper接口
- 编写映射文件
- 通过SqlSession获取Mapper对象,调用对应的方法
与上述案例一致
4.2 方式2 (MyBatis提供的API)
- 编写映射文件
- 通过SqlSession调用对应的方法
映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace:命名空间,用于标识Mapper映射文件
-->
<mapper namespace="empMapper">
<select id="getAll" resultType="priv.yinying.pojo.Emp">
select * from emp
</select>
</mapper>
测试类
public class MyBatisTest02 {
@Test
public void test01() throws IOException {
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
SqlSessionFactory sf = sfb.build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sf.openSession();
List<Object> list = sqlSession.selectList("empMapper.getAll");
//最终的目的:调用xml映射文件中的getAll方法
list.stream().forEach(System.out::println);
}
}
4.3 方式3 (注解开发)
- 编写Mapper接口。使用注解
- 通过SqlSession获取Mapper对象,调用对应的方法
Mapper接口
public interface EmpMapper {
@Select("select * from emp")
List<Emp> findAll();
}
测试类
@Test
public void test01() throws IOException {
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
SqlSessionFactory sf = sfb.build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sf.openSession();
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
List<Emp> empList = empMapper.findAll();
empList.forEach(System.out::println);
}
5 mybatis开发细节
5.1 properties配置文件
对于mybatis-config.xml的核心配置中,如果存在需要频繁改动的数据内容,可以提取到properties中。
driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///java?useSSL=false
username=root
password=123456
修改mybatis-config.xml。数据源配置
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
5.2 类型名
为实体类定义别名,提高书写效率。
<!-- 设置类型别名 -->
<typeAliases>
<!-- 只能给单个的类型设置别名 -->
<!-- <typeAlias type="priv.yinying.pojo.Emp" alias="cxk"/>-->
<!-- 给整个包下的类设置别名 默认的别名就是类型的名称 -->
<package name="priv.yinying.pojo"/>
</typeAliases>
5.3 创建log4j配置文件
开启mybatis日志
<configuration> <!--引入外部的配置文件--> <properties resource="db.properties"></properties> <!--mybatis的全局配置--> <settings> <!--开启mybatis日志配置--> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <!--类型别名配置--> <typeAliases> <!--对单个类进行别名配置--> <!--<typeAlias type="priv.yinyinyg.pojo.User" alias="abc"/>--> <!--对整个包下所有的类进行配置,别名默认是类名(不区分大小写) 比如别名是 dept/user--> <package name="priv.yinying.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <!-- mybatis事务管理器 当前是默认的(JDBC) 未来用spring提供的事务管理器 --> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <!-- & &字符--> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <!-- resource后面跟文件 class后面跟类 --> <!--关联映射文件(加载配置文件) --> <mapper resource="UserMapper.xml"/> <mapper resource="DeptMapper.xml"/> <!--关联Mapper接口(加载注解)--> <mapper class="priv.yinying.mapper.UserMapper2"/> <!-- <mapper resource="org/mybatis/example/BlogMapper.xml"/>--> </mappers> </configuration>
pom.xml添加log4j依赖
<!-- 引入日志依赖 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
添加log4j.properties文件
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
日志级别说明
级别 | 描述 |
---|---|
ALL LEVEL | 打开所有日志记录开关;是最低等级的,用于打开所有日志记录。 |
DEBUG | 输出调试信息;指出细粒度信息事件对调试应用程序是非常有帮助的。 |
INFO | 输出提示信息;消息在粗粒度级别上突出强调应用程序的运行过程。 |
WARN | 输出警告信息;表明会出现潜在错误的情形。 |
ERROR | 输出错误信息;指出虽然发生错误事件,但仍然不影响系统的继续运行。 |
FATAL | 输出致命错误;指出每个严重的错误事件将会导致应用程序的退出。 |
OFF LEVEL | 关闭所有日志记录开关;是最高等级的,用于关闭所有日志记录。 |