MyBatis开发入门

Posted 任长江

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis开发入门相关的知识,希望对你有一定的参考价值。

        总是感觉很多知识在脑子当中没有一个系统化的组织,感觉很难受,希望能通过再系统化的学习一遍,将知识组织起来。

一、MyBatis的特点

        1、从原生JDBC编程到借助MyBatis

                之前JDBC的编程方式存在的问题为存在较多的硬编码,不利于系统的维护,同时,对于数据库的连接频繁;从JDBC到MyBatis后MyBatis借助配置文件以及输入映射和输出映射消除了很多硬编码,提高了系统的维护性,同时借助数据库连接池减少对数据库的频繁连接。

        2、MyBatis与Hibernate对比

                Hibernate是一个ORM框架,自动生成SQL,对SQL优化和修改相对困难,而MyBatis是一个半ORM框架,程序自己编写SQL,这样可以写出效率更高的SQL语句,所以,Hibernate一般用在一些需求变化不多的小型项目中,而MyBatis用在需求变化较多的项目中。

二、总体认识

        Mybatis框架的结构有如下几部分

        1、SqlMapConfig.xml——mybatis的全局配置文件,用来配置数据源、事务等mybatis的运行环境参数信息。

        2、配置映射文件——配置sql语句。

        3、SqlSessionFactory——会话工厂,用来根据配置文件创建SqlSession。

        4、SqlSession——会话,用来操作数据库。

        5、Executor——执行器,SqlSession内部是通过执行器操作数据库。

        6、输入参数——传入到sql语句中的输入参数。

        7、输出参数——接收sql语句执行返回的结果。

        8、mappeed statement——对sql语句、输入参数和输出参数的封装。

        组织结构如下图所示:

三、基本CRUD

        1、sqlMapConfig.xml

               配置mybatis的运行环境、数据源和事务

<configuration>	
	<!-- 和spring整合后 environments配置将废除-->
	<environments default="development">
		<environment id="development">
		<!-- 使用jdbc事务管理,事务控制由mybatis-->
			<transactionManager type="JDBC" />
		<!-- 数据库连接池,由mybatis管理-->
			<dataSource type="POOLED">
				<property name="driver" value="$jdbc.driver" />
				<property name="url" value="$jdbc.url" />
				<property name="username" value="$jdbc.username" />
				<property name="password" value="$jdbc.password" />
			</dataSource>
		</environment>
	</environments>
</configuration>

        2、查询

        (1)POJO类定义

public class User 
	
	//属性名和数据库表的字段对应
	private int id;
	private String username;// 用户姓名
	private String sex;// 性别
	private Date birthday;// 生日
	private String address;// 地址

        (2)映射文件User.xml(对于后边介绍的mapper代理开发方式的映射文件命名会有所不同)

<mapper namespace="UserMapper">
	<select id="findUserById" parameterType="int" resultType="User">
		SELECT * FROM USER WHERE id=#id
	</select>
