各位大佬光临寒舍,希望各位能赏脸给个三连,谢谢各位大佬了!!!
目录
这篇文章我们来简述一下MyBatis的XML实现方法(附带注解方式实现方法)。
XML
1.创建接口
创建数据层(Dao)接口,使用@Mapper注解(交由Spring掌管这个类,这样才能让其帮助我们写操作数据库的方法)。为了演示我创建一个StudentInfoDao接口:
@Mapper
public interface StudentInfoDao {
}
1.配置XML路径
配置路径是为了MyBatis能找到我们写的XML文件
以下是yml的配置方法:
mybatis:
mapper-locations: classpath:mapper/*Mapper*.xml #这里的*是通配符,表示模糊匹配
如果要用properties只需要把:改成.及=即可。
2.配置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语句(非动态(动态的我会在以后的博客里说明))。
3.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好用许多,这也体现了封装的优越性,让我们省去了建立连接,关闭连接等各种重复又繁琐的操作。总的来说一段话来形容MyBtis“如同天上降魔种,真是码界太岁神!!!这个MyBatis,( )!”
制作不易,望各位大佬赏个脸,给个三连吧!!谢谢各位大佬了!!!