Mybatis简介
是一款优秀的持久层框架,用于简化JDBC开发
持久层就是负责将数据保存到数据库的那一层代码
JavaEE三层结构:表现层,业务层,持久层
框架:
就是一个半成品软件,是一套可重用、通用的,软件基础代码模型
能使构建软件更加高效、规范、通用、可扩展
JDBC的缺点
1.硬编码:
-
注册驱动,获取连接
-
SQL语句
2.操作繁琐:
-
手动设置参数
-
手动封装结果集
MyBatis对于JDBC的简化
硬编码→配置文件
注册驱动:MyBatis-config.xml
SQL语句:UserMapper.xml中写SQL语句
操作繁琐→自动完成
MyBatis执行类里面调用sqlSession.xxx方法,给定参数就能查询出结果,然后自动封装为对应的对象,例如User
List<User> users = sqlSession.selectList("test.selectAll");
MyBatis快速入门
查询user表中所有数据步骤简介
- 创建user表,添加数据
- 创建模块,导入坐标
- 编写MyBatis核心配置文件- - - >替换连接信息,解决硬编码问题
- 编写SQL映射文件- - - >统一管理SQL语句,解决硬编码问题
- 编码:
-
定义POJO类 对应user表
-
加载核心配置文件,获取sqlSessionFactory对象
-
获取SqlSession对象执行Sql语句
-
释放资源
开始操作:
1.创建数据库并创建tb_user表
create database mybatis;
use mybatis;
drop table if exists tb_user;
create table tb_user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
gender char(1),
addr varchar(30)
);
INSERT INTO tb_user VALUES (1, 'zhangsan', '123', '男', '北京');
INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津');
INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');
2.创建模块,导入坐标:
new Modules创建maven项目;
在pom.xml中导入坐标
<!--导入依赖-->
<dependencies>
<!--导入mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--导入数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.29</version>
</dependency>
<!--junit单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- 添加slf4j日志api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.20</version>
</dependency>
<!-- 添加logback-classic依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 添加logback-core依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
在写完导入logback的代码以后,需要将logback.xml配置文件放到对应的resources里面去
3.编写MyBatis核心配置文件
在resources里面创建一个mybatis的核心配置文件mybatis-config.xml 名字自己取
在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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--加载Sql映射文件-->
<mappers> //指定当前mapper映射文件的路径,若在平级直接写文件名即可
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
4.编写Sql映射文件
取名规范***表名Mapper.xml***,例如:
UserMapper.xml或者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">
<!--namespace:名称空间-->
<mapper namespace="test">
<!--
id是Sql语句的唯一标识,不能重复
resultType是返回结果的类型,将来要包装成什么就写什么
例如我要封装为user类,那就写上创建一个uer类,然后在此处写上user类的目录
-->
<select id="selectAll" resultType="com.study.pojo.User">
select * from tb_user;
</select>
</mapper>
5.编码
-
定义POJO类:创建user实体类
package com.study.pojo;
public class User {
private Integer id ;
private String username ;
private String password ;
private String gender ;
private String addr ;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", gender='" + gender + '\'' +
", addr='" + addr + '\'' +
'}';
}
}
-
编写MyBatis核心测试类 MybatisDemo
package com.study;
import com.study.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.io.IOException;
import java.util.List;
//mybatis的快速入门
public class MybatisDemo {
public static void main(String[] args) throws IOException {
//加载mybatis核心文件配置,获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//需要导包并抛出异常
//获取sqlSession对象,用它来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//查询所有用selectAll,查询一个用selectOne
//执行sql,返回List集合
List<User> users = sqlSession.selectList("test.selectAll");
//输出结果
System.out.println(users);
//释放资源
sqlSession.close();
}
}
输出:
[User{id=1, username='zhangsan', password='123', gender='男', addr='北京'}, User{id=2, username='李四', password='234', gender='女', addr='天津'}, User{id=3, username='王五', password='11', gender='男', addr='西安'}]
完成
MyBatis代理开发
目的
- 就是解决原生mybatis中仍然存在的硬编码的问题:
- 简化后期SQL
原生:
//执行sql,返回List集合
List<User> users = sqlSession.selectList("test.selectAll");
mapper代理开发:
//获取接口代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class)
//执行方法,其实就是执行SQL语句,userMapper中的方法和userMapper中定义的是能对应上的
List<User> users = userMapper.selectAll();
使用步骤
1.定义接口
定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
-
在pojo的同级目录下新建mapper的包,在包里面新建与映射文件同名的接口:userMapper
-
在resources处new一个Directory,命名为UserMapper.xml,例如:
com/study/mapper这里要格外注意,不能用点,只能用***斜杠***
然后将resources中的UserMapper.xml文件移到改文件夹里面去
2.命名
设置SQL映射文件的namespace属性为Mapper接口全限定名
<mapper namespace="com.study.mapper.userMapper">
3.定义方法
在Mapper接口中定义方法,方法名就是SQL映射文件中SQL语句的ID,并保持参数类型和返回值类型一致
public interface userMapper {
List<User> selectAll();
//SQL语句中是查询所有,所以返回的是很多个User,一个用List,里面存放一个一个的User
}
4.更改目录
完成这些以后,mybatis-config.xml文件中的mapper resource也需要更改,跟改为移动后的目录:
“Copy Path - Path From Source Root”
<mapper resource="com/study/mapper/userMapper.xml"/>
5.编码
- 通过sqlSession的getMapper方法获取Mapper接口的代理对象
//3.1获取userMapper接口的代理对象
userMapper mapper = sqlSession.getMapper(userMapper.class);
-
调用对应方法完成sql的执行
-
List<User> userList = mapper.selectAll();
尽管这样,当mapper文件过多时,此方式还是需要一个一个的写上xml文件的路径,这就很费时,此时,只要我们遵守了MyBatis的相关规则,就能使用一个更简化的方法:“包扫描”
在mybatis-config文件中:
<mappers> <!--加载Sql映射文件--> <!-- <mapper resource="com/study/mapper/userMapper.xml"/> mapper代理方式 --> <package name="com.study.mapper"/> 这样写就明确的指明了mapper文件的存放目录,就回去扫描并加载,以后不管存在多少个,一行代码搞定 </mappers>
MyBatis核心文件配置
环境配置(envirouments)
- 类起别名(typeAliases)
mybatis-config.xml
<typeAliases>
<package name="com.study.pojo"/>
<!--意思是给pojo下的所有实体类起了一个别名,这个别名就是类名不区分大小写了,
也不用带包的名称,这样在写返回值类型世界就能直接写user-->
</typeAliases>
userMapper.xml:
<select id="selectAll" resultType="user">
返回值类型中就不用写包名,直接写上别名就可以了
对于基本数据类型而言,会自动配置别名,这样在写返回值类型时就不用区分大小写
顶层结构
configuration(配置)
1.propeties(属性)
2.settings(设置)
3.typeAliases(类型别名)
4.typeHandlers(类型处理器)
5.objectFactory(对象工厂)
6.plugins(插件)
7.envirouments(环境配置)
enviroument(环境变量)
transaction(事务管理器)
dataSource(数据源)
8.databaseProvider(数据库厂商标识)
9.mapper(映射器)
在配置各个标签时,需要遵循前后顺序
比如常用的typeAliases就必须放在mapper前面,否则就会报错