简介
•MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
•MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
•MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old/Ordinary Java Objects,普通的Java对象)映射成数据库中的记录.
使用mybatis的原因
•MyBatis是一个半自动化的持久化层框架。
•JDBC
–SQL夹在Java代码块里,耦合度高导致硬编码内伤
–维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
•Hibernate和JPA
–长难复杂SQL,对于Hibernate而言处理也不容易
–内部自动生产的SQL,不容易做特殊优化。
–基于全映射的全自动框架,javaBean存在大量字段时无法只映射部分字段。导致数据库性能下降。
–
•对开发人员而言,核心sql还是需要自己优化
•sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。
•可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。成为业务代码+底层数据库的媒介
MyBatis和数据库的交互有两种方式:
1.使用传统的MyBatis提供的API;
2. 使用Mapper接口
一:使用传统的MyBatis提供的API链接数据库
一:基础环境搭建
1.依赖jar包:
mysql 驱动不要使用6以上,会报:
java.sql.SQLNonTransientConnectionException: CLIENT_PLUGIN_AUTH is required
2.创建表:
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(32) NOT NULL COMMENT '用户名称',
`birthday` DATE DEFAULT NULL COMMENT '生日',
`sex` CHAR(1) DEFAULT NULL COMMENT '性别',
`address` VARCHAR(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
3.创建实体User:
private Integer id;
private String username;
private String birthday;
private String sex;
private String address;
// ...getter、setter
二.创建MyBatis全局配置文件以及映射文件
1.全局配置文件traditionSqlMapConfig.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>
<!-- 配置mybatis的环境信息。和spring整合后 environments配置将废除 environment可能有多个,default是要使用的那个 -->
<environments default="development">
<environment id="development">
<!--TransactionManager:使用什么类型的事务管理机制 Type: POOLED :MyBatis会创建PooledDataSource实例
UNPOOLED :MyBatis会创建UnpooledDataSource实例 JNDI :MyBatis会从JNDI服务上查找DataSource实例,然后返回使用 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<!-- 不使用配置文件 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="mysql" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 加载配置文件 -->
<mapper resource="com/review/bean/UserTest.xml" />
</mappers>
</configuration>
2..创建SQL映射文件user.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">
<!-- namespace:配置名称空间,对配置的statement进行分类管理
此时名称可以任意
当使用Mapper代理时,namespace具有特殊的含义与功能
-->
<mapper namespace="test">
<!-- id:可以通过id找到执行的statement,statement唯一标识 简称statementID,通常 第一个参数加上namespace -->
<select id="getUserById" parameterType="int" resultType="com.review.bean.User">
select * from user where id=#{id}
</select>
</mapper>
3.编码测试
public void testGetUserById() throws IOException {
// 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
// 查找配置文件创建输入流
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("config/SqlMapConfig.xml");
// 加载配置文件,创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sfb.build(inputStream);
// 创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行查询,参数一:要查询的statementId ,参数二:sql语句入参
User user = sqlSession.selectOne("test.getUserById", 1);
// 输出查询结果
System.out.println(user);
// 释放资源
sqlSession.close();
}
结果:
二:使用mapper映射文件链接数据库
规则:
- namespace必需是接口的全路径名
- 接口的方法名必需与映射文件的sql id一致
- 接口的输入参数必需与映射文件的parameterType类型一致
- 接口的返回类型必须与映射文件的resultType类型一致
根据MyBatis 的配置规范配置好后,通过SqlSession.getMapper(XXXMapper.class) 方法,MyBatis 会根据相应的接口声明的方法信息,通过动态代理机制生成一个Mapper 实例,我们使用Mapper 接口的某一个方法时,MyBatis 会根据这个方法的方法名和参数类型,确定Statement Id,底层还是通过SqlSession.select("statementId",parameterObject);或者SqlSession.update("statementId",parameterObject); 等等来实现对数据库的操作。
MyBatis 引用Mapper 接口这种调用方式,纯粹是为了满足面向接口编程的需要。(其实还有一个原因是在于,面向接口的编程,使得用户在接口上可以使用注解来配置SQL语句,这样就可以脱离XML配置文件,实现“0配置”)。
基础环境搭建:
1.创建mapperSqlMapConfig,xml
2.创建OrderMapper.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">
<!-- 1. namespace必需是接口的全路径名
2. 接口的方法名必需与映射文件的sql id一致
3. 接口的输入参数必需与映射文件的parameterType类型一致
4. 接口的返回类型必须与映射文件的resultType类型一致
-->
<mapper namespace="com.review.mapper.OrderMapper">
<select id="getOrderById" parameterType="int" resultType="com.review.bean.Order">
select * from `Order` where id=#{id};
</select>
</mapper>
3.创建OrderMapper接口:
package com.review.mapper;
import com.review.bean.Order;
public interface OrderMapper {
public Order getOrderById(int id);
}
4.建表语句
CREATE TABLE `order` (
`id` int(11) NOT NULL auto_increment,
`user_id` int(11) NOT NULL COMMENT '下单用户id',
`number` varchar(32) NOT NULL COMMENT '订单号',
`createtime` datetime NOT NULL COMMENT '创建订单时间',
`note` varchar(100) default NULL COMMENT '备注',
PRIMARY KEY (`id`),
KEY `FK_orders_1` (`user_id`),
CONSTRAINT `FK_order_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8
5.编码测试
public void testGetOrderById() throws IOException {
// 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
// 查找配置文件创建输入流
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("mapperSqlMapConfig.xml");
// 加载配置文件,创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sfb.build(inputStream);
// 创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
Order order = mapper.getOrderById(7);
System.out.println(order);
// 释放资源
sqlSession.close();
}
注意事项:
项目经历过重构,包名+类名可能出错
1.项目整体结构图:
2.找不到资源文件
idea:打开Project Setting -->Modules:资源文件夹设置为Sources Folder
具体参考: