MyBatis01
1.理论
1.1历史
1)MyBatis是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了Google Code,随着开发团队转投Google Code旗下, iBatis3.x 正式更名为MyBatis ,代码于2013年11月迁移到Github
2)iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis 提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
3) 什么是持久层框架?
看到持久层--> 保存到磁盘的技术。
持久层的框架很多很多: jdbc-->jdbcTemplate-->mybatis\jpa\Hibernate......
1.2简介
1) MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
2) MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
3) MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
4) Mybatis 是一个半自动的ORM(Object Relation Mapping)框架,Hibernate 完全的ORM
数据库 -----映射关系----- java实体
因为mybatis 还需要编写sql语句才能操作数据库,Hibernate无需操作数据库,直接操作java代码即可实现增删改查 from User
1.3为什么选择MyBatis?
越接近底层的技术,运行速度越快,编写的代码越困难
JDBC ---> Hibernate (封装的有点狠)
随着互联网的发展,我们要求编码速度要快,运行速度也要快,就选择了一个折中的方案--MyBatis
随着MyBatis越来越流行,开发人员觉得MyBatis也有一些编码上的问题---MyBatis-Plus
2.入门案例
第一步:新建一个java的maven项目。打包方式写成 jar
第二步:导入依赖的jar包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
第三步:导入log4j的配置文件,因为我们将来想在控制台打印日志
在resources 文件夹下,放log4j.properties
关于Log4J的内容说明
五种日志级别 debug info warn error fatal 级别依次提高,级别越低,打印出来的日志越多
第四步:数据库中建立相应的表格customer
第五步:编写Customer对应的实体 POJO
package com.qfedu.pojo;
import java.util.Date;
public class Customer {
private int id;
private String name;
private String phone;
private String email;
private String level;
private Date createTime;
private Date endTime;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
@Override
public String toString() {
return "Customer{" +
"id=" + id +
", name='" + name + '\'' +
", phone='" + phone + '\'' +
", email='" + email + '\'' +
", level='" + level + '\'' +
", createTime=" + createTime +
", endTime=" + endTime +
'}';
}
}
第六步:创建一个全局的配置文件(mybatis 有两种配置文件,一种是总配置,一种是小配置文件)
创建一个SqlMapConfig.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>
<!--配置数据库连接的环境-->
<environments default="development">
<environment id="development">
<!--使用jdbc默认的事务-->
<transactionManager type="JDBC"></transactionManager>
<!--使用默认的数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/hqll"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
第七步:创建接口文件
com.qfedu.mapper包下,创建CustomerMapper.java 接口
package com.qfedu.mapper;
import com.qfedu.pojo.Customer;
public interface CustomerMapper {
public Customer getCustomerById(int id);
}
第八步:创建小配置文件-- CustomerMapper.xml
该配置文件所在的目录结构以及名字要和接口完全一致
<?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">
<mapper namespace="com.qfedu.mapper.CustomerMapper">
<select id="getCustomerById" resultType="com.qfedu.pojo.Customer">
select * from customer where id=#{id}
</select>
</mapper>
第九步:将小配置文件,告知给主配置文件
第十步:测试
@Test
public void testSelect01() throws IOException {
//测试mybatis
String resource="SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sessionFactory.openSession();
CustomerMapper customerMapper = sqlSession.getMapper(CustomerMapper.class);
Customer customer = customerMapper.getCustomerById(14);
System.out.println(customer);
}
以上方案--mapper接口编程,讲究以下几点照应:
1、接口名称和xml的配置文件名称一致,路径一致。
2、CustomerMapper.xml中的namespace 必须是接口的全路径
3、sql 中的id 必须是接口的方法名
4、SQL中的resultType必须和方法名的返回值一致。
2.三、一些细节上的配置
1、如果配置了log4j 日志不输出
<!--解决一些同学控制台日志不打印的问题-->
<settings>
<setting name="logImpl" value="log4j"/>
</settings>
SqlMapConfig.xml中各种标签是有先后书写顺序的,顺序不对就报错。
2、能不能给各个实体起别名?
<!--起别名-->
<typeAliases>
<!--给某个实体起别名-->
<!--<typeAlias type="com.qfedu.pojo.Customer" alias="customer"/>-->
<!--指定一个包,该包下的所有的实体全部起别名,别名就是自己的类名,不区分大小写-->
<!--
Customer customer
cUstomer
-->
<package name="com.qfedu.pojo"/>
</typeAliases>
mybatis自身也给一个数据类型起了别名,别名如下:
3、每次编写一个mapper .xml都需要在SqlMapConfig.xml中进行报备,能不能有种简写的方式
<mappers>
<!--告知主配置文件,我的配置文件在哪里-->
<!--指定一个配置文件-->
<!--<mapper resource="com/qfedu/mapper/CustomerMapper.xml"/>-->
<!--指定一个包名,该包名下所有的xxxxMapper.xml全部加载进来-->
<package name="com.qfedu.mapper"/>
</mappers>
4、之前我们使用jdbc.properties来配置数据源,现在能够还使用这种方式吗?
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<!--使用jdbc默认的事务-->
<transactionManager type="JDBC"></transactionManager>
<!--使用默认的数据库连接池-->
<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>
标签中的顺序如下: properties < settings < typeAliases < environments < mappers
官方给出的标签顺序如下:
完整的SqlMapConfig.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>
<!--通过该标签,将db.properties文件给加载过来-->
<properties resource="db.properties"/>
<!--解决一些同学控制台日志不打印的问题-->
<settings>
<setting name="logImpl" value="log4j"/>
</settings>
<!--起别名-->
<typeAliases>
<!--给某个实体起别名-->
<!--<typeAlias type="com.qfedu.pojo.Customer" alias="customer"/>-->
<!--指定一个包,该包下的所有的实体全部起别名,别名就是自己的类名,不区分大小写-->
<!--
Customer customer
cUstomer
-->
<package name="com.qfedu.pojo"/>
</typeAliases>
<!--配置数据库连接的环境-->
<environments default="development">
<environment id="development">
<!--使用jdbc默认的事务-->
<transactionManager type="JDBC"></transactionManager>
<!--使用默认的数据库连接池-->
<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>
<mappers>
<!--告知主配置文件,我的配置文件在哪里-->
<!--指定一个配置文件-->
<!--<mapper resource="com/qfedu/mapper/CustomerMapper.xml"/>-->
<!--指定一个包名,该包名下所有的xxxxMapper.xml全部加载进来-->
<package name="com.qfedu.mapper"/>
</mappers>
</configuration>