0


MyBatis~MyBatis介绍和基础操作CRUD(insert、delete、select、update)

文章目录

什么是MyBatis?

官方文档:MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

简单地说,

MyBatis

可以快速完成程序和数据库交互的工具,是操作和读取数据库的非常好用的工具。

准备工作:初始化数据库

既然要操作数据库,就需要准备一个数据库。
这不是必须的步骤,如果已经有了数据库可以跳过这个步骤。
如果没有可以操作的数据库,可以复制下面的样例到MySql客户端,复制粘贴+enter键即可。

-- 创建数据库dropdatabaseifexists mycnblog;createdatabase mycnblog DEFAULTCHARACTERSET utf8;-- 使用数据数据use mycnblog;-- 创建表[用户表]droptableifexists  userinfo;createtable userinfo(
    id intprimarykeyauto_increment,
    username varchar(100)notnull,
    password varchar(32)notnull,
    photo varchar(500)default'',
    createtime datetimedefaultnow(),
    updatetime datetimedefaultnow(),`state`intdefault1);-- 创建文章表droptableifexists  articleinfo;createtable articleinfo(
    id intprimarykeyauto_increment,
    title varchar(100)notnull,
    content textnotnull,
    createtime datetimedefaultnow(),
    updatetime datetimedefaultnow(),
    uid intnotnull,
    rcount intnotnulldefault1,`state`intdefault1);-- 创建视频表droptableifexists videoinfo;createtable videoinfo(
      vid intprimarykey,`title`varchar(250),`url`varchar(1000),
        createtime datetimedefaultnow(),
        updatetime datetimedefaultnow(),
      uid int);-- 添加一个用户信息INSERTINTO`mycnblog`.`userinfo`(`id`,`username`,`password`,`photo`,`createtime`,`updatetime`,`state`)VALUES(1,'admin','admin','','2021-12-06 17:10:48','2021-12-06 17:10:48',1);-- 文章添加测试数据insertinto articleinfo(title,content,uid)values('Java','Java正文',1);insertinto articleinfo(title,content,uid)values('Spring','Spring正文',1);-- 添加视频insertinto videoinfo(vid,title,url,uid)values(1,'java title','http://www.baidu.com',1);-- 日志表createtable userlog(
    id intprimarykeyauto_increment,`desc`varchar(250),
    createtime datetimedefaultnow(),
    updatetime datetimedefaultnow());

基础使用:

MyBatis在使用时需要配置xml文件,并在xml中写入具体操作数据库的SQL语句,下面是最简单的查询为例的xml模板:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.example.demo.mapper.UserMapper"><selectid="getAll"resultType="com.example.demo.model.User">
       select * from userinfo
    </select></mapper>
  • namespace属性中写入xml实现接口的完整路径,即定义了各种接口的类在哪
  • id必须和我们自定义的接口类中的方法名称相同
  • resultType:返回的数据类型。

CRUD操作

增加:insert语句

在Controller层创建add方法,这个add方法返回的是表中插入数据后受影响的行数:

//添加用户,并返回受影响的行数@RequestMapping("/add")publicintadd(UserInfo userInfo){//参数校验-> 调用业务逻辑层if(userInfo==null|| userInfo.getName()==null|| userInfo.getPassword()==null|| userInfo.getName().equals("")|| userInfo.getPassword().equals("")){//非法参数 返回0return0;}return userService.add(userInfo);}

在mapper层声明一个接口方法:

intadd(UserInfo userInfo);

在Mapper.xml,MyBatis的配置文件中实现这个接口方法,也就是在配置文件中使用insert语句,insert语句在使用时不需要设置返回类型,会自动默认返回一个int数值。

在向其中传入UserInfo对象的时候,设置相关属性时,语法格式为#{属性名称},#{属性名称}…

