目录
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]
查询结束