详解MyBatis的XML实现方法(附带注解方式实现)
作者:HarryQUQ
这篇文章我们来简述一下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实现的资料请关注脚本之家其它相关文章!