详解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实现的资料请关注脚本之家其它相关文章!
相关文章
深入学习Spring Boot排查 @Transactional 引起的 NullPointerException问题
这篇文章主要介绍了深入学习Spring Boot排查 @Transactional 引起的 NullPointerException问题,需要的朋友可以参考下2018-01-01SpringBoot多数据源切换实现代码(Mybaitis)
实际工作中我们会遇到springboot项目初始化启动时候,不能指定具体连接哪个数据源的时候,不同的接口连接不同的数据源或者前端页面指定连接某个数据源等等情况,就会遇到动态数据源切换的问题,需要的朋友可以参考下2022-04-04
最新评论