Mybatis的总结(自己见解)

什么是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>

以上是对mybatis的简单总结,也是自己的见解,如有不足,感谢纠正

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值