2021-03-31

MyBatis_1

1. 什么是MyBatis?

    MyBatis是一个基于ORM的数据访问层框架。

    框架----学习JavaSE和JavaWEB的过程中,的都是基础和底层的技术,使用这些技术完全可以开发出web应用。但是使用这些技术开发的效率非常低下,并且会出现很多繁琐的步骤同时也不利于后期的代码维护和升级。于是就有一些牛逼的人物他们针对JavaSE和JavaWEB中的技术进行各种的封装,进而可以帮助开发者提高开发的效率,同时也能提升项目的性能。这些牛人封装的这些东西就称为框架

    框架本质还是Java程序这些程序特别原始和底层的代码进行了封装,然后把这些封装以后的程序打包之后提供给开发人员使用。帮助开发者提高开发的效率,同时也能提升项目的性能。

数据访问层--通常我们在左项目的时候,会把一个项目分成3个部分,这3个部分分别是:

  1. 控制层[web层]----用来做数据的导航【Servlet、Struts2、SpringMVC
  2. 业务层----用来处理相关功能的具有实现业务。【Spring】
  3. 数据访问层[数据持久层]---用来访问数据库数据。【JDBC、Hibernate、MyBatis

早期javaweb的3大框架---SSH[Struts2-Spring-Hibernate]

现在流行的javaweb的3大框架---SSM[SpringMVC-Spring-MyBatis]

2. 什么是ORM?

    ORM---对象关系映射

    我们在访问数据库的时候所编写的都是Java程序,Java程序只认识Java对象,而我们所访问的数据库大多数都是关系型数据库,那么这时Java程序要想访问关系型数据库,那么就需要将Java对象转换成关系型数据,才能被数据库认识。

    这时我们可以认为一个Java类就是关系型数据库中的一张数据表,Java类中的成员变量是数据库表中的一个列,Java类创建的Java对象就是数据库表中的一行记录。这时将Java对象对应成为数据库表记录的过程就是对象关系映射【ORM】。

3. 为什么要使用MyBatis?

  1. 为了简化数据库访问操作,提高开发的效率提升项目的性能,增加程序的可维护性
  2. 当我们使用Java程序控制Java对象的时候,数据库中的数据表记录会随之变化。【将原来通过java程序访问数据库表的操作,简化成通过java程序访问java对象】

使用MyBatis框架

  1. 准备数据库表
create  table t_person(
per_id int primary key auto_increment,
per_name varchar(20),
per_age int,
per_address varchar(30)
);
  1. 创建maven工程
  2. 添加jar依赖
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.38</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.4.6</version>
</dependency>

4. 参考数据库表,创建javaBean类

package com.wangxing.mybatis.bean;
public class Person {
    private int perid;
    private String pername;
    private int perage;
    private String peraddress;
    public int getPerid() {
        return perid;
    }
    public void setPerid(int perid) {
        this.perid = perid;
    }
    public String getPername() {
        return pername;
    }
    public void setPername(String pername) {
        this.pername = pername;
    }
    public int getPerage() {
        return perage;
    }
    public void setPerage(int perage) {
        this.perage = perage;
    }
    public String getPeraddress() {
        return peraddress;
    }
    public void setPeraddress(String peraddress) {
        this.peraddress = peraddress;
    }
}

5.在src/main/resources编写数据库链接字符串的配置文件【mydate.properties】

mydrivername=com.mysql.jdbc.Driver
myurl=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
myusername=root
mypassword=123456

6. 创建数据库访问接口

package com.wangxing.mybatis.mapper;
import com.wangxing.mybatis.bean.Person;
import java.util.List;
public interface PersonMapper {
    /**
     * 添加数据
     * @param person
     * @return
     */
    boolean insertPerson(Person person);
    /**
     * 修改数据
     * @param person
     * @return
     */
    boolean updatePerson(Person person);
    /**
     * 删除数据
     * @return
     */
    boolean deletePersonById(int perid);
    /**
     * 根据id查询数据
     * @return
     */
    Person selectPersonById(int perid);
    /**
     * 查询所有数据
     * @return
     */
    List<Person> selectPerson();
}

