第一步:首先新建一个Mapper类的包,主要用于存放这里的mapper接口,是 Mybatis 进行数据库操作的关键环节,是Mybatis对于数据库操作的重要一环,对应这对数据库的CRUD;
第二步:创建一个实体类,这里和数据库中的属性进行对应,这里在传输对象的时候,用于每个属性参数的传递;
以下就是我们这里的UserInfo实体类中的属性:
@Data
public class UserInfo {
private Integer id;
private String username;
private String password;
private Integer age;
private Integer gender;
private String phone;
private Integer deleteFlag;
private Date createTime;
private Date updateTime;
}
解释:
这里的属性要和数据库中的属性进行对应,但是需要注意的是(在数据库中的两个单词组成的列名的规则就是单词之间要用下划线进行分割,然后单词小写就行,但是在java命名的规范中,使用的就是小驼峰命名)
第三步:建立数据库,并进行连接
以下就是小编建立的数据库:
建立连接小编在上一期讲解过了,uu们可以去看看了解了解~~~
1.实现mapper接口
这里我们就要实现mapper接口实现对应的sql语句的操作,具体的代码如下所示:
@Insert("insert into user_info(username,password,age,gender,phone) value " +
"(#{username},#{password},#{age},#{gender},#{phone})")
public Integer insertUserInfo(UserInfo userInfo);
解释:
1.在使用增加数据的时候,要添加Insert注解;
2.在括号里实现具体的sql的语句的编写,但是注意使用加号拼接的时候要注意是否有空格分割
3.参数的传递过程中,参数是通过对象传递的,然后参数的写法就是“#{ }”,里面的参数的名字要和实体类的名字保持一致
4.然后后面的数据的接收,小编这里使用integer,代表就是影响的行数
2.实现测试类
具体的代码如下所示:
@Test
void insertUserInfo() {
UserInfo userInfo=new UserInfo();
userInfo.setUsername("bug");
userInfo.setPassword("bug");
userInfo.setAge(19);
userInfo.setGender(1);
userInfo.setPhone("1778590");
Integer result=userInfoMapper.insertUserInfo(userInfo);
System.out.println(result);
}
解释:
由于小编在实体类中使用了@data注解,那么直接帮我们重写了对应的方法,然后通过set对每一个属性进行参数的赋值的操作,最后传递给mapper对象,使用对应的创建数据的方法,传递对象后,返回影响的行数;最后运行,结果小编就不再展示了;
1.实现mapper接口
代码如下所示:
@Delete("delete from user_info where id=3")
Integer deleteUser();
解释:
小编这里没有使用参数的传递,直接在sql语句中实现要删除的数据的id;最后使用的也是整型来接受(代表的就是删除数据的行数即受影响的数据有几条)
2.实现测试类
具体的代码如下所示:
@Test
void deleteUser() {
Integer result=userInfoMapper.deleteUser();
System.out.println(result);
}
解释:
这里就是通过映入mapper接口的对象的应用,然后使用对应的方法实现这里的删除的操作;最后返回的数值就是代表影响的数据个数;
1.实现mapper接口
具体的代码如下所示:
@Update("update user_info set username=#{username} where id=#{id}")
Integer updata1(UserInfo userInfo);
解释:
1.实现修改的操作,要添加update的注解;
2.在括号里实现对应修改数据的sql语句的操作,然后这里的参数要与我们实体类的属性一致;
3.在传入数据时,都是使用对象的方式,通过调用set方法进行参数的传递;
2.实现测试类
具体的代码如下所示:
@Test
void updata1() {
UserInfo userInfo=new UserInfo();
userInfo.setUsername("java");
userInfo.setId(5);
Integer result=userInfoMapper.updata1(userInfo);
System.out.println("影响的行数: "+result);
}
解释:
通过实体类的实例化,调用对应参数的set方式,传递数据,(注意这里构造的参数要和我们sql语句中的参数实现对应),最后打印的就是代表的影响的数据的行数;
1.实现mappe接口
具体的代码如下所示:
@Select("select * from user_info")
List<UserInfo> selectUser();
解释:
这里使用*代表所有的属性,但是推荐大家还是一个一个把要查找的属性列出来;这里用的就是队列进行接收,当然还可以使用对象来进行接收;
2.实现测试类
代码如下所示:
@Test
void selectUser() {
List<UserInfo> userInfoList= userInfoMapper.selectUser();
System.out.println(userInfoList);
}
这里小编就不再进行解释了,输出的结果如下所示:
注意:
可以看到上面一部分就是数据库的数据展示,但是下面对应的java属性的对象为啥是空的
主要原因就是由于数据库的命名的规范和java属性的名称定义是不一样的;
如果数据库字段和java对象属性一致,那么就会自动复制,但是这里当存在两个单词组成的时候,这里的名字就不一样了,所以这里在java对象属性中有几个属性就是null的;
1.起别名
代码如下所示:
@Select("select username,password,age,gender,phone," +
"delete_flag as deleteFlag,create_time as createTime,update_time as updateTime from user_info ")
List<UserInfo> selectUser2();
这里就是通过起别名的方式来使得数据库字段和java对象属性进行对应,然后输出后就会对于java字段进行赋值;
2.结果映射
具体的代码如下所示
@Select("select * from user_info")
@Results(id = "selectMap",value = {
@Result(column = "delete_flag",property = "deleteFlag"),
@Result(column = "create_time",property = "createTime"),
@Result(column = "update_time",property = "updateTime"),
})
List<UserInfo> selectUser3();
//如果其他sql需要使用
@Select("select * from user_info")
@ResultMap(value = "selectMap")
List<UserInfo> selectUser4();
解释:
这里就是通过注解results来进行结果映射,id代表results起的别名,(其他查找sql就可以通过resultmap使用这里的别名来进行结果映射的操作)然后value代表就是结果映射的核心,column代表数据库字段,然后peoperty就是代表java对象属性名;
3.开启驼峰命名
这里就是通过配置文件的方式进行操作,配置文件如下所示:
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
解释:
这里的 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl代表实现日志的打印,让结果更加具有可读性; map-underscore-to-camel-case: true:这里就是开启了驼峰命名,然后我们在使用查询操作的时候,就可以直接不用管什么起别名和结果映射的操作,直接按照正常的操作即可;
1.配置连接字符
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
mapper-locations: classpath:mapper/**Mapper.xml
配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件;classpath就是代表resources,然后创建一个mapper包里含有一个一Mapper.xml为后缀的文件;
2.创建xml文件
具体的图示如下:
解释:注意这里一定创建是在mapper文件夹里以Mapper.xml为后缀的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.example.mybatis.Mapper.UserInfoXMLMapper">
</mapper>
然后再xml文件里复制上述的代码,这里mapper就是映射的意思,后面的就是要实现的那个mapper接口的全限定名称;这里要根据我们要实现的mapper接口来进行规定的;
这里的操作基本就是一致的,小编就直接列在一起进行举例吧;
1.实现mapper接口
具体的代码如下所示:
@Mapper
public interface UserInfoXMLMapper {
//增加
Integer insert(UserInfo userInfo);
//删除
Integer delete(Integer id);
//更新
Integer update(UserInfo userInfo);
}
那么与注解的方式不同,这里的sql语句是写在xml文件中的,这里注意要使用的就是每个方法的方法名在后面需要使用;
2.实现xml语句
代码如下所示:
<insert id="insert">
insert into user_info(username,password,age,gender,phone)
values (#{username},#{password},#{age},#{gender},#{phone})
</insert>
<update id="update">
update user_info set password=#{password} where id=#{id}
</update>
<delete id="delete">
delete from user_info where id=#{id}
</delete>
解释:
这里就是通过每个增删改的标签来进行对应的sql语句的编写和注解一致;
id代表的就是对应的mapper接口中定义的方法名;参数的定义还是一致的,没有太大的变化
实现测试类
代码如下所示:
@SpringBootTest
class UserInfoXMLMapperTest {
@Autowired
private UserInfoXMLMapper userInfoXMLMapper;
@Test
void insert() {
UserInfo userInfo=new UserInfo();
userInfo.setUsername("wangwu");
userInfo.setPassword("123");
userInfo.setAge(19);
userInfo.setGender(1);
userInfo.setPhone("1111");
Integer result=userInfoXMLMapper.insert(userInfo);
System.out.println("返回受影响的数据行数:"+result);
}
@Test
void delete() {
Integer result=userInfoXMLMapper.delete(10);
System.out.println("返回受影响的数据行数:"+result);
}
@Test
void update() {
UserInfo userInfo=new UserInfo();
userInfo.setPassword("6666");
userInfo.setId(3);
Integer result=userInfoXMLMapper.update(userInfo);
System.out.println("返回受影响的数据行数:"+result);
}
解释:
可以看到这里的测试类的操作就是和注解类几乎是一致的;
1.注入mapper接口对象,然后这里的参数传递可以通过直接在方法中写入参数
2.可以创建实体类对象,通过对象调用对应参数的set方法,实现参数的传递;
1.实现mapper接口
//查询
List<UserInfo> select();
2.实现xml语句
<select id="select" resultType="com.example.mybatis.Model.UserInfo"">>
select * from user_info
</select>
解释:
id对应的就是操作的方法名称,后面的resultType代表就是返回的指定查询结果的类型(只有select方法才有)
3.实现测试类
代码如下所示:
@Test
void select() {
List<UserInfo> selectReault=userInfoXMLMapper.select();
System.out.println(selectReault);
}
但是此时的问题就是和上面注解的方式就是一样的,会出现命名不一样的情况,那么就有以下的几种解决办法
这里的解决办法和上面是一致的,主要有以下三种:
1.起别名方式 2.结果映射方式 3.配置文件驼峰命名
这里的1和3的操作是一致的,所以这里就不再进行讲解了,直接展示一下结果映射的方式:
<resultMap id="BaseType" type="com.example.mybatis.Model.UserInfo">
<result column="delete_flag" property="deleteFlag"></result>
<result column="create_time" property="createTime"></result>
<result column="update_time" property="updateTime"></result>
</resultMap>
解释:
id就是resultMap的别名,后面的类型就是表示映射的实体类型;
下面三个就是普通字段,column代表数据库字段property就是java对象属性名;
这里的主键是可以不要的,所以在上面的操作中小编进行了省略~~~
本期小编主要讲解了关于Mybatis的增删改查的操作,这里有两种实现的方式;分别是注解方式实现CRUD以及XML方式实现CRUD;以及对于查找数据过程中如何解决数据库字段和java属性命名规则不同导致的赋值错误问题;
🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!