mybatis增、删、改、查操作 1. 增加用户操作(insert标签),返回受影响的行数.1.1 返回自增id 2. 修改用户操作(update)3. 删除用户操作(delete)4.
首先在数据库中创建一个user表:
create table user(userId int primary key auto_increment,username varchar(128) not null,passWord varchar(128) not null); 有了表,还需要创建一个实体类:
package com.example.demo.model;import lombok.Data;@Data //加上这个注解,可直接使用set/get等方法public class User { private Integer userId; private String username; private String password;} 这里的数据库表中的字段名和实体类中的成员变量名字最好相同.
controller层代码:
package com.example.demo.controller;import com.example.demo.model.User;import com.example.demo.model.UserInfo;import com.example.demo.servce.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.WEB.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class UserController { @Autowired public UserService userMapper; @RequestMapping("/add") public int add(User user){ if(user==null)return 0; return userMapper.add(user); }} service 层代码:
package com.example.demo.servce;import com.example.demo.mapper.UserMapper;import com.example.demo.model.User;import com.example.demo.model.UserInfo;import org.springframework.stereotype.Service;import javax.annotation.Resource;@Servicepublic class UserService { @Resource public UserMapper userMapper; public int add(User user){ return userMapper.add(user); }} mapper层代码:
package com.example.demo.mapper;import com.example.demo.model.User;import com.example.demo.model.UserInfo;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Param;import java.util.List;@Mapperpublic interface UserMapper { public int add(User user); } xml文件中添加insert标签和插入语句如下:
<insert id="add"> insert into user (username,password)values(#{username},#{password})insert> 通过网页输入url直接访问:

结果:

controller层代码:
@RequestMapping("/add2") public int add2(User user){ userMapper.add_increment(user); return user.getUserId(); } service层代码:
public int add_increment(User user){ return userMapper.add_increment(user); } mapper层代码:
public int add_increment(User user); .xml文件中代码:
<!-->在mybatis的XML映射器中设置useGeneratedKeys=true,是为了在执行insert 、update操作后能获取操作成功后的插入对象的自增主键id<!--><!-->keyProperty指定在Java 实体类中对应的主键<!--><!-->keyColumn指的是数据库表中自增主键的字段名<!--><insert id="add_increment" useGeneratedKeys="true" keyColumn="userId" keyProperty="userId"> insert into user (username,password)values(#{username},#{password}) </insert> 访问结果:

数据库中结果:

controller层代码:
@RequestMapping("/up") public int update(Integer userId,String username){ return userMapper.update(userId,username); } service层代码:
public int update(Integer uid,String name){ return userMapper.update(uid,name); } mapper层代码:
public int update(@Param("userId") Integer userId,@Param("username") String username); .xml文件代码:
<update id="update"> update user set username=#{username}where userId=#{userId} update> 访问结果:
数据库中结果:

controller层代码:
@RequestMapping("del") public int del(Integer userId){ return userMapper.del(userId); } service层代码:
public int del(Integer userId){ return userMapper.del(userId); } mapper层代码:
public int del(@Param("userId") Integer userId); .xml文件代码:
<delete id="del"> delete from user where userId=#{userId}delete> 访问结果:

数据库查询结果(前后对比图):

controller层代码:
@RequestMapping("/getu") public User getUserById2(Integer userId) { return userMapper.getUserById2(userId); } service层代码:
public User getUserById2(Integer id ){ return userMapper.getUserById2(id); } mapper层代码:
public User getUserById2(@Param("userId")Integer userId); .xml文件代码:
<select id="getUserById2" resultType="com.example.demo.model.User"> <!-->resultType表示返回的类型<!--> select * from user where userId =#{userId} select> 访问结果:
数据库中:

controller层代码:
@RequestMapping("like") public User find(String username){ return userMapper.likefind(username); } service层代码:
public User likefind(String username){ return userMapper.likefind(username); } mapper层代码:
//模糊查询 public User likefind(@Param("username") String username); .xml文件代码:
<select id="likefind" resultType="com.example.demo.model.User"> select * from user where username like '%${username}%'select> 注意使用迷糊查询时:使用’%#{username}%’ 时,会报错,因为#{}会对字符串自动进行加引号处理,可以使用concat(‘%’,#{username},‘%’)来代替.
访问结果:
数据库中数据:

如果是增、删、改返回搜影响的⾏数,那么在 mapper.xml 中是可以不设置返回的类型的.
然⽽即使是最简单查询⽤户的名称也要设置返回的类型,否则会出现错误。
直接返回实体类
列如:
<select id="likefind" resultType="com.example.demo.model.User"> select * from user where username like '%${username}%'select> resultMap 使⽤场景:
1.字段名称和程序中的属性名不同的情况,可使⽤ resultMap 配置映射;
2.⼀对⼀和⼀对多关系可以使⽤ resultMap 映射并查询数据
字段名和属性名不同的情况:
package com.example.demo.model;import lombok.Data;@Datapublic class User { private Integer id; // userId被改成了id private String username; private String password;} 
上述数据库个实体类的id被改成了不同的名字,这时候查询时查不到数据的,就需要使用resultMap来一一映射.
在上述情况下,通过如下语句查询:
<select id="resultMapfind" resultType="com.example.demo.model.User"> select * from user where userid=#{userId} select> 结果(id的结果查询为null):

使用resultMap查询,使用下面语句:
<resultMap id="BaseMap" type="com.example.demo.model.User"> <id column="userId" property="id">id> <result column="username" property="username">result> <result column="password" property="password">result>resultMap> <select id="resultMapfind" resultMap="BaseMap"> select * from user where userId=#{userId} select> 查询结果(id有值了):

首先创建两张表(用户表/文章表):
-- 创建⽂章表drop table if exists articleinfo;create table articleinfo(id int primary key auto_increment,title varchar(100) not null,content text not null,createtime datetime default now(),updatetime datetime default now(),uid int not null,rcount int not null default 1,`state` int default 1); -- 创建表[⽤户表]drop table if exists userinfo;create table userinfo(id int primary key auto_increment,username varchar(100) not null,password varchar(32) not null,photo varchar(500) default '',createtime datetime default now(),updatetime datetime default now(),`state` int default 1); 
对应的两个实体类为:
package com.example.demo.model;import lombok.Data;@Datapublic class ArticleInfo { private int id; private String title; private String content; private String createtime; private String updatetime; private int uid; private int rcount; private int state; private UserInfo userInfo; //这里是文章对应的用户 一对一} package com.example.demo.model;import lombok.Data;import org.springframework.beans.factory.annotation.Configurable;import java.util.List;@Datapublic class UserInfo { private Integer id; private String name; private String password; private String photo; private String createtime; private String updatetime; private int state; private List<ArticleInfo> artlist; //这里是用户对应的文章 多对一} ⼀对⼀映射要使⽤ 标签,具体实现如下(⼀篇⽂章只对应⼀个作者):
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "Http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.demo.mapper.ArticleMapper"><resultMap id="BaseMap" type="com.example.demo.model.ArticleInfo"> <id column="id" property="id">id> <result column="title" property="title">result> <result column="content" property="content">result> <result column="createtime" property="createtime">result> <result column="updatetime" property="updatetime">result> <result column="uid" property="uid">result> <result column="rcount" property="rcount">result> <result column="state" property="state">result> resultMap="com.example.demo.mapper.UserMapper.BseMap" columnPrefix="u_"> association>resultMap> <select id="getArticle" resultMap="BaseMap"> select a.*,u.id u_id,u.username u_username,u.password u_password ,u.createtime u_createtime from articleinfo a left join userinfo u on a.uid=u.id where a.id=#{id} select>mapper> 以上使⽤ 标签,表示⼀对⼀的结果映射:
property 属性:指定 Article 中对应的属性,即⽤户。
resultMap 属性:指定关联的结果集映射,将基于该映射配置来组织⽤户数据。
columnPrefix 属性:绑定⼀对⼀对象时,是通过columnPrefix+association.resultMap.column 来映射结果集字段。(columnPrefix 如果省略,并且恰好两个表中如果有相同的字段,那么就会导致查询出错)
association.resultMap.column是指 标签中 resultMap属性,对应的结果集映射中,column字段
controller层代码:
@RequestMapping("/a") public ArticleInfo getAll(Integer id) { return userMapper.getAll(id); } service层代码:
public ArticleInfo getAll(Integer id) { return articleMapper.getArticle(id); } mapepr层代码:
@Mapperpublic interface ArticleMapper { //一对一 //根据文章id获取文章 public ArticleInfo getArticle(@Param("id")Integer id);} .xml层代码(上面已经解释过代码了):
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.demo.mapper.ArticleMapper"><resultMap id="BaseMap" type="com.example.demo.model.ArticleInfo"> <id column="id" property="id">id> <result column="title" property="title">result> <result column="content" property="content">result> <result column="createtime" property="createtime">result> <result column="updatetime" property="updatetime">result> <result column="uid" property="uid">result> <result column="rcount" property="rcount">result> <result column="state" property="state">result> <association property="userInfo" resultMap="com.example.demo.mapper.UserMapper.BseMap" columnPrefix="u_"> association>resultMap> <select id="getArticle" resultMap="BaseMap"> select a.*,u.id u_id,u.username u_username,u.password u_password ,u.createtime u_createtime from articleinfo a left join userinfo u on a.uid=u.id where a.id=#{id} select>mapper> 访问的结果:

数据库中数据:

⼀对多需要使⽤
标签,⽤法和 相同.
<resultMap id="BseMap" type="com.example.demo.model.UserInfo"> <id column="id" property="id">id> <result column="username" property="name">result> <result column="password" property="password">result> <result column="photo" property="photo">result> <result column="createtime" property="createtime">result> <result column="updatetime" property="updatetime">result> <result column="state" property="state">result> <collection property="artlist"resultMap="com.example.demo.mapper.ArticleMapper.BaseMap"columnPrefix="a_">collection> resultMap> <select id="getUserAndarticleByUid" resultMap="BseMap"> select u.*,a.id a_id,a.title a_title,a.content a_content, a.createtime a_createtime, a.updatetime a_updatetime from userinfo u left join articleinfo a on u.id=a.uid where u.id=#{uid} select> controller层代码:
@RequestMapping("/b") public UserInfo getUserByid(Integer id){ return userMapper.getUserAndArticleByUid(id); } service层代码:
public UserInfo getUserAndArticleByUid(Integer id){ return userMapper.getUserAndArticleByUid(id); } mapper层代码:
//多对一 //查询用户及用户的所有文章,根据id public UserInfo getUserAndArticleByUid(@Param("uid") Integer uid); .xml文件代码:
<resultMap id="BseMap" type="com.example.demo.model.UserInfo"> <id column="id" property="id">id> <result column="username" property="name">result> <result column="password" property="password">result> <result column="photo" property="photo">result> <result column="createtime" property="createtime">result> <result column="updatetime" property="updatetime">result> <result column="state" property="state">result> <collection property="artlist"resultMap="com.example.demo.mapper.ArticleMapper.BaseMap"columnPrefix="a_">collection> resultMap> <select id="getUserAndArticleByUid" resultMap="BseMap"> select u.*,a.id a_id,a.title a_title,a.content a_content, a.createtime a_createtime, a.updatetime a_updatetime from userinfo u left join articleinfo a on u.id=a.uid where u.id=#{uid} select> 访问查询结果(用户1有三篇文章):
数据库数据(用户1有三篇文章):

制作不易,觉得有帮助请点个赞!
--结束END--
本文标题: MyBatis增、删、改、查(多表查询)操作详解
本文链接: https://www.lsjlt.com/news/416818.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0