赞
踩
自动映射:(对于自动映射可以分为两种情况:)
全局配置文件
<settings>
<!-- autoMappingBehavior : 默认值为partial(要为大写), 表示单表连接的时候是开启自动映射的, 但是多表的时候是不开启自动映射的-->
<setting name="autoMappingBehavior" value="PARTIAL"/>
</settings>
映射配置文件
<?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标签用来配置对应的映射关系, 我们的sql语句就是在mapper中的对应的某些子标签中写的-->
<mapper namespace="com.ffyc.dao.DemoMapper">
<select id="findDemo1" resultType="Demo1" parameterType="integer">
-- 这个时候显然是一个简单的单表查询, 单表查询之下默认的autoMappingBehavior属性值是partial, 也就是单表插叙的情况之下是开启自动映射的
select * from demo1 where id = #{id}
</select>
</mapper>
要被代理的接口
package com.ffyc.dao;
import com.ffyc.model.Demo1;
public interface DemoMapper {
public Demo1 findDemo1(Integer id);
}
接收结果集的实体类
package com.ffyc.model; public class Demo1 { private Integer id; private String name; private String gender; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "Demo1{" + "id=" + id + ", name='" + name + '\'' + ", gender='" + gender + '\'' + '}'; } }
数据表
USE mybatisdb
CREATE TABLE demo1
(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
gender VARCHAR(20)
)
测试类:
package com.ffyc.test; import com.ffyc.dao.DemoMapper; import com.ffyc.model.Demo1; 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.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; public class DemoTest { @Test public void test1() throws IOException { InputStream mappers = Resources.getResourceAsStream("mybatisConfig.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(mappers); SqlSession sqlSession = build.openSession(); DemoMapper mapper = sqlSession.getMapper(DemoMapper.class); Demo1 demo1 = mapper.findDemo1(1); System.out.println(demo1); } }
<!-- mapUnderscoreToCamelCase : 默认值为false, 这里我们设置的是true, 表示的是开启下换线和驼峰命名转换-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
自定义resultMap : 实现自定义映射(高级结果集映射)
使用resultMap标签和select标签中的resultMap属性来完成resultMap标签:
① : type属性用来表示需要自定义规则的java类型
② : id属性是唯一表示,对应select标签中的resultMap属性
属性文件: (我们将要连接的数据库的信息存到一个属性文件中)
user=root
password=mysql
url=jdbc:mysql://localhost:3306/mybatisdb?serverTimezone=Asia/Shanghai
driverClass=com.mysql.cj.jdbc.Driver
全局配置文件:
<?xml version="1.0" encoding="UTF-8" ?> <!--xml约束--> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--Mybatis全局配置中的根标签--> <configuration> <!-- 注意: configuration标签中的子标签是由顺序的, 如果我们要看顺序的时候可以点到mybatis-3-config.dtd文件中去看一下--> <!-- 使用properties标签来导入属性文件, 后面我们就可以使用${属性名}的方式来获取到配置文件中的配置值--> <properties resource="config.properties"></properties> <!-- settings标签是用来做数据库连接的时候的一些设置的, settings标签中可以通过name和value属性值来对数据库连接的时候进行一定的设置, 可以设置的值有很多, 我们后面一一讲解--> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> <!-- autoMappingBehavior : 默认值为partial, 表示单表连接的时候是开启自动映射的, 但是多表的时候是不开启自动映射的--> <setting name="autoMappingBehavior" value="PARTIAL"/> <!-- mapUnderscoreToCamelCase : 默认值为false, 这里我们设置的是true, 表示的是开启下换线和驼峰命名转换--> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!-- typeAliases标签就是类型别名, 也就是起别名的, 我们主要用来给某个JavaBean起别名或者给某个JavaBean所在的包起别名 注意: 如果我们是给某个JavaBean起别名的时候要使用到typeAliases标签中的typeAlias子标签, 并且要给这个子标签设置两个属性值 1. type属性: 想起别名的某个JavaBean的全类名 2. alias属性: alias属性表示的就是别名--> <typeAliases> <!-- 使用package来给包起别名,使用package子标签的使用只用使用其中的name属性,当我们给name属性赋值之后这个包名就直接通过最后一级包名直接访问--> <package name="com.ffyc.model"/> </typeAliases> <!-- environments标签用来配置数据环境, default属性来选取默认环境--> <environments default="development"> <environment id="development"> <!-- 事件管理器, 说明时间管理使用的是原生JDBC的--> <transactionManager type="JDBC"/> <!-- 配置数据源, type属性指定了是使用数据库连接池的方式来配置数据源, 如果type属性指定为UNPOOLED就是表示的没有使用数据库连接池--> <dataSource type="POOLED"> <!-- property标签用来配置数据源, 其中name属性的取值是固定的, 其中name为driver表示的是驱动类,记住: 我们的驱动类是mysql厂商实现的, 所以是mysql在jdbc的前面, 所以是com.mysql.cj.jdbc.Driver 其中name属性为url表示的是数据库的地址: 我们的url是jdbc在前面: jdbc:mysql://localhost:3306/数据库名?serverTimeZone=Asia/上海 其中name属性为username表示的是数据库账号: 其中name属性为password表示的是数据库密码--> <property name="driver" value="${driverClass}"/> <property name="url" value="${url}"/> <property name="username" value="${user}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- mappers标签用在核心文件中加载映射文件, 这里我们要注意: resource相对路径都是从resources文件夹下开始的, 这里还要注意: 我们此时mappers是一级文件夹, 并不是包, 文件夹之间是/(斜杠)隔开--> <mappers> <mapper resource="mappers/GradeMappering.xml"/> </mappers> </configuration>
映射文件:
<?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标签用来配置对应的映射关系, 我们的sql语句就是在mapper中的对应的某些子标签中写的--> <mapper namespace="com.ffyc.dao.GradeDao"> <!-- 注意: 对于如果我们的表是一对多关系的时候, 我们就要使用collection标签来对一个集合属性进行封装--> <resultMap id = "GradeMap" type = "Grade"> <id column = "id" property = "id"></id> <result column="name" property="name"></result> <!-- 注意: 我们如果使用分步查询的时候, 这个时候如果我们要引入的select标签就是在当前xml文件中, 那么我们就直接使用id就可以导入, 不用在指定命名空间 也就是如果我们要引入的select就是在当前命名空间中的时候, 这个时候直接使用id定位--> <collection property="students" ofType="student" javaType="list" select = "findStudents" column = "id"></collection> </resultMap> <!-- 注意: 这个时候由于我们的年级对学生是一对多的关系, 并且如果我们此时要在一对多的关系上完成分页, 那么这个时候一定要使用分步查询--> <select id="findGradeList" resultMap="GradeMap"> SELECT * FROM grade </select> <select id="findStudents" resultType="Student"> -- 注意: 我们如果是执行的查询操作的时候, 我们一定要指定resultType, 但是注意: -- 对于 parameterType属性我们可以不用指定, 我们可以使用TypeHander进行类型推断 select name,num from student where id = #{gradeid} </select> </mapper>
被代理的接口:
package com.ffyc.dao;
import com.ffyc.model.Grade;
import java.util.List;
public interface GradeDao {
List<Grade> findGradeList();
}
两个Java实体类:
Grade类
package com.ffyc.model; import java.util.List; public class Grade { private int id; private String name; private List<Student> students; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } @Override public String toString() { return "Grade{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
Student类
package com.ffyc.model; public class Student { private Integer id; private String name; private String num; private Grade grade; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNum() { return num; } public void setNum(String num) { this.num = num; } public Grade getGrade() { return grade; } public void setGrade(Grade grade) { this.grade = grade; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", num='" + num + '\'' + ", grade=" + grade + '}'; } }
测试类:
package com.ffyc.test; import com.ffyc.dao.AdminMapper; import com.ffyc.dao.GradeDao; import com.ffyc.model.Admin; import com.ffyc.model.Grade; 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.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class GradeTest { @Test public void findGradeList() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("mybatisConfig.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = build.openSession(); GradeDao gradeDao = sqlSession.getMapper(GradeDao.class); List<Grade> gradeList = gradeDao.findGradeList(); System.out.println(gradeList); //如果没有提交事物的时候我们的执行了预编译之后假如出错了, 但是这个时候我们如果主键是自增的, 那么即使预编译之后即使没有提交事物, 这个时候主键还是会自增 sqlSession.commit(); sqlSession.close(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。