<!--   添加方法  默认自动返回一个int类型的值--><insertid="add">
        insert into userinfo(username,password)
        value(#{name},#{password})
    </insert>

运行结果:
在这里插入图片描述
在Mysql中查看,可以看到成功插入一条数据:

在这里插入图片描述

特殊添加操作:返回自增主键的id

在实际场景中我们经常需要获取插入数据的主键来进行一些后续的操作,数据库中主键一般使用自增或者UUID()的方式自动生成
使用Java中的UUID来获得主键是一种比较方便的方式,但是使用数据库生成的主键就需要将插入的数据再查询出来得到主键,在某些情况下还可能会查询到多条结果,这并非理想的情况。
为了解决这个问题,我们在添加这条数据的时候就让其自动返回主键
像上面的添加操作一样,在Controller层创建一个添加方法:

//向数据库中添加数据,并返回用户的自增id@RequestMapping("/addCre")publicintaddCre(UserInfo userInfo){//参数校验-> 调用业务逻辑层if(userInfo==null|| userInfo.getName()==null|| userInfo.getPassword()==null|| userInfo.getName().equals("")|| userInfo.getPassword().equals("")){//非法参数 返回0return0;}//调用数据库的添加操作,执行完添加操作后会将自增id设置到userinfo的id属性
         userService.addCre(userInfo);//这里直接获得idreturn userInfo.getId();}

在Mapper层声明接口方法:

intaddCre(UserInfo userInfo);

在Mapper对应的xml配置文件中实现这个方法:

<!--添加操作,像数据库中添加一条信息,并返回自增主键id--><insertid="addCre"useGeneratedKeys="true"keyProperty="id"keyColumn="id">
        insert into userinfo(username,password)
        value(#{name},#{password})
    </insert>

这里的insert语句使用了以下三个属性:

  • useGeneratedKeys属性:对于支持自动生成记录主键的数据库,如MySQL、SQL Servler,如果设置useGeneratedKeys为true,在添加数据后就可以获得数据库自动生成的主键id
  • keyColumn属性:设置生成键值在表中的列名,即对应的字段名
  • keyProperty属性:指定唯一能识别对象的属性,即在实体类中对应的某个属性

在单元测试中查看是否返回自增id:

@TestvoidaddCre(){UserInfo userInfo=newUserInfo();
        userInfo.setName("Spring Boot");
        userInfo.setPassword("SpringBoot");//调用需要进行测试的方法int autoId=userController.addCre(userInfo);System.out.println("自增id:"+autoId);}

成功返回自增id:
在这里插入图片描述

删除:delete语句

过程同上,在Controller层定义方法:

@RequestMapping("/del")publicintdel(int id){if(id<=0)return0;return userService.del(id);}

然后在mapper中声明,在xml配置中使用了delete语句:

<!--删除操作--><deleteid="del">
        delete from userinfo where id=#{id}
    </delete>

最后测试删除id为ma的数据,删除成功:
在这里插入图片描述

查找:select语句

方法流程和上面的基础操作相同,只是在xml配置时用到了select语句,这里不在赘述,需要注意的是select语句在查询数据时有两种返回方式:

1.resultType(返回类型)

<!-- 使用select查询, resultType对应的是返回类型--><selectid="getAll"resultType="com.example.demo.model.UserInfo">
        select * from userinfo
    </select>

2.resultMap(返回映射/返回字典)

<!--    resultMap在使用时需要提前设置两个节点--><!--    节点中的作用是映射,将数据库中表的字段和我们查询的名字连接起来
          这里type的作用是写入具体的类,即我们查询的结果集是针对这个类的,这里是UserInfo类--><resultMapid="BaseMap"type="com.example.demo.model.UserInfo"><!--        column是表中字段的名称,property中的id是返回对象UserInfo中的id字段--><!--        作用是映射主键(表中的主键和程序实体类中的主键)--><idcolumn="id"property="id"></id><!--普通映射--><resultcolumn="username"property="name"></result><resultcolumn="password"property="password"></result><resultcolumn="photo"property="photo"></result><resultcolumn="createtime"property="createtime"></result><resultcolumn="updatetime"property="updatetime"></result></resultMap><selectid="getAll"resultMap="BaseMap">
        select * from userinfo
   </select>

总结ResultType 与 ResultMap的异同

  • 相同: 功能相同,作用都是用来指定查询返回结果类型
  • 不同: resultType使用简单,缺点是如果实体类中的属性名和表中的字段不一致时,将查询不出任何结果。 resultMap用法稍微复杂,需要建立多个列的映射,优点是如果实体类中的属性名和表中字段不一致时,依然可以正常映射,返回查询结果。

修改:update语句

举例:修改数据库中某条记录的密码
在Controller层中创建方法:

//修改操作,修改数据库中某个用户的密码@RequestMapping("/update")publicintupdatePassword(int id,String password){//参数检验if(id<=0|| password==null|| password.equals("")){//非法数据return0;}return userService.updatePassword(id,password);}

在mapper层声明这个接口方法,并在其配置xml文件中实现这个方法:

intupdatePassword(int id,String password);//声明
<!--修改数据,当id==id,更新password=password--><updateid="updatePassword">
        update userinfo set password=#{password}
        where id=#{id}
    </update>

在测试中尝试将记录ma的密码修改为password:

@TestvoidupdatePassword(){int result=userController.updatePassword(5,"password");Assertions.assertEquals(result,1);}

在数据库中可以看到,修改成功:
在这里插入图片描述

标签: Java mysql 数据库

本文转载自: https://blog.csdn.net/Merciful_Lion/article/details/124365570
版权归原作者 See-L 所有, 如有侵权,请联系我们删除。

“MyBatis~MyBatis介绍和基础操作CRUD(insert、delete、select、update)”的评论:

还没有评论