MyBatis-02-CRUD

本文详细介绍了如何使用MyBatis进行CRUD操作,包括准备数据、创建User实体类、设置映射文件,以及执行查询用户数量、按ID查询、获取所有用户、添加、修改和删除用户的方法。同时,文章还列举并解释了在操作过程中可能遇到的常见错误及解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MyBatis-CRUD

一、准备数据

用户表

image-20220225104034849

角色表

image-20220225140549936

USE `woniu`;
DROP TABLE IF EXISTS `woniu_user`;
CREATE TABLE `woniu_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `userCode` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户编码',
  `userName` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户名称',
  `userPassword` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户密码',
  `gender` int(10) DEFAULT NULL COMMENT '性别(1:女、 2:男)',
  `birthday` date DEFAULT NULL COMMENT '出生日期',
  `phone` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '手机',
  `address` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '地址',
  `userRole` bigint(20) DEFAULT NULL COMMENT '用户角色(取自角色表-角色id)',
  `createdBy` bigint(20) DEFAULT NULL COMMENT '创建者(userId)',
  `creationDate` datetime DEFAULT NULL COMMENT '创建时间',
  `modifyBy` bigint(20) DEFAULT NULL COMMENT '更新者(userId)',
  `modifyDate` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;



insert  into `woniu_user`(`id`,`userCode`,`userName`,`userPassword`,`gender`,`birthday`,`phone`,`address`,`userRole`,`createdBy`,`creationDate`,`modifyBy`,`modifyDate`) values (1,'admin','系统管理员','1234567',1,'1983-10-10','13688889999','北京市海淀区成府路207号',1,1,'2013-03-21 16:52:07',NULL,NULL),(2,'liming','李明','0000000',2,'1983-12-10','13688884457','北京市东城区前门东大街9号',2,1,'2014-12-31 19:52:09',NULL,NULL),(5,'hanlubiao','韩路彪','0000000',2,'1984-06-05','18567542321','北京市朝阳区北辰中心12号',2,1,'2014-12-31 19:52:09',NULL,NULL),(6,'zhanghua','张华','0000000',1,'1983-06-15','13544561111','北京市海淀区学院路61号',3,1,'2013-02-11 10:51:17',NULL,NULL),(7,'wangyang','王洋','0000000',2,'1982-12-31','13444561124','北京市海淀区西二旗辉煌国际16层',3,1,'2014-06-11 19:09:07',NULL,NULL),(8,'zhaoyan','赵燕','0000000',1,'1986-03-07','18098764545','北京市海淀区回龙观小区10号楼',3,1,'2016-04-21 13:54:07',NULL,NULL),(10,'sunlei','孙磊','0000000',2,'1981-01-04','13387676765','北京市朝阳区管庄新月小区12楼',3,1,'2015-05-06 10:52:07',NULL,NULL),(11,'sunxing','孙兴','0000000',2,'1978-03-12','13367890900','北京市朝阳区建国门南大街10号',3,1,'2016-11-09 16:51:17',NULL,NULL),(12,'zhangchen','张晨','0000000',1,'1986-03-28','18098765434','朝阳区管庄路口北柏林爱乐三期13号楼',3,1,'2016-08-09 05:52:37',1,'2016-04-14 14:15:36'),(13,'dengchao','邓超','0000000',2,'1981-11-04','13689674534','北京市海淀区北航家属院10号楼',3,1,'2016-07-11 08:02:47',NULL,NULL),(14,'yangguo','杨过','0000000',2,'1980-01-01','13388886623','北京市朝阳区北苑家园茉莉园20号楼',3,1,'2015-02-01 03:52:07',NULL,NULL),(15,'zhaomin','赵敏','0000000',1,'1987-12-04','18099897657','北京市昌平区天通苑3区12号楼',2,1,'2015-09-12 12:02:12',NULL,NULL);

DROP TABLE IF EXISTS `woniu_role`;
CREATE TABLE `woniu_role` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `roleCode` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色编码',
  `roleName` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色名称',
  `createdBy` bigint(20) DEFAULT NULL COMMENT '创建者',
  `creationDate` datetime DEFAULT NULL COMMENT '创建时间',
  `modifyBy` bigint(20) DEFAULT NULL COMMENT '修改者',
  `modifyDate` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

insert  into `woniu_role`(`id`,`roleCode`,`roleName`,`createdBy`,`creationDate`,`modifyBy`,`modifyDate`) values (1,'woniu_ADMIN','系统管理员',1,'2016-04-13 00:00:00',NULL,NULL),(2,'woniu_MANAGER','经理',1,'2016-04-13 00:00:00',NULL,NULL),(3,'woniu_EMPLOYEE','普通员工',1,'2016-04-13 00:00:00',NULL,NULL);

二、准备实体类 User

public class User {
	private Integer id; //id 
	private String userCode; //用户编码
	private String userName; //用户名称
	private String userPassword; //用户密码
	private Integer gender;  //性别
	private Date birthday;  //出生日期
	private String phone;   //电话
	private String address; //地址
	private Integer userRole;    //用户角色
	private Integer createdBy;   //创建者
	private Date creationDate; //创建时间
	private Integer modifyBy;     //更新者
	private Date modifyDate;   //更新时间
	//省略get set方法
}

三、准备映射文件

<?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">

核心配置文件中引入映射文件

		<mappers>
			<mapper resource="com/woniu/mybatis/dao/UserMapper.xml"/>
		</mappers>

四、CURD

1、查询用户表条数

方法

public interface UserMapper {
	/**
	 * 查询用户表条数
	 * 
	 * @return int
	 */
	public int count();

}

sql

<mapper namespace="com.woniu.mybatis.dao.UserDao">
	<!-- 查询用户表记录数
		查詢使用select标签
		修改使用update标签
		添加使用insert标签
		删除使用delete标签
		
		id对应接口名,当前文件不同重复
		resultType SQL语句返回值类型的完整类名或别名

		注意SQL语句后面不要分号
	 -->
	<select id="count" resultType="int">
		select count(1) as count from woniu_user
	</select>
</mapper>

namespace绑定dao层接口的全路径:namespace的值必须全局唯一

当namespace绑定的是dao接口的全路径时,其实现数据持久化的方式为由代理模式实现数据持久化。

即会自动产生代理,自动实现数据的持久化,不需要实现dao层的接口

image-20220225151105066

测试

@Test
	public void testCount() {
		//創建sqlSession
		SqlSession sqlSession = MyBatisUtil.createSqlSession();
		//使用sqlSession生成UserDao的代理對象
		UserDao userDao = sqlSession.getMapper(UserDao.class);
		//調用方法
		int count = userDao.count();
		//輸出
		System.out.println(count);
		//關閉連接
		sqlSession.close();
	}

每次执行都需要打开连接,关闭连接,代码重复。可以使用Before和After注解

@Before//測試前獲取連接
	public void init() {
		 sqlSession = MyBatisUtil.createSqlSession();
	}
	
	@After//測試后關閉連接
	public void destory() {
		sqlSession.close();
	}
	
	@Test
	public void testCount() {
		//使用sqlSession生成UserDao的代理對象
		UserDao userDao = sqlSession.getMapper(UserDao.class);
		//調用方法
		int count = userDao.count();
		//輸出
		System.out.println(count);
	}
2、根据id查询用户

方法

/**
	 * 根據ID查询用户
	 * 
	 * @return User
	 */
	public User getUserById(int userId);

SQL

<!--  根據ID查询用户
	parameterType 
		基础数据类型	int、String、Date等 通过#{参数名}即可获取传入的值
		复杂数据类型      Java实体类、Map等 通过#{属性名}或者#{map的keyName}即可获取传入值
	 -->
	<select id="getUserById" resultType="com.woniu.mybatis.pojo.User" parameterType="int">
        <!-- 当字段名和返回类型中的属性名一致时会自动映射 
		如果字段名和属性名不致时,可以给字段取别名
		-->
		select userName,userCode from woniu_user where id = #{id}
	</select>

测试

@Test
	public void testGetUesrById() {
		User user = sqlSession.getMapper(UserDao.class).getUserById(1);
		System.out.println(user);
	}
3、查询所有用户数据

方法

/**
	 * 查詢所有用戶
	 * @return
	 */
	List<User> findAllUser();

SQL

<select id="findAllUser" resultType="com.woniu.mybatis.pojo.User">
		select * from woniu_user
	</select>

测试

@Test
	public void testFindAllUser() {
		sqlSession.getMapper(UserDao.class).findAllUser().forEach(System.out::println);
	}
4、添加用户

方法

/**
	 * 添加用戶
	 * @param user
	 * @return
	 */
	int addUser(User user);

SQL

<!-- 
	
-->
<insert id="addUser" parameterType="com.woniu.mybatis.pojo.User">
		insert into woniu_user(userCode,userName) values(#{userCode},#{userName})
	</insert>

测试

@Test
	public void testAddUser() {
		User user = new User();
		user.setUserName("abc");
		user.setUserCode("abc");
		sqlSession.getMapper(UserDao.class).addUser(user );
	}


5、修改用户

方法

/**
	 *    根據id修改用戶
	 * @param user
	 * @return
	 */
	int updateUser(User user);

SQL

<update id="updateUser" parameterType="com.woniu.mybatis.pojo.User">
		update woniu_user set userCode=#{userCode},userName=#{userName}
		where id = #{id}
	</update>

测试

@Test
	public void testUpdateUser() {
		User user = new User();
		user.setUserName("陳老師");
		user.setUserCode("teacher");
		user.setId(2);
		sqlSession.getMapper(UserDao.class).updateUser(user );
	}
6、删除用户

方法

/**
	 * 根據ID修改用戶
	 * @param userId
	 * @return
	 */
	int deleteUser(int userId);

SQL

<delete id="deleteUser" parameterType="int">
		delete from woniu_user where id = #{id}
	</delete>

测试

@Test
	public void testDeleteUser() {
		sqlSession.getMapper(UserDao.class).deleteUser(15);
	}
7、配置别名

在mybatis-config.xml中加入以下代码

<typeAliases>
     <!-- 配置实体类所在的包后 当映射文件中使用包下的类可以直接写类名且不区分大小写
		resultType="com.woniu.mybatis.pojo.User" 
		可以写成
		resultType="user" 或 resultType="User" (不区分大小写)
		parameterType javaType type 属性同上
-->
		<package name="com.woniu.mybatis.pojo"/>
	</typeAliases>

五、常见报错

1、接口未注册

image-20220225173200859

2、映射文件中的id重复了

image-20220225173416650

3、方法在mapper映射文件中没有绑定

image-20220225173613676

4、参数为实体类时 没有对应的属性

image-20220225173935034

5、对应的参数找不到

image-20220225174240126

6、返回的结果太多

image-20220225174456609

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值