java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis XML实现

详解MyBatis的XML实现方法(附带注解方式实现)

作者:HarryQUQ

这篇文章主要详细介绍了MyBatis的XML实现方法(附带注解方式实现),文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

这篇文章我们来简述一下MyBatis的XML实现方法(附带注解方式实现方法)。

XML

1.创建接口

创建数据层(Dao)接口,使用@Mapper注解(交由Spring掌管这个类,这样才能让其帮助我们写操作数据库的方法)。为了演示我创建一个StudentInfoDao接口:

@Mapper
public interface StudentInfoDao {
}

2.配置XML路径

配置路径是为了MyBatis能找到我们写的XML文件

以下是yml的配置方法:

mybatis:
  mapper-locations: classpath:mapper/*Mapper*.xml #这里的*是通配符,表示模糊匹配

如果要用properties只需要把:改成.及=即可。

3.配置XML模板

我们要在对应的文件夹下创建XML文件(像我上面的代码就是放在resource文件夹的mapper文件夹内,注意,名字要和自己写的文件名对应)如图:

然后根据模板代码把我们写的类和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.mybatis.demomybatis.demos.DAO.StudentInfoDao">

在namespace的值中写下需要匹配类的全限定类名。这样我们整个模板就创建好了,我们只需要在这个XML文件中写下我们需要的代码即可,接下来我来教大家如何执行简单的SQL语句(非动态(动态的我会在以后的博客里说明))。

4.MyBatis使用SQL语句

1.insert 

先在StudentInfoDao中写一个insert方法,方法名随意,为了方便我直接取名为insert

@Mapper
public interface StudentInfoDao {
     void insert();
}

然后转换到XML文件,我们使用<insert></insert>标签,设置insert标签属性id为我们类中对应的方法名。在标签中写下SQL语句,因为insert要传入参数,为了方便,我们直接传一个类进去,MyBatis会自动帮我们把这个类转化成类内部的参数。我们这里传入StudentInfo类。然后每个参数用#{参数名}的形式输入

    <insert id="insert">
        insert into mybatis(user_name,password,age,gender,phone)
        values(#{username},#{password},#{age},#{gender},#{phone})
    </insert>
@Mapper
public interface StudentInfoDao2 {
     void insert(StudentInfo studentInfo);
}
@Data
public class StudentInfo {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private String deleteFlag;
    private Date createTime;
    private Date updateTime;
}

这里的@Data是lombok里的注解,可以自动帮我们写getter,setter等方法,如果想要详细了解可以去官方看看官方文档,我们这里不多说,不是文章重点。

经过上述步骤之后我们MyBatis使用insert语句就算是大功告成了。我们测试以下结果是否正确。

@SpringBootTest
class StudentInfoDaoTest {
    @Autowired
private StudentInfoDao studentInfoDao2;
    @Test
    void insert() {
        StudentInfo studentInfo=new StudentInfo();
        studentInfo.setPassword("12321");
        studentInfo.setAge(12);
        studentInfo.setPhone("972893");
        studentInfo.setGender(0);
        studentInfo.setUsername("zm");
        studentInfoDao.insert(studentInfo);
    }
}

显然我们的insert语句执行成功。

2.update

会使用insert之后update,delete都几乎一样,我们这里再讲一个update。和前面一样,创建方法,这次我们使用<update></update>标签,id设置为对应方法名,在标签中写下update的sql语句。

@Mapper
public interface StudentInfoDao {
     void update(StudentInfo studentInfo);
}
<update id="update">
        update mybatis set password=#{password},age=#{age} where user_name=#{username}
    </update>
@Test
    void update() {
        StudentInfo studentInfo=new StudentInfo();
        studentInfo.setUsername("zm");
        studentInfo.setAge(18);
        studentInfo.setPassword("99292");
        studentInfoDao2.update(studentInfo);
    }

可以看到之前我们写的数据发生了变化。

3.select

select和上述的3个SQL有所不同,insert,update,delete返回的都是整数,表示数据库受到影响的行数,所以返回值肯定是Integer,这毋庸置疑。但是select就不一样了,它的返回值可以是一行数据也可以是多行数据,所以我们不仅仅要设置它的id还需要设置它的返回类型resultType。

    <select id="select" resultType="com.mybatis.demomybatis.demos.model.StudentInfo">
    </select>

resultType中填的类是返回类的全限定类名。这个设置完之后其余的内容和insert那三个也几乎没什么区别。还是创建方法,写上sql语句即可。

@Mapper
public interface StudentInfoDao {
     List<StudentInfo> select();//传参和上面一样,使用用对象即可,我们这里为了方便就不传参了
}
<select id="select" resultType="com.mybatis.demomybatis.demos.model.StudentInfo">
        select * from mybatis
    </select>
    void select() {
        System.out.println(studentInfoDao.select());
    }

细心的哥们儿会发现我们有些参数的值是null ,并不能和数据库相匹配。这是因为一般数据库的命名习惯和Java的不同,Java采用小驼峰,MySQL采用蛇形命名法,所以StudentInfo类的参数和MySQL中的字段名对不上,导致MyBatis无法映射到类的每个参数中。那我们该怎么解决这个问题呢?这里我来提供3个方法。

4.解决Mybatis参数映射不到的问题

1.改变SQL语句

我们把select * from mybatis改成select user_name as username,delete_flag as deleteFlag,create_time as createTime,uptate_time as uptatetime from mybatis即可。

2.指定映射关系

我们可以用resultMap来指定映射关系,只需要在xml任何一个位置写一个由<resultMap></resultMap>标签写的一组指定映射关系然后再由select标签的resultMap属性接受即可。内部使用<result></result>标签及column,property属性形容一对映射关系。如以下代码。

    <resultMap id="StudentMap" type="com.mybatis.demomybatis.demos.model.StudentInfo">
        <result column="user_name" property="username"></result>#这里我们为了方便只写一个对应关系
    </resultMap>
    <select id="select" resultMap="StudentMap">
        select * from mybatis
    </select>

引用方法就是填入resultMap的id。这样Java就可以返回正确的内容了。

3.使用配置文件直接把对应的蛇形命名法转化为小驼峰 

映射没对应上的主要原因就是命名规则不同,但是表达的内容是相同的,所以MyBatis帮我们实现了命名规则自动转化。只要使用了这个配置我们就不需要进行任何操作就可以让类属性和SQL字段对应上。yml配置如下:

mybatis:
  configuration: # 配置打印 MyBatis 执行的 SQL
    map-underscore-to-camel-case: true  #自动驼峰转换

这个配置同样适配于用注解方式写SQL。那下面我们来讲讲注解是怎么写SQL的吧。

注解

1.创建接口

和XML一样,也得创建接口:

@Mapper
public interface StudentInfoDao {
}

2.写方法

因为所有方法几乎都一样,所以我们只讲insert方法和select

insert

直接再方法上加上@Insert(“SQL语句”)即可:

    @Insert("insert into mybatis(user_name,password,age,gender,phone) values(#{username},#{password},#{age}," +
            "#{gender},#{phone})")
    public Integer insert(StudentInfo studentInfo);

非常简单。

select 

在XML中我们也说了select因为返回参数的问题所以和其他的语句有所不同,注解SQL语句上是相同的。我们要改变类和SQL字段的映射关系也有三种方法,分别是改变SQL语句,指定映射关系,使用配置文件直接把对应的蛇形命名法转化为小驼峰。第一种和最后一种和XML实现方式一样,我们这里只讲如何指定映射关系。

指定映射关系

我们使用@Results注解,在注解中是@Result注解的集合,我们在@Result中写映射关系即可,如以下代码:

@Select("select * from mybatis")
    @Results(id = "re",value = {
            @Result(column = "uptate_time",property = "updateTime"),
            @Result(column = "create_time",property = "createTime"),
            @Result(column = "delete_flag",property = "deleteFlag")
    })
    public List<StudentInfo> select();

这里的id字段就是给这个result集合取个名,以后若要使用就不需要再写这么一大串集合,直接使用@ResultMap注解,里面填上集合id即可。

@Select("select * from mybatis")   
    @ResultMap("id")
    public List<StudentInfo> select();

因为注解真的很简单,所以我们就只需要讲这么一点,但是不是说xml复杂就是不好用,它在动态SQL方面比注解方式简单好多好多倍,在以后的文章中我再和大家提。

总结

XML和注解的本质都是写一个接口,然后告诉MyBatis这个注解需要实现说明样的功能,关键信息是什么,MyBatis就会配合Spring帮我们实现这个方法供我们使用,这真的比原生JDBC好用许多,这也体现了封装的优越性,让我们省去了建立连接,关闭连接等各种重复又繁琐的操作。

以上就是详解MyBatis的XML实现方法(附带注解方式实现)的详细内容,更多关于MyBatis XML实现的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文