1.认识MyBatis
什么是MyBatis?
MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。
MyBatis还是一个半自动化的ORM框架,区别于Hibernate,hibernate是全自动化的ORM实现。
持久化:数据由内存中的瞬态状态转化为数据库中的持久状态过程。
ORM(Object Relational Model):这是一种理念,在对象模型和关系型数据库之间建立起对应关系,并且提供一种机制,可以让Javabean对象操作数据库中的表的数;操作指的是:增删改查,事务。
2、使用MyBatis
约定>配置>编码
添加MyBatis的依赖到项目中的pom.xml
<!--添加依mybaties赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
创建MyBatis的配置文件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> <!--读取数据库信息文件-->
<properties resource="database.properties" />
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="autoMappingBehavior" value="NONE"/>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
<!--配置mubatis的运行环境-->
<!--给实体类取别名-->
<typeAliases>
<package name="com.niit.demo.pojo"/>
<package name="com.niit.demo.vo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driverName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--配置SQL映射文件-->
<mappers>
<mapper resource="mapper/StudentMapper.xml"/>
<mapper resource="mapper/CourseMapper.xml"/>
<mapper resource="mapper/TypeMapper.xml"/>
</mappers>
</configuration>
创建SQL映射文件StudentMapper.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.niit.demo.mapper.StudentMapper">
<select id="queryStudents" resultType="Student">
select * from cs_student
</select>
<select id="queryStudentByName" parameterType="string" resultType="Student">
select *from cs_student where stu_name like concat('%',#{stuName},'%'); <!--$不会进行类型转换-->
</select>
<select id="queryStudentByCondition" parameterType="Student" resultType="Student">
select * from cs_student where stu_name like concat('%',#{stuName},'%')and grade=#{grade}
</select>
<select id="queryStudentByParam" resultMap="stuMap">
select * from cs_student where stu_name like concat('%',#{stuname},'%')and gender=#{gender}
</select>
<!--自定义java实体类对象和数据库表之间的映射关系-->
<resultMap id="stuMap" type="Student">
<id property="stuId" column="stu_id"/>
<result property="stuPass" column="stu_pass"/>
<result property="stuNumber" column="stu_number"/>
<result property="stuName" column="stu_name"/>
<result property="stuClass" column="stu_class"/>
<result property="stuAccount" column="stu_account"/>
</resultMap>
</mapper>
编写测试类的代码,实现一个MyBatis对数据库的操作
package test;
import com.niit.demo.mapper.StudentMapper;
import com.niit.demo.mapper.TypeMapper;
import com.niit.demo.pojo.Course;
import com.niit.demo.pojo.Student;
import com.niit.demo.vo.TypeVo;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
//学习Mybatis,基于Junit的单元测试
public class Mybatis {
@Test
public void fisetExcute() throws IOException {
//加载配置文件,初始化上下文
InputStream is = Resources.getResourceAsStream("mybaties-config.xml");
//创建SQLSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//创建SQLSession打开会话,与数据库建立一次会话
SqlSession sqlSession = factory.openSession();
// List<Student> stus=sqlSession.selectList("StudentMapper.queryStudents");
// List<Student> stus = sqlSession.getMapper(StudentMapper.class).queryStudents();
//List<Student> stus = sqlSession.getMapper(StudentMapper.class).queryStudentByName("四 ");
// Student stu_condition=new Student();
// stu_condition.setStuName("王");
// stu_condition.setGrade("大二");
// List<Student> stus=sqlSession.getMapper(StudentMapper.class).queryStudentByCondition(stu_condition);
List<Student> stus = sqlSession.getMapper(StudentMapper.class).queryStudentByParam("王", "1");
for (Student stu : stus) {
System.out.println("姓名:" + stu.getStuName() + "年级:" + stu.getGrade() + "地址:" + stu.getAddress() +
"pass:" + stu.getStuPass() + "Number:" + stu.getStuNumber() +
"telphone:" + stu.getTelphone() + "性别:" + stu.getGender());
}
}
测试结果
==> Preparing: select * from cs_student where stu_name like concat('%',?,'%')and gender=?
==> Parameters: 王(String), 1(String)
<== Columns: stu_id, stu_account, stu_pass, stu_number, stu_name, faculty, grade, stu_class, gender, telphone, address
<== Row: 6, wangwu, 123456, 20220213123, 王五, 信息工程学院, 大二, CS1, 1, 15123456789, 太原市中心医院
<== Row: 8, wang, 123456, 20220213125, 王文英, 信息工程学院, 大四, SE1, 1, 15123456789, 宁夏大学
<== Total: 2
姓名:王五年级:null地址:nullpass:123456Number:20220213123telphone:null性别:null
姓名:王文英年级:null地址:nullpass:123456Number:20220213125telphone:null性别:null
使用Mapper接口实现sql调用
1. 接口文件名称应该与映射文件的文件名称完全一致。2. 接口中的方法名与映射文件中某一个标签的 id 值要对应3. 映射文件中的 namespace 的值应该与接口文件的完全限定名一样4. 映射文件中的数据返回类型应该匹配具体结果的类型,和返回的数量存储集合没有关系。例如,无论你是返回一个用户还是用户列表,对于映射文件中的语句,返回值类型都应该是 User 而不是 list.
package com.niit.demo.mapper;
import com.niit.demo.pojo.Student;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface StudentMapper {
//方法名要和映射文件中查询的id要一模一样
List< Student> queryStudents();
//根据学生姓名模糊查询
List<Student> queryStudentByName(String stuName);
List<Student> queryStudentByCondition(Student student);
//借助@param注解来完成多参数入参
List<Student> queryStudentByParam(@Param("stuname") String stuName,@Param("gender") String gender);
}
XXXMapper.xml 中的配置说明
3.MyBatis的映射文件
SQL映射文件:XXXMapper.xml
别名 映射类型 别名 映射类型string String double Doublebyte Byte float Floatlong Long boolean Booleanshort Short date Dateint Integer map Mapinteger Integer hashma HashMaparraylist ArrayList list List
3.1、单条件查询--一个参数如何入参
1.接口方法上定义带一个形参的抽象方法
List<Student> queryStudentByName(String stuName);
<select id="queryStudentsByName" resultType="Student"
parameterType="string">
select * from student where StudentName like concat(#{stuName},'%')
</select>
3.2 多参数入参
方法一:封装成对象入参 适合超过3个参数时,本质是把对象转换成map方式存储的数据 key=属性名,value=属性对应的值
1.接口方法上定义一个参数,使用具体的类的定义
List<Student> queryStudentByCondition(Student student);
2.映射文件中根据类的属性名去获取参数的值
<select id="queryStudentByCondition" parameterType="Student" resultType="Student">
select * from cs_student where stu_name like concat('%',#{stuName},'%')and grade=#{grade}
</select>
方法二:使用注解@Param进行多参数入参 三个参数以内的方法
1.接口方法上定义参数并且使用@Param()注解标识
List<Student> queryStudentByParam(@Param("stuname") String stuName,@Param("gender") String gender);
2.映射文件使用#{}去取值
<select id="queryStudentByParam" resultMap="stuMap">
select * from cs_student where stu_name like concat('%',#{stuname},'%')and gender=#{gender}
</select>
3.3、自定义映射结果集
在显示学生信息的同时显示当前学生所在年级名称该如何映射?
使用resultMap可以自定义映射关系
上述问题可以使用以下步骤完成
1.添加实体类,添加属性stuId来存储学生姓名,作为扩展属性
public class Student { private Long stuId;//学生id对应cs_student表中的主键id public Long getStuId() { return stuId; } public void setStuId(Long stuId) { this.stuId = stuId; } }
2.修改Mapper映射文件,使用 resultMap 自定义映射结果
<!--自定义java实体类对象和数据库表之间的映射关系-->
<resultMap id="stuMap" type="Student">
<id property="stuId" column="stu_id"/>
<result property="stuPass" column="stu_pass"/>
<result property="stuNumber" column="stu_number"/>
<result property="stuName" column="stu_name"/>
<result property="stuClass" column="stu_class"/>
<result property="stuAccount" column="stu_account"/>
</resultMap>
ℹ resultType 与 resultaMap 区别
3.4、mybais的自动映射级别
MyBatis 自动映射分级别,可以使用 autoMappingBehavior 来进行设置,一般情况下默认是: PARTIALPARTIAL 除了一对一和一对多关系之外的映射可以全部自动映射。NONE 禁止使用自动映射FULL 全部自动映射使用自动映射的充分必要条件:查询结果 字段和属性名 要 完全一致 的情况下才可以自动映射。开启自动映射
<setting name="autoMappingBehavior" value="NONE"/>