什么是Mybatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
官网:
[https://mybatis.org/mybatis-3/zh/index.html]:
快速开始(套路)
1.导入依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
2.写配置依赖
dataSource
存放的就是连接数据库的基本信息mappers
放的是mappoer.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.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--这里放的是mapper.xml路径,也就是操作数数据库的操作-->
</mappers>
</configuration>
3.获取连接数据库对象
**
* mybatis的配置类
*/
public class MybatisUtils {
// SqlSessionFactory 来获取连接数据库的连接对象
static SqlSessionFactory sqlSessionFactory;
static {
try {
// 通过Resources的方法加载mybatis的配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// SqlSessionFactoryBuilder 的build 方法来获取 SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 获取连接数据库的对象
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
4操作数据库
4.1写一个UserMapper接口
- 主要就是一些用来操作数据库的方法。CRUD
public interface UserMapper {
// 获取数据库所有的用户信息
List<User> getUseList();
}
4.2写一个操作数据库的mapper.xml文件
- 操作数据库的sql语句都在这里
<?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.item.mapper.UserMapper">
<!--
id:接口里面的方法名,
resultType:返回值类型。也就是返回值是什么类型
parameterType:参数类型
resultMap:用于结果映射
-->
<select id="getUseList" resultType="com.item.entity.User" >
select * from stu
</select>
</mapper>
4.3测试
public class MybatisTest {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> useList = mapper.getUseList();
for (User user : useList) {
System.out.println(user);
}
}
}
4.5结果
User(id=1, name=李四, age=14)
User(id=2, name=王五, age=18)
User(id=3, name=小留, age=16)
User(id=4, name=赵王, age=24)
4.6错误排查
4.6.1
-
如果说报错是"2字节无效或者什么字节相关的"就把idea的字符配置改成UTF-8.mybatis和mapper文件的也该成UTF-8
-
<?xml version="1.0" encoding="UTF-8" ?>
-
-
如果说找不到
UserMapper
这个类,就是mapper映射路径吗没写,在mybatis的配置文件内加上-
<mappers> <!--这里放的是mapper.xml路径,也就是操作数数据库的操作--> <mapper resource="com/item/mapper/UserMapper.xml"/> </mappers>
-
mybatis的操作大致这个流程,其他操作实在业务层去操作
详细介绍
在学习mybatis的时候,自己的见解和总结。
mybatis的配置
properties(属性)
- 可以在外部进行配置,并可以进行动态替换。就相当于连接数据库的信息可以放到一个
db.properties
文件里。用properties
来设置
settings(设置)
- 功能非常强大,具体详情可以看官网。用的最多的也就是设置日志
typeAliases(类型别名)
- 设置实体类的别名,用的比较多。只需要在mybatis的配置文件设置就可以
environments(环境配置)
- 主要就是对数据库的信息配置,以及数据源的选择UNPOOLED/POOLED
mappers(映射器)
- 三种方式来指定去哪里找映射文件
生命周期
- 可以看官网的介绍,非常详细
动态sql ,直接看官网,例子很充足
resultMap
情况一:当数据库字段名和实体类的字段名不一样时,需要进行结果集映射
# 一个简单的用户表
create table t_user(
U_id int not null,
u_name varchar(40) not null,
u_pwdd varchar(40) not null
)
// 对应的一个实体类
public class User{
private int id;
private String name;
private String password
}
对于这种情况就可以进行关系映射
<select id="getUseList" resultType="com.item.entity.User" resultMap="" >
select * from stu
</select>
<select id="getUser" resultMap="userMap">
select * from user
</select>
<!--
type 指的是返回值的类型,
colum 指的是数据库的字段,javaType指的是实体类的字段
-->
<resultMap id="userMap" type="com.item.entity.User">
<id column="u_id" javaType="id"/>
<result column="u_name" javaType="username"/>
<result column="u_pwd" javaType="password"/>
</resultMap>
情况二:一对多的时候,例如,一个老师可以有多名学生
老师实体类里面有一个学生的集合
- collection是用于一对多的关系
public class Tecaher{
private int id;
private String name;
private List<Stu> stu
}
// 学生类
public class Stu{
private int id;
private String name;
private int tid;
}
<!--按结果嵌套查询-->
<select id="getTeacher" resultMap="StudentTeacher">
SELECT s.id sid, s.name sname,t.name tname,t.id tid
FROM student s, teacher t
WHERE s.tid = t.id AND tid = #{tid}
</select>
<resultMap id="StudentTeacher" type="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<!--复杂的属性,我们需要单独处理 对象:association 集合:collection
javaType=""指定属性的类型!
集合中的泛型信息,我们使用ofType获取
-->
<collection property="students" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
情况三:多对一,多个对手==学生对应一个老师
- association是用于一对一和多对一
public class Tecaher{
private int id;
private String name;
}
// 学生类
public class Stu{
private int id;
private String name;
private int tid;
private Teacher teacher;
}
<!--按照结果进行查询-->
<select id="getStudent2" resultMap="StudentTeacher2">
select s.id sid , s.name sname, t.name tname
from student s,teacher t
where s.tid=t.id
</select>
<!--结果封装,将查询出来的列封装到对象属性中-->
<resultMap id="StudentTeacher2" type="student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="teacher">
<result property="name" column="tname"></result>
</association>
</resultMap>