</mapper>

        认识:

               1、namespace(命名空间)对sql进行分类管理

               2、id为命名空间中sql语句的标识

               3、parameterType指定输入参数的类型

               4、resultType为SQL输入结果的映射类型。

                5、#id占位符,id表示输入参数,与输入参数对应。

        (3)通过sqlMapConfig.xml加载User.xml

	<!-- 加载 映射文件 -->
	<mappers>
		<mapper resource="sqlmap/User.xml"/>
	</mappers>

        (4)实现查询

	// 根据id查询用户信息,得到一条记录结果
	public void findUserByIdTest() throws IOException 

		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybatis的配置文件信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
				.build(inputStream);

		// 通过工厂得到SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();

		// 通过SqlSession操作数据库
		// 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
		// 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
		// sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
		// selectOne查询出一条记录
		User user = sqlSession.selectOne("test.findUserById", 1);

		System.out.println(user);

		// 释放资源
		sqlSession.close();

	

        3、模糊查询

        (1)映射文件

	<select id="findUserByName" parameterType="java.lang.String" resultType="mybatis.po.User">
		SELECT * FROM USER WHERE username LIKE '%$value%'
	</select>

        认识:

               $(value),$()用来拼接sql语句,如果输入参数为简单类型,$()只能使用value变量

        (2)实现查询

	// 根据用户名称模糊查询用户列表
	public void findUserByNameTest() throws IOException 
		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybatis的配置文件信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
				.build(inputStream);

		// 通过工厂得到SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// list中的user和映射文件中resultType所指定的类型一致
		List<User> list = sqlSession.selectOne("test.findUserByName", "小明");
		System.out.println(list);
		sqlSession.close();
	

        4、添加用户

        (1)映射文件

	<insert id="insertUser" parameterType="mybatis.po.User">
		insert into user(username,birthday,sex,address) value(#username,#birthday,#sex,#address)		
	</insert>

        认识:

               这里输入参数类型为POJO对象类型,Mybatis是通过OGNL获取对象属性的,在SQL中的参数#中指定的为POJO的属性值。

        (2)实现添加

	// 添加用户信息
	public void insertUserTest() throws IOException 
		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybatis的配置文件信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
				.build(inputStream);

		// 通过工厂得到SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 插入用户对象
		User user = new User();
		user.setUsername("王小军");
		user.setBirthday(new Date());
		user.setSex("1");
		user.setAddress("河南郑州");

		sqlSession.insert("test.insertUser", user);

		// 提交事务
		sqlSession.commit();

		// 获取用户信息主键
		System.out.println(user.getId());
		// 关闭会话
		sqlSession.close();
	

        (3)主键返回

               自增主键返回:在我们对两张表操作的过程中,有时会需要获取刚插入到表1中记录的主键。可通过如下代码实现:

	<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
		<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
			SELECT LAST_INSERT_ID()
		</selectKey>
		insert into user(username,birthday,sex,address) value(#username,#birthday,#sex,#address)	
	</insert>

        认识:

               1、keyProperty:将查询的主键设置到parameterType指定对象的那个属性上。

               2、order:相对于insert语句的执行顺序。AFTER表示在insert之后执行。

               3、resultType:指定selectKey中语句的返回值类型。

               非自增主键返回:

	<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
		<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
			SELECT uuid()
		</selectKey>
		insert into user(id,username,birthday,sex,address) value(#id,#username,#birthday,#sex,#address)	
	</insert>

               这是首先获取uuid再通过这个uuid插入记录。

        5、删除用户

        (1)映射文件

	<delete id="deleteUser" parameterType="java.lang.Integer">
		delete from user where id=#id
	</delete>

        (2)实现删除

	// 根据id删除 用户信息
	public void deleteUserTest() throws IOException 
		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybatis的配置文件信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
				.build(inputStream);

		// 通过工厂得到SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();

		// 传入id删除 用户
		sqlSession.delete("test.deleteUser", 39);

		// 提交事务
		sqlSession.commit();

		// 关闭会话
		sqlSession.close();
	

        6、更新用户

        (1)映射文件

	<update id="updateUser" parameterType="cn.itcast.mybatis.po.User">
		update user set username=#username,birthday=#birthday,sex=#sex,address=#address 
		 where id=#id
	</update>

        (2)实现更新

	// 更新用户信息
	public void updateUserTest() throws IOException 
		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybatis的配置文件信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
				.build(inputStream);

		// 通过工厂得到SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 更新用户信息
		
		User user = new User();
		//必须设置id
		user.setId(41);
		user.setUsername("王大军");
		user.setBirthday(new Date());
		user.setSex("2");
		user.setAddress("河南郑州");

		sqlSession.update("test.updateUser", user);
		
		// 提交事务
		sqlSession.commit();

		// 关闭会话
		sqlSession.close();
	

 四、总结

        1、parameterType和resultType

               分别对应输入映射和输出映射。

        2、#()和$()

               #()表示一个占位符,$()用来拼接字符串。都可以接受输入参数,输入参数的类型也可以都为简单类型和POJO、Map等参数。#()中的参数名称没有限制,$()的参数名称如果为简单类型只能为value。

         4、selectOne和selectList

               selectOne查询一条记录映射,selectList查询多条记录进行映射,selectList可以替代selectOne,反之不可以。

 

以上是关于MyBatis开发入门的主要内容,如果未能解决你的问题,请参考以下文章

2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书

2023河南省第二届职业技能大赛郑州市选拔赛“网络安全”项目比赛样题任务书

中国古代历朝首都一览

让视界历久弥新—河南省首例白内障超声乳化+TECNIS Symfony(新无级)人工晶状体植入术在郑州博爱眼科中心成功实施

2017第五届中国(河南)创业者大会成功落幕

计算机考研:河南有哪些性价比高的学校?