7. 在src/main/resources编写sql映射文件[PersonMapper.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wangxing.mybatis.mapper.PersonMapper">
    <insert id="insertPerson" parameterType="com.wangxing.mybatis.bean.Person">
        insert into t_person values (null,#{pername},#{perage},#{peraddress});
    </insert>
    <update id="updatePerson" parameterType="com.wangxing.mybatis.bean.Person">
        update t_person set per_name=#{pername},per_age=#{perage},per_address=#{peraddress} where per_id=#{perid};
    </update>
    <resultMap id="personMap" type="com.wangxing.mybatis.bean.Person">
        <id column="per_id" property="perid"></id>
        <result column="per_name" property="pername"></result>
        <result column="per_age" property="perage"></result>
        <result column="per_address" property="peraddress"></result>
    </resultMap>
    <select id="selectPersonById" parameterType="int" resultMap="personMap">
        select * from  t_person where per_id=#{perid};
    </select>
    <select id="selectPerson" resultMap="personMap">
        select * from  t_person;
    </select>
    <delete id="deletePersonById" parameterType="java.lang.Integer">
        delete from t_person where per_id=#{perid};
    </delete>
</mapper>

8. 在src/main/resources编写MyBatis配置文件【名称建议使用mybatis-config.xml也可以随便写

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 配置引入数据库链接字符串的资源文件 -->
    <properties resource="mydata.properties"></properties>
    <!-- 配置mybatis默认的连接数据库的环境 -->
    <environments default="development">
    <environment id="development">
        <!-- 配置事务管理器 -->
        <transactionManager type="JDBC"></transactionManager>
        <!-- 配置数据源 -->
        <dataSource type="POOLED">
            <property name="driver" value="${mydriver}"/>
            <property name="url" value="${myurl}"/>
            <property name="username" value="${myusername}"/>
            <property name="password" value="${mypassword}"/>
        </dataSource>
    </environment>
</environments>

9. 创建测试类

package com.wangxing.mybatis.test;
import com.wangxing.mybatis.bean.Person;
import com.wangxing.mybatis.mapper.PersonMapper;
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.util.List;
public class TestMain {
    public static void testInsertPerson(){
        //定义SqlSession对象
        SqlSession sqlSession=null;
        try {
            //通过SqlSessionFactoryBuilder类创建出SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //从SqlSessionFactory中取得一个SqlSession对象
            sqlSession=sqlSessionFactory.openSession();
            //通过得到数据访问接口对象调用insertPerson方法
            PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
            Person person=new Person();
            person.setPername("zhangsan");
            person.setPerage(23);
            person.setPeraddress("西安");
            personMapper.insertPerson(person);
            //提交sqlsession
            sqlSession.commit();
        }catch (Exception e){
           e.printStackTrace();
        }finally{
            sqlSession.close();
        }
    }
    public static void testUpdatePerson(){
        //定义SqlSession对象
        SqlSession sqlSession=null;
        try {
            //通过SqlSessionFactoryBuilder类创建出SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //从SqlSessionFactory中取得一个SqlSession对象
            sqlSession=sqlSessionFactory.openSession();
            //通过得到数据访问接口对象调用insertPerson方法
            PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
            Person person=new Person();
            person.setPerid(1);
            person.setPername("lisi");
            person.setPerage(24);
            person.setPeraddress("beijing");
            personMapper.updatePerson(person);
            //提交sqlsession
            sqlSession.commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            sqlSession.close();
        }
    }
    public static void testSelectPersonById(){
        //定义SqlSession对象
        SqlSession sqlSession=null;
        try {
            //通过SqlSessionFactoryBuilder类创建出SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //从SqlSessionFactory中取得一个SqlSession对象
            sqlSession=sqlSessionFactory.openSession();
            //通过得到数据访问接口对象调用insertPerson方法
            PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
            Person person=personMapper.selectPersonById(1);
            //提交sqlsession
            sqlSession.commit();
            System.out.println(person.getPerid()+"\t"+person.getPername());
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            sqlSession.close();
        }
    }
    public static void testSelectPerson(){
        //定义SqlSession对象
        SqlSession sqlSession=null;
        try {
            //通过SqlSessionFactoryBuilder类创建出SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //从SqlSessionFactory中取得一个SqlSession对象
            sqlSession=sqlSessionFactory.openSession();
            //通过得到数据访问接口对象调用insertPerson方法
            PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
            List<Person> personlist=personMapper.selectPerson();
            //提交sqlsession
            sqlSession.commit();
            System.out.println("personlist.size----"+personlist.size());
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            sqlSession.close();
        }
    }
    public static void testDeletePerson(){
        //定义SqlSession对象
        SqlSession sqlSession=null;
        try {
            //通过SqlSessionFactoryBuilder类创建出SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //从SqlSessionFactory中取得一个SqlSession对象
            sqlSession=sqlSessionFactory.openSession();
            //通过得到数据访问接口对象调用insertPerson方法
            PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
            personMapper.deletePersonById(1);
            //提交sqlsession
            sqlSession.commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            sqlSession.close();
        }
    }
    public static void main(String[] args) {
        //测试添加用户信息
        //testInsertPerson();
        //测试修改用户信息
        //testUpdatePerson();
        //测试根据id查询用户信息
        //testSelectPersonById();
        //测试查询所有用户信息
        //testSelectPerson();
        //测试根据id删除用户信息
        testDeletePerson();
    }
}

1.MyBatis执行SQL的两种方式:SqlSession和Mapper接口

  1. 用 Mapper 接口发送 SQL

 PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);

 personMapper.insertPerson(person);

通过 SqlSession 的 getMapper 方法来获取一个 Mapper 接口,就可以调用它的方法了。因为 SQL映射 文件或者接口注解定义的 SQL 都可以通过“类的全限定名+方法名”查找,所以 MyBatis 会启用对应的 SQL 进行运行,并返回结果。

实例:

package com.wangxing.mybatis.test;
import com.wangxing.mybatis.bean.Person;
import com.wangxing.mybatis.mapper.PersonMapper;
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.util.List;
public class TestMain {
    public static void testInsertPerson(){
        //定义SqlSession对象
        SqlSession sqlSession=null;
        try {
            //通过SqlSessionFactoryBuilder类创建出SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //从SqlSessionFactory中取得一个SqlSession对象
            sqlSession=sqlSessionFactory.openSession();
            //通过得到数据访问接口对象调用insertPerson方法
            PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
            Person person=new Person();
            person.setPername("zhangsan");
            person.setPerage(23);
            person.setPeraddress("西安");
            personMapper.insertPerson(person);
            //提交sqlsession
            sqlSession.commit();
        }catch (Exception e){
           e.printStackTrace();
        }finally{
            sqlSession.close();
        }
    }
    public static void testUpdatePerson(){
        //定义SqlSession对象
        SqlSession sqlSession=null;
        try {
            //通过SqlSessionFactoryBuilder类创建出SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //从SqlSessionFactory中取得一个SqlSession对象
            sqlSession=sqlSessionFactory.openSession();
            //通过得到数据访问接口对象调用insertPerson方法
            PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
            Person person=new Person();
            person.setPerid(1);
            person.setPername("lisi");
            person.setPerage(24);
            person.setPeraddress("beijing");
            personMapper.updatePerson(person);
            //提交sqlsession
            sqlSession.commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            sqlSession.close();
        }
    }
    public static void testSelectPersonById(){
        //定义SqlSession对象
        SqlSession sqlSession=null;
        try {
            //通过SqlSessionFactoryBuilder类创建出SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //从SqlSessionFactory中取得一个SqlSession对象
            sqlSession=sqlSessionFactory.openSession();
            //通过得到数据访问接口对象调用insertPerson方法
            PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
            Person person=personMapper.selectPersonById(1);
            //提交sqlsession
            sqlSession.commit();
            System.out.println(person.getPerid()+"\t"+person.getPername());
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            sqlSession.close();
        }
    }
    public static void testSelectPerson(){
        //定义SqlSession对象
        SqlSession sqlSession=null;
        try {
            //通过SqlSessionFactoryBuilder类创建出SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //从SqlSessionFactory中取得一个SqlSession对象
            sqlSession=sqlSessionFactory.openSession();
            //通过得到数据访问接口对象调用insertPerson方法
            PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
            List<Person> personlist=personMapper.selectPerson();
            //提交sqlsession
            sqlSession.commit();
            System.out.println("personlist.size----"+personlist.size());
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            sqlSession.close();
        }
    }
    public static void testDeletePerson(){
        //定义SqlSession对象
        SqlSession sqlSession=null;
        try {
            //通过SqlSessionFactoryBuilder类创建出SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //从SqlSessionFactory中取得一个SqlSession对象
            sqlSession=sqlSessionFactory.openSession();
            //通过得到数据访问接口对象调用insertPerson方法
            PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
            personMapper.deletePersonById(1);
            //提交sqlsession
            sqlSession.commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            sqlSession.close();
        }
    }
    public static void main(String[] args) {
        //测试添加用户信息
        //testInsertPerson();
        //测试修改用户信息
        //testUpdatePerson();
        //测试根据id查询用户信息
        //testSelectPersonById();
        //测试查询所有用户信息
        //testSelectPerson();
        //测试根据id删除用户信息
        testDeletePerson();
    }
}

2.SqlSession 发送 SQL

通过SqlSession对象的

int  insert(数据访问接口的包名+接口名+方法名 ,  数据访问接口的方法的参数);

int  update(数据访问接口的包名+接口名+方法名 ,  数据访问接口的方法的参数);

int  delete(数据访问接口的包名+接口名+方法名 ,  数据访问接口的方法的参数);

<T>  selectOne(数据访问接口的包名+接口名+方法名 ,  数据访问接口的方法的参数);

List<T>  selectList(数据访问接口的包名+接口名+方法名 ,  数据访问接口的方法的参数);

.......

实例:

package com.wangxing.mybatis.test;
import com.wangxing.mybatis.bean.Person;
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.util.List;
public class TestMain {
    public static void testInsertPerson(){
        SqlSession sqlSession=null;
        try{
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            sqlSession=sqlSessionFactory.openSession();
            Person person=new Person();
            person.setPername("zhangsan");
            person.setPerage(23);
            person.setPeraddress("xian");
        sqlSession.insert("com.wangxing.mybatis.mapper.PersonMapper.insertPerson",person);
            sqlSession.commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            sqlSession.close();
        }
    }
    public static void testUpdatePerson(){
        SqlSession sqlSession=null;
        try{
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            sqlSession=sqlSessionFactory.openSession();
            Person person=new Person();
            person.setPerid(1);
            person.setPername("zhangsanfeng");
            person.setPerage(123);
            person.setPeraddress("wudang");
            sqlSession.update("com.wangxing.mybatis.mapper.PersonMapper.updatePerson",person);
            sqlSession.commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            sqlSession.close();
        }
    }
    public static void testSelectPersonById(){
        SqlSession sqlSession=null;
        try{
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            sqlSession=sqlSessionFactory.openSession();
            Person person=(Person)sqlSession.selectOne("com.wangxing.mybatis.mapper.PersonMapper.selectPersonById",1);
            sqlSession.commit();
            System.out.println(person.getPerid()+"\t"+person.getPername());
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            sqlSession.close();
        }
    }
    public static void testSelectPerson(){
        SqlSession sqlSession=null;
        try{
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            sqlSession=sqlSessionFactory.openSession();
            List<Person> perlist=sqlSession.selectList("com.wangxing.mybatis.mapper.PersonMapper.selectPerson");
            sqlSession.commit();
            System.out.println("perlist.size=="+perlist.size());
            Person person=perlist.get(0);
            System.out.println(person.getPerid()+"\t"+person.getPername());
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            sqlSession.close();
        }
    }
    public static void testDeletePerson(){
        SqlSession sqlSession=null;
        try{
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            sqlSession=sqlSessionFactory.openSession();
            sqlSession.delete("com.wangxing.mybatis.mapper.PersonMapper.deletePersonById",1);
            sqlSession.commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            sqlSession.close();
        }
    }
    public static void main(String[] args) {
        //测试添加用户信息
        //testInsertPerson();
        //测试修改用户信息
        //testUpdatePerson();
        //测试根据id查询用户信息
        //testSelectPersonById();
        //测试查询所有用户信息
        //testSelectPerson();
        //测试根据id删除用户信息
        testDeletePerson();
    }
}

3.对比两种发送 SQL 方式

上面分别展示了 MyBatis 存在的两种发送 SQL 的方式,一种用 SqlSession 直接发送,另外一种通过 SqlSession 获取 Mapper 接口再发送。建议采用 SqlSession 获取 Mapper 的方式,理由如下:

  1. 使用 Mapper 接口编程可以消除 SqlSession 带来的功能性代码,提高可读性,而 SqlSession 发送 SQL,需要一个 SQL id 去匹配 SQL,比较晦涩难懂。
  2. 使用Mapper.selectPersonById(1)方式,IDE会提示错误和校验,而使用 sqlSession.selectOne(“com.wangxing.mybatis.mapper.PersonMapper.selectPersonById”,1)语法,只有在运行中才能知道是否会产生错误。

目前使用Mapper接口编程已成为主流,尤其在Spring 中运用MyBatis 时,Mapper 接口的使用就更为简单,所以本教程使用Mapper 接口发送SQL语句并执行的方式。

4.数据访问接口+注解

PersonMapper.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.wangxing.mybatis.mapper.PersonMapper">
    <resultMap id="perMap" type="com.wangxing.mybatis.bean.Person">
        <id column="per_id" property="perid"></id>
        <result column="per_name" property="pername"></result>
        <result column="per_age" property="perage"></result>
        <result column="per_address" property="peraddress"></result>
    </resultMap>
</mapper>

数据访问接口带注解

package com.wangxing.mybatis.mapper;
import com.wangxing.mybatis.bean.Person;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface PersonMapper {
    /**
     * 添加数据
     * @param person
     * @return
     */
    @Insert("insert into t_person values (null,#{pername},#{perage},#{peraddress});")
    boolean insertPerson(Person person);
    /**
     * 修改数据
     * @param person
     * @return
     */
    @Update("update t_person set per_name=#{pername},per_age=#{perage},per_address=#{peraddress} where per_id=#{perid};")
    boolean updatePerson(Person person);
    /**
     * 删除数据
     * @return
     */
    @Delete("delete from t_person where per_id=#{perid};")
    boolean deletePersonById(int perid);
    /**
     * 根据id查询数据
     * @return
     */
    @Results(id = "personMap" , value = {
            @Result(column = "per_id",property = "perid"),
            @Result(column = "per_name",property = "pername"),
            @Result(column = "per_age",property = "perage"),
            @Result(column = "per_address",property = "peraddress"),
    })
    @Select("select * from  t_person where per_id=#{perid};")
    Person selectPersonById(int perid);
    /**
     * 查询所有数据
     * @return
     */
    @Select("select * from  t_person;")
    @ResultMap("perMap")
    List<Person> selectPerson();
}

注意:

org.apache.ibatis.binding.BindingException: Type interface com.wangxing.mybatis.mapper.PersonMapper is not known to the MapperRegistry.

因为没有在MyBatis的核心配置文件中注册数据访问接口,

解决方法:在MyBatis的核心配置文件中注册数据访问接口

select * from t_user u
left join t_user_role ur on u.id = ur.user_id
left join t_role r on ur.role_id = r.id
left join t_user_info ui on u.id = ui.user_id
left join t_female_health fh on u.id = fh.user_id
left join t_male_health mh on u.id = mh.user_id
where u.user_name like concat('%', ${userName},'%')
and r.role_name like concat('%', ${roleName},'%')
and u.sex = 1
and ui.head_image is not null;

显然这条 SQL 比较复杂,如果放入 @Select 中会明显增加注解的内容。如果把大量的SQL 放入 java 代码中,显然代码的可读性也会下降。如果同时还要考虑使用动态 SQL,比如当参数 userName 为空,则不使用 u.user_name like concat('%',${userName},'%')作为查询条件;当 roleName 为空,则不使用 r.role_name like concat('%',${roleName},'%')作为查询条件,但是还需要加入其他的逻辑,这样就使得这个注解更加复杂了,不利于日后的维护和修改。

用一张图来展示 MyBatis 核心组件之间的关系。

2.MyBatis 的工作原理

下面对图中的每步流程进行说明。
1)读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。

2)加载SQL映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
3)构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。

4)创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。

5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。

8)输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。

注意:Executor 执行器执行SQL语句时,是根据SQL映射文件中对应元素的<insert><update><delete><select>的id属性值去选择对应的sql语句,由于SQL映射文件中对应元素的<insert><update><delete><select>的id属性值是数据访问接口的方法名,所以数据访问接口中的方法是不能重载的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值