一、简介
mybatis框架:是sql映射框架
1)sql mapper:sql映射
可以把数据库表中的一行数据,映射为一个javat对象。
一行数据可以看做是一个java对象,操作这个对象,就相当于操作表中的数据
2)Data Access Objects(DAOs):数据访问
对数据库执行增删改查。
mybatis提供了哪些功能:
1)提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建这个对象了
2)提供了执行sql语句的能力,不用你执行sql
3)提供了循环sql,把sql的结果转为java对象,List集合的能力
4)提供了关闭资源的能力,不用你关闭Connection,Statement,ResultSet
二、知识总结
mybatis是一个映射sql的框架,提供了数据库的操作能力。增强的JDBC,使用mybatis让开发人员集中精神写sql就可以了,不必关心Connection,Statement,ResultSet的创建、销毁。
2.1、Mybatis使用步骤
1)新建Student表
2)加入maven的mybatis依赖,mysql驱动的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>mybatisDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>mybatisDemo</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--mysql驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory> <!-- 所在的目录 -->
<includes><!-- 包括目录下的.properties,.xml 文件都会扫描到 -->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
3)创建实体类,Student -- 保存表中的一行数据
package com.test.domain;
public class Student {
private Integer userId;
private String nickname;
private String phone;
private String gender;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Student{" +
"userId=" + userId +
", nickname='" + nickname + '\'' +
", phone='" + phone + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
4)创建持久层的Dao接口,定义操作数据库的方法
package com.test.dao;
import com.test.domain.Student;
import java.util.List;
public interface StudentDao {
public List<Student> selectStudents();
}
5)创建一个mybatis使用的配置文件
叫做sql映射文件:写sql语句的。一般一个表一个sql映射文件
这个文件叫xml文件
5.1 写在接口所在目录。
5.2 文件名称和接口保持一致。
<?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.test.dao.StudentDao">
<!--
select:表示查询操作
id:你要执行的sql语句的唯一标识,mybatis会使用这个id的值来找到要执行的sql语句
可以自定义,但要求你使用接口中的方法名称。
resultType:标识结果类型的,是sql语句执行后得到ResultSet,遍历这个ResultSet得到java对象的类型。
值写的是类型的全限定名称
-->
<select id="selectStudents" resultType="com.test.domain.Student">
select userId,nickname,phone,gender from user_table
</select>
</mapper>
<!--
sql映射文件:写sql语句的,mybatis会执行这些sql
1.指定约束文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
mybatis-3-mapper.dtd 是约束文件的名称,扩展名是dtd的。
2.约束文件的作用:限制、检查在当前文件中出现的标签,属性必须符合mybatis的要求。
3.mapper 是当前文件的根标签,必须的。
namesapce:叫做命名空间,唯一值,可以是自定义的字符串。
要求你使用dao接口的全限定名称
4.在当前文件中,可以使用特定的标签,标识数据库的特定操作。
<select>:标识查询
<update>:表示更新数据库的操作,就是在<update>标签中,写的是update sql语句
<insert>:表示插入,写的是insert 语句
<delete>:标识删除,执行的是delete语句
-->
6)创建mybatis的主配置文件
一个项目就一个主配置文件
主配置文件提供了数据库的连接信息和sql映射文件的位置信息。
<?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>
<!--
环境配置,数据库的连接信息
default:必须和某个enviroment的id值一样。
-->
<environments default="mydev">
<!--
enviroment:一个数据库的配置,环境
id:一个唯一值,自定义,标识环境的名称
-->
<environment id="mydev">
<!--
transactionManager:mybatis的事务类型
type:JDBC(表示使用jdbc的connection对象的commit,rollback做事务处理)
-->
<transactionManager type="JDBC"/>
<!--
datasource:表示数据源,连接数据库
type:标识数据源的类型,POOLE表示连接池的
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/BullMane"/>
<property name="username" value="root"/>
<property name="password" value="root123456"/>
</dataSource>
</environment>
<!--表示线上的数据库,是项目真实使用的库-->
<environment id="online">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/BullMane"/>
<property name="username" value="root"/>
<property name="password" value="root123456"/>
</dataSource>
</environment>
</environments>
<!-- sql mapper(sql映射文件)的位置 -->
<mappers>
<!-- 一个mapper标签指定一个文件的位置
从类路径开始的路径信息。target/classes(类路径)
-->
<mapper resource="com/test/dao/StudentDao.xml"/>
<!-- <mapper resource="org/example/dao/SchoolDao.xml"/>-->
</mappers>
</configuration>
<!--
mybatis的主配置文件:定义了数据库的配置信息,sql映射文件的位置
1.configureation根标签
-->
7)应用mybatis在程序中
import com.test.domain.Student;
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.IOException;
import java.io.InputStream;
import java.util.List;
public class MyApp {
public static void main(String[] args) throws IOException {
//访问mybatis读取student数据
//1.定义mybatis主配置文件的名称,从类路径的根开始(target/classes)
String config = "mybatis.xml";
//2.读取这个config表示的文件
InputStream in = Resources.getResourceAsStream(config);
//3.创建SelSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//4.创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//5.获取SqlSession对象,从SqlSessionFactory中获取SqlSession
SqlSession sqlSession = factory.openSession();
//6.指定要执行的sql语句的标识。sql映射文件中的namespace+"."+标签的id值
String sqlId = "com.test.dao.StudentDao" + "." + "selectStudents";
//7.执行sql语句,通过sqlId找到语句
List<Student> studentList = sqlSession.selectList(sqlId);
studentList.forEach(stu -> System.out.println(stu));
sqlSession.close();
}
}