mybatis框架
介绍
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
使用步骤
1.创建maven项目,并在pom.xml中导入mybatis依赖
<?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>org.example</groupId>
<artifactId>mybatis-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--Mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</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>
2.创建数据库表
create table tb_student(
id int auto_increment comment '学生唯一标识',
stu_name varchar(50) not null comment '学生名字',
stu_sex int null comment '学生性别,1:男;2:女',
stu_class int null comment '学生所在班级编号',
stu_home varchar(255) null comment '学生家庭住址',
constraint tb_student_pk
primary key (id)
)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci comment '学生表';
CREATE TABLE `tb_class` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '编辑编号',
`cl_name` varchar(50) NOT NULL COMMENT '班级名称',
`cl_num` int NOT NULL COMMENT '班级人数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='班级表'
create table tb_teacher(
id int auto_increment comment '教师编号',
te_name varchar(50) not null comment '教师名称',
te_age int not null comment '教师年龄'
constraint tb_teacher_pk
primary key (id)
)comment '教师表';
3.创建实体类,TbStudent,TbTeacher,TbClass
package com.lm.entity;
public class TbClass {
private Integer id;
private String clName;
private String clNum;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
public String getClName() {return clName;}
public void setClName(String clName) {this.clName = clName;}
public String getClNum() {return clNum;}
public void setClNum(String clNum) {this.clNum = clNum;}
}
package com.lm.entity;
public class TbStudent{
private Integer id;
private String stuName;
private Integer stuSex;
private String stuClass;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
public String getStuName() {return stuName;}
public void setStuName(String stuName) {this.stuName = stuName;}
public Integer getStuSex() {return stuSex;}
public void setStuSex(Integer stuSex) {this.stuSex = stuSex;}
public String getStuClass() {return stuClass;}
public void setStuClass(String stuClass) {this.stuClass = stuClass;}
}
package com.lm.entity;
public class TbTeacher {
private Integer id;
private String teName;
private Integer teAge;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
public String getTeName() {return teName;}
public void setTeName(String teName) {this.teName = teName;}
public Integer getTeAge() {return teAge;}
public void setTeAge(Integer teAge) {this.teAge = teAge;}
}
4.创建持久层的dao接口,定义操作数据库的方法
package com.lm.dao;
import com.lm.entity.TbStudent;
import java.util.List;
public interface TbStudentDao {
/**
* 获取所有学生信息
* @return
*/
List <TbStudent> getAllStudents();
}
5.创建一个mybatis使用的映射文件(用来写sql的xml文件)
注意:该xml目录默认需要创建在与dao接口同目录下,且名称与dao接口保持一致
TbStudentDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--
1.指定约束文件
mybatis-3-mapper.dtd是约束文件的名称,扩展名是dtd
2.约束文件的作用:限制,检查在当前文件中出现的标签,属性必须符合mybatis的要求,即指定的约束文件,标签就不能乱写
-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
3.mapper:当前文件的跟标签,必须存在
namespace:命名空间,表示当前文件在整个项目中的唯一标识。可以是自定义的字符串,不过一般是dao接口的全限定名称
-->
<mapper namespace="com.lm.dao.TbStudentDao">
<!--
4.在当前文件中,可以使用特定的标签,表示数据库的特定操作
<select>:表示查询操作
<update>:表示更新数据库操作
<insert>:表示插入操作
<delete>:表示删除操作
-->
<!--
select :查询
id:要执行的sql语法的唯一标识,mybatis会使用这个id值来找到要执行的sql语句,可以自定义,要求使用接口中的方法名称
resultType:表示结果类型,是sql语句执行后得到resultSet,遍历这个ResultSet得到指定的java对象类型
-->
<select id="getAllStudents" resultType="com.lm.entity.TbStudent">
select id,stu_name,stu_sex,stu_class,stu_home from tb_student
</select>
<resultMap id="ResultMap" type="com.lm.entity.TbStudent">
<!--
column:查询结果集中返回字段的字段名
property:对应实体类中的属性名;
可以理解为将结果集中的一个column字段映射到实体类中的一个属性中
-->
<id column="sid" property="id"></id>
<result column="stuName" property="stuName"></result>
<result column="stuHome" property="stuHome"></result>
<result column="stuSex" property="stuSex"></result>
<association property="tbClass" javaType="com.lm.entity.TbClass">
<id property="id" column="cid"></id>
<result column="clName" property="clName"></result>
<result column="clNum" property="clNum" ></result>
</association>
</resultMap>
<select id="getStudentById" resultMap="ResultMap">
select ts.id as 'sid',ts.stu_name as 'stuName',ts.stu_home as 'stuHome',ts.stu_sex as 'stuSex',tc.id as 'cid',tc.cl_name as 'clName',tc.cl_num as 'clNum' from tb_student ts,tb_class tc where ts.stu_class=tc.id and ts.id = #{id}
</select>
<!--
插入操作
-->
<insert id="insertStudent" parameterType="com.lm.entity.TbStudent">
insert into tb_student(id,stu_name,stu_sex,stu_class,stu_home)
values(#{id},#{stuName},#{stuSex},#{stuClass},#{stuHome})
</insert>
</mapper>
6.在resource目录下创建mybatis的主配置文件,一个项目对应一个主配置文件
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--
mybatis主配置文件:主要定义了数据库的配置信息,如sql映射文件的位置、数据库环境等
mybatis-3-config.dtd:mybatis配置文件的约束名称
-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--
configuration:跟标签,表示配置信息
-->
<configuration>
<settings>
<!--开启驼峰匹配原则-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--
环境配置:数据库连接信息
default:必须和environment中的某个id值一样,表示当前正在使用的环境
-->
<environments default="development">
<!--
environment:一个数据库信息的配置,可以有多个
id:一个表示环境的唯一值
-->
<!--开发环境-->
<environment id="development">
<!--
transactionManager:mybatis事务类型
type:表示事务处理类型
JDBC:表示使用Connection对象的commit,rollback来做事务处理
-->
<transactionManager type="JDBC"/>
<!--
dataSource:表示数据源,用来连接数据库
type:表示数据源的类型
POOLED:表示使用连接池
-->
<dataSource type="POOLED">
<!--
driver,user,username,password是固定的,不能自定义
driver:表示数据库举动
url:表示连接数据库的具体地址
username:表示连接数据库的用户名
password:表示连接数据库的密码
-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/vuedemo?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="1234576"/>
</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:3360/onlineDb?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="1234576"/>
</dataSource>
</environment>
</environments>
<!--
mappers:用来指定sql映射文件的位置
-->
<mappers>
<!--一个mapper标签指定一个文件的位置,可以有多个,从类路径开始的信息(编译后target/calsses(类路径))-->
<mapper resource="com/lm/dao/TbStudentDao.xml"/>
<!-- <mapper resource="com/lm/dao/TbTeacherDao.xml"></mapper>-->
</mappers>
</configuration>
7.创建测试类
package com.lm.test;
import com.lm.entity.TbStudent;
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 Demo {
/**
* 测试类
* 访问mybatis并读取student数据
* @param args
*/
public static void main(String[] args) throws IOException {
//1.定义mybatis主配置文件的名称,从类路径的根开始
String config = "mybatis-config.xml";
//2.读取配置文件
InputStream stream = Resources.getResourceAsStream(config);
//3.创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//4.创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(stream);
//5.获取SqlSession对象,从SqlSessionFactory对象中获取
SqlSession sqlSession = factory.openSession();
//6.指定要执行的sql语句表示。sql映射文件中namespace+"."+标签id值
String sqlId = "com.lm.dao.TbStudentDao.getAllStudents";
//7.执行sql语句,通过sqlId找到语句
List<TbStudent> students = sqlSession.selectList(sqlId);
//8.打印结果集
students.forEach(stu -> System.out.println(stu));
//9.关闭sqlSession对象
sqlSession.close();
}
}