MyBatis(第六章)

本文介绍了MyBatis这一Java持久层框架,它提供了灵活和可优化的SQL操作。相较于全表映射的Hibernate,MyBatis更注重于SQL的自由定制和性能优化。文中详细讲解了MyBatis的下载、工作原理,并通过一个简单的入门程序展示了如何进行增删改查操作。此外,还对比了MyBatis与Hibernate的区别,并提供了核心配置文件和Mapper映射文件的示例。
摘要由CSDN通过智能技术生成

目录

6

6.1  什么是MyBatis

6.2  MyBatis的下载和使用

6.3  MyBatis的工作原理

6.4  MyBatis入门程序(增删改查)


6

6.1  什么是MyBatis

Java持久层框架之一。

优点:1灵活性高。2可优化性。3易于维护。

也被称为ORM(对象关系映射)框架,为了解决面向对象与关系型数据库中数据类型不匹配的技术,通过描述Java对象与数据库之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据可的表中。

常见ORM框架:

    1 Hibernate:全表映射框架。优点1根据制定的存储逻辑,自动生成对应的sql,并调用jdbc接口来执行。2开发效率相对高。缺点1查询,更新较差。2不支持存储过程。3不能通过sql来优化性能。

    2 MyBatis:半自动映射框架。优点:可配置动态sql并优化sql。2可自主配置映射规则。3支持存储过程。缺点:手动编写sql的量大。(适合复杂,需优化性能的项目)

6.2  MyBatis的下载和使用

6.3  MyBatis的工作原理

6.4  MyBatis入门程序(增删改查)

程序流程:

    1建立数据库。

    2导jar包到lib目录下(Mybatis的和核心jar包,lmysql数据库的驱动jar包)。

    3对应数据字段库建立实体类。

    4在src目录下建立mapper包以存放映射文件。

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"      
 "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<!-- 以上<!DOCTYPE..>是MyBatis的约束配置 以下<mapper.../mapper>是编写的映射信息。 其中namespace属性指定了唯一的命名空间(通常形式为“包名+sql文件映射名”)。 
	id:<select>元素在映射文件中的唯一标识; parameterType:指定传入参数的类型 ;resultType:返回数据的类型。 #{}:表示一个占位符,相当于?,用于接受括弧内的参数。 -->

<mapper namespace="test">
	<insert id="save" parameterType="entity.Emp">
		insert into emp(name,age)
		values(#{name},#{age});
	</insert>
	<select id="findAll" resultType="entity.Emp">
		select * from emp;
	</select>
	<select id="findById" parameterType="int"
		resultType="entity.Emp">
		select * from emp where id=#{id};
	</select>
	<!-- 返回map类型的结果,mybatis会将查询结果先封装到一个Map对象里面(以字段名为key,以字段值为value,然后再将map对象中的数据添加到实体对象) -->
	<select id="findById2" parameterType="int" resultType="map">
		select *
		from emp where id=#{id}
	</select>
	<!-- 使用ResultMap解决表的字段名与实体类的属性名不一致的情况 -->
	<select id="findById3" parameterType="int" resultMap="emp2Map">
		select *
		from emp where id=#{id};
	</select>
	<select id="findByName" parameterType="String" resultType="map">
		select * from emp where name like '%${value}%'
	</select>
	<!-- 处理表的字段名与实体类的属性名的对应关系 -->
	<resultMap type="entity.Emp2" id="emp2Map">
		<result property="empNo" column="id"></result>
		<result property="ename" column="name"></result>
	</resultMap>

	<update id="modify" parameterType="entity.Emp">
		update emp set name=#{name} ,
		age=#{age} where id=#{id};
	</update>
	<delete id="deleteById" parameterType="int"><!-- 参数不写也可,会自动识别 -->
		delete from emp where id=#{id};
	</delete>
	<delete id="deleteAll" parameterType="int">
		delete from emp where
		id=#{id};
	</delete>
</mapper>

    5添加核心配置文件(1配置环境 2配置Mapper位置)

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" 
	"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
	<environments default="environment"><!-- 1配置环境 -->
		<environment id="environment"><!-- 1.1配置环境id -->
			<transactionManager type="JDBC" /><!-- 使用jdbc的事务管理 -->
			<dataSource type="POOLED"><!-- 数据库连接池 -->
				<property name="driver" value="com.mysql.cj.jdbc.Driver" />
				<property name="url"
					value="jdbc:mysql://localhost:3306/netctoss?serverTimezone=UTC" />
				<property name="username" value="root" />
				<property name="password" value="1111" />
			</dataSource>
		</environment>
	</environments>
	<mappers><!-- 指定映射文件的位置 -->
		<mapper resource="entity/EmpMapper.xml" />
	</mappers>
</configuration>

    6测试(内含MyBatis操作流程:1读取配置文件  2根据配置文件构建SqlSessionFactory  3通过SqlSessionFactory创建SqlSession  4使用SqlSession对象操作数据库(增删改查及提交事务等)  5关闭SqlSession)。

package test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.web.context.request.async.DeferredResult;

import com.mysql.cj.Session;

import entity.Emp;
import entity.Emp2;

public class TestCase {
	private SqlSession session;

	@Before
	public void init() throws IOException {
		// 1获得SqlSessionFactoryBuilder
		SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
		/*
		 * 2通过ssfb调用builder()方法,方法里需要将🐖配置文件转换为inputstream后作为参数
		 * 2.1获得inputStream方式一:通过Resource InputStream
		 * inputStream=Resources.getResourceAsStream("SqlMapConfig.xml");
		 * 2.2获得inputStream方式二:通过当前测试类的getClassLoader()方法
		 */
		SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml"));
		// SqlSessionFactory ssf=ssfb.build(inputStream);
		// 3通过SqlSessionFactory创建SqlSession
		session = ssf.openSession();
	}

	@Test /* 测试insert标签,添加数据 */
	public void test1() {
		Emp emp = new Emp();
		emp.setName("lala");
		emp.setAge(11);
		session.insert("test.save", emp);
		session.commit();// 手动提交事务,语句才能操作成功
		session.close();// 关闭SqlSession
		System.out.println("添加成功");
	}

	@Test /* 测试select标签,查询全部数据 */
	public void test2() {
		List<Emp> emps = session.selectList("test.findAll");
		System.out.println(emps);
		session.close();
		System.out.println("查询结束");
	}

	@Test /* 测试select标签,查询单条数据 */
	public void test3() {
		Emp emp2 = session.selectOne("test.findById", 1);
		System.out.println(emp2);
		session.close();
		System.out.println("查询结束");
	}

	@Test /* 测试select */
	public void test4() {
		Emp emp3 = session.selectOne("test.findById", 1);
		emp3.setName("jaja");
		emp3.setAge(45);
		session.update("test.findById", emp3);
		System.out.println(emp3);
		session.close();
		System.out.println("查询结束");
	}

	@Test // 测试删除单条记录
	public void test05() {
		/*
		 * 1得到SqlSessionFactoryBuilder对象ssfb,-->new出来 1-2将主配置文件转换为InputStream
		 * 2得到SqlSessionFactory对象ssf,ssfb.build() 3得到SqlSession对象ss,ssf.openSession()
		 */
		session.delete("test.deleteById", 2);
		session.commit();
		session.close();
		System.out.println("删除成功");
	}

	@Test // 测试删除全部记录
	public void test06() {
		session.delete("test.deleteAll");
		session.commit();
		session.close();
		System.out.println("删除成功");
	}

	@Test // 查询一条
	public void test07() {
		Map emp = session.selectOne("test.findById2", 1);
		System.out.println(emp);
		System.out.println(emp.get("name"));
		session.close();
	}

	@Test // 查询一条
	public void test08() {
		Emp2 emp = session.selectOne("test.findById3", 1);
		System.out.println(emp);
		session.close();
	}

	@Test // 模糊查询
	public void test09() {
		List<Emp> emps = session.selectList("test.findByName", "a");
		for (Emp emp : emps) {
			System.out.println(emp);
		}
		session.close();
		System.out.println("查询结束");
	}
}

(模糊查询:${}表示拼接SQL字符串,${value}表示要拼接的是简单类型参数。此种无法防止sql注入问题,但使用concat()函数拼接字符串,如:  like tom('%',#{value},'%')  即能实现模糊查询又能防止sql注入。下图  .selectList()  方法来查询返回结果的集合对象。)

<select id="findByName" parameterType="String" resultType="entity.Emp">
		select * from emp where name like '%${value}%'
</select>
@Test
	public void test09() {
		List<Emp> emps = session.selectList("test.findByName","a");
		for (Emp emp : emps) {
			System.out.println(emp);
		}
		session.close();
		System.out.println("查询结束");
	}
Emp [id=1, name=haha, age=11]
Emp [id=3, name=lala, age=11]
Emp [id=4, name=lala, age=11]
Emp [id=8, name=lala, age=11]
查询结束

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值