编程语言
首页 > 编程语言> > Marco's Java【Mybatis入门(三) 基本CRUD操作】

Marco's Java【Mybatis入门(三) 基本CRUD操作】

作者:互联网

前言

配置工作完成的差不多了,终于到我们的操作阶段啦,在讲解之前,我们先了解下什么是CURD

CURD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。
CURD主要被用在描述软件系统中数据库或者持久层的基本操作功能。

所以这节我们要讲到的就是使用Mybatis进行增删改查操作啦。

原生CRUD操作

大家应该还记得我们第一节讲到的查询单个用户信息对吧,当时我们所使用到的是select标签,那么我们举一反三,不难推断出插入数据是insert标签,更新数据是update标签,删除数据是delete标签,我们照葫芦画瓢,将增删改查的操作写出来。

<!DOCTYPE mapper
	PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.marco.mybatis.UserMapper">
	<!-- 查询所有数据 -->
	<select id="selectAll" resultType="com.marco.bean.User">
		select * from u_user
	</select>
	<!-- 查询单个数据 -->
	<select id="queryUserById" parameterType = "Integer" resultType="com.marco.bean.User">
		select * from u_user where id = #{id}
	</select>
	<!-- 添加数据 -->
	<insert id="addUser" parameterType="com.marco.bean.User">
		insert into u_user(user_name,password,real_name,img) values(#{userName},#{password},#{realName},#{img})
	</insert>
	<!-- 更新数据 -->
	<update id="updateUser" parameterType="com.marco.bean.User">
		update u_user set user_name = #{userName}, password = #{password}, real_name = #{realName}, img = #{img} where id = #{id}
	</update>
	<!-- 删除数据 -->
	<delete id="deleteUser" parameterType="java.lang.Integer">
		delete from u_user where id = #{id}
	</delete>
</mapper>

上面的配置可能大家理解着应该能懂,需要提到的一点就是删除数据中的parameterType="java.lang.Integer",
我们之前提到过parameterType就是传入的参数类型,准确来说是传入的参数类,这里我们的id的类型是Integer类,因此parameterType就是java.lang.Integer,当我们只传入一个参数的时候 #{ } 中包裹的参数名称可以是任意的,但是一般来说我们写成value,或者和字段名相匹配,便于后期能够快速的辨识。
接下来就是写增删改查的Java代码了。

大家兴许会发现一个问题,就是我们在创建SqlSession对象的时候,前面的步骤都是重复的,那么我们是不是可以像之前封装JDBC的Connection一样,专门封装一个getSession的方法呢?

有了想法我们就开始干!

public class MybatisUtil {
	
	static SqlSessionFactory sessionFactory = null;
	
	static {
		//创建构造工厂Builder对象
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		//通过builder构建对象构建我们的工厂类SqlSessionFactory
		sessionFactory = builder.build(TestMybatis.class.getClassLoader().getResourceAsStream("mybatis.config.xml"));
	}
	
	public static SqlSession getSession() {
		//通过SqlSessionFactory工厂创建session对象(类似于我们的Connection连接对象)
		SqlSession session = sessionFactory.openSession();
		return session;
	}
}

准备工作做好了,接下来的代码写起来就很容易啦

添加用户

public static void addUser(User user) {
	SqlSession session = MybatisUtil.getSession();
	session.insert("com.marco.mybatis.UserMapper.addUser", user);
	session.commit();
	session.close();
}

删除用户

public static void deleteUser(int id) {
	SqlSession session = MybatisUtil.getSession();
	session.delete("com.marco.mybatis.UserMapper.deleteUser", id);
	session.commit();
	session.close();
}

修改用户

public static void updateUser(User user) {
	SqlSession session = MybatisUtil.getSession();
	session.update("com.marco.mybatis.UserMapper.updateUser", user);
	session.commit();
	session.close();
}

查询单个用户

public static User queryById(Integer id) {
	SqlSession session = MybatisUtil.getSession();
	User user = session.selectOne("com.marco.mybatis.UserMapper.queryUserById", id);
	session.close();
	return user;
}

查询所有用户

public static List<User> queryAll() {
	SqlSession session = MybatisUtil.getSession();
	List<User> users = session.selectList("com.marco.mybatis.UserMapper.selectAll");
	session.close();
	return users;
}

这里有几个注意点


动态代理CRUD操作

接下来我们讲的东西就更有意思了,之前我们在获取数据的时候,不是还要将我们调用UserMapper中的完全限定名传进去吗?现在不需要啦,我们直接调用方法就可以获取。

欸,这里就有疑问了,我们之前难道调用的不是方法吗,难道Mybatis还有什么隐藏的内功心法没有公开出来?
好,我先举个栗子,如果说我们上面的方法就像我们去NIKE买鞋子,你要先查下官网,看看你喜欢哪一双鞋子,然后把它的编号给记下来,接下来你在逛街的时候,发现了同款Air Jordan的鞋子,好,你付钱买了,那么这就是我们原生的CRUD操作。
现在不一样了,我们有专门为客户定制的Air Jordan款,客户可以自己选择颜色搭配,搭配好了之后,店员会根据你的需求为原生的Air Jordan上色,然后你就可以拿到属于自己的独有的Air Jordan了,是不是很酷?

那为了完成这个操作,我们就要用到动态代理来实现了,这里的动态代理就好比我们NIKE的店员。之前我们在
Marco’s Java【设计模式】之【代理模式】 有讲到过动态代理机制,有看过的朋友应该还有印象,我们通过自定义代理实现InvocationHandler接口来简单模拟了阿里巴巴售票的过程。那在Mybatis中也提供了类似的机制,我们之前看Mybatis的文件目录的时候应该有看到cglib的jar包对吧?
这个就是Mybatis的动态代理使用的jar包。

第一步,我们先创建一个Dao包com.marco.dao,然后把我们之前写的方法全部挪到这个UserMapper接口中,这就好比我们自己自定Air Jordan款式的操作

public interface UserMapper {
	
	public void addUser(User user);
	
	public void updateUser(User user);
	
	public void deleteUser(int id); 
	
	public User queryUserById(Integer id);
 	
	public List<User> selectAll();
	
}

第二步,将这里的配置重新设置为我们UserMapper的全路径,这就是我们之前提到的namespace的接口绑定,只有做了接口绑定之后,接口中的方法才能生效
在这里插入图片描述

第三步,获取SqlSession对象并创建UserMapper对象

SqlSession session = MybatisUtil.getSession();//获取SqlSession对象
UserMapper mapper = session.getMapper(UserMapper.class);//通过动态代理获取UserMapper 对象

前三步完成之后,我们就可以调用方法测试啦,在这里我就测试添加用户方法

mapper.addUser(user);
session.commit();//一定要手动提交

在这里插入图片描述
这样我们就动态添加数据成功啦。但是,还没有完哦,相信大家在测试时发现了一个问题,细心的朋友在第一节应该就有发现,当我们queryUser对象的时候,userName和realName一直都是null?
在这里插入图片描述
这是因为,我们的类的成员变量的名称和数据库表中的字段名称不匹配造成的,我们在之前做销售合同项目的时候,是使用了别名这种方式解决的这个问题,那么在Mybatis中必定会有类似的方式来解决相似的问题。
那么这里就要使用到我们的select标签中的resultMap属性。
我们之前使用的是resultType属性,返回的是一个Java类,里面的成员变量信息都是写死了的,没有办法直接改变,那么这个时候就要用到resultMap,那么大家可以使用以下配置,解决字段和变量名不一致的问题。
在这里插入图片描述
我在这里说明一下,在select标签中的resutMap的值和resultMap中的唯一标识id的值是一一匹配的,同resutType一样,返回值只用写返回值的类,不管是单个对象和List集合都可以,因为Mybatis的底层会帮我们封装,这也正是凸显了Mybatis的强大!接下来就是见证奇迹的时刻
在这里插入图片描述


讲了这么久,来点"甜点"吧

typeAliases别名的优化

话说Java在设计的时候都是推崇将相同的事物封装起来,并且共享使用,增强复用性的原理,正如我们之前讲到的代理模式中也有着它的影子,不仅仅是程序,我们生活中也有着很多这样的栗子,前几年,还没有共享单车的时候,大家都是挤公交,很短的路程会拦个的士

标签:Marco,Java,UserMapper,CRUD,id,public,session,user,我们
来源: https://blog.csdn.net/weixin_44698119/article/details/94578415