初识MyBatis

1、MyBatis的定义

1)、MyBatis(前身是iBatis)是一个支持普通SQL查询、存储过程以及高级映射的持久层框架

2)、MyBatis框架也被称之为ORM(Object/Relation Mapping,即对象关系映射框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。

3)、ORM框架的工作原理:

4)、Hibernate与MyBatis的区别:

2、MyBatis的工作原理

3、MyBatis入门程序

1)、查询客户:在实际开发中,查询操作通常都会涉及到单条数据的精确查询,以及多条数据的模糊查询

2)、根据客户编号查询客户信息;根据客户名模糊查询客户信息。

a)、创建mybatis数据库,并且插入3条数据:

b)、由于MyBatis默认使用log4j输出日志信息,所以如果要查看控制台的输出SQL语句,那么就需要在classpath路径下配置其日志文件。在项目的src目录下创建log4j.properties文件。

# Global logging configuration,全局的日志配置,Mybatis的日志配置和控制台输出,其中Mybatis的日志配置用于将com.itheima包下所有类的日志记录级别设置为DEBUG
log4j.rootLogger=ERROR, stdout

# MyBatis logging configuration...
log4j.logger.com.itheima=DEBUG

# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

c)、src->com.itheima.po

①客户持久化类:Customer.java(属性字段与数据库中的表字段相对应)

 package com.itheima.po;
/**
* 客户持久化类
*/
public class Customer { // 一个POJO(普通java对象) private Integer id; // 主键id
private String username; // 客户名称
private String jobs; // 职业
private String phone; // 电话 public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getJobs() {
return jobs;
} public void setJobs(String jobs) {
this.jobs = jobs;
} public String getPhone() {
return phone;
} public void setPhone(String phone) {
this.phone = phone;
} @Override
public String toString() {
return "Customer [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]";
}
}

d)、src->com.itheima.mapper

①映射文件:CustomerMapper.xml

 <?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">
<!-- 以上是Mybatis映射文件的约束信息 --> <!-- <mapper>是根元素,包括一个属性namespace表示命名空间,通常会设置成“包名+SQL映射文件名”的形式 -->
<mapper namespace="com.itheima.mapper.CustomerMapper"> <!--子元素<select>中的信息是用于执行查询操作的配置,根据客户编号获取客户信息 -->
<select id="findCustomerById" parameterType="Integer" resultType="com.itheima.po.Customer">
<!-- 其id属性是<select>元素在映射文件中的唯一标识
属性parameterType:用于指定传入参数的类型
属性resultType:用于指定返回结果的类型,这里表示返回的数据是Customer对象类型
"#{}"用于表示一个占位符,相当于"?",而"#{id}"表示该占位符待接收参数的名称为id
-->
select * from t_customer where id = #{id}
</select> <!--根据客户名模糊查询客户信息列表-->
<select id="findCustomerByName" parameterType="String" resultType="com.itheima.po.Customer">
<!-- select * from t_customer where username like '%${value}%' -->
<!-- "${}"用来表示拼接SQL的字符串,即不加解释的原样输出,
"${value}"表示要拼接的是简单类型参数
注意:使用"${}"无法防止SQL注入问题,但可以做如下修改:使用concat()函数进行字符串拼接,这点需要注意
-->
select * from t_customer where username like concat('%',#{value},'%')
</select> <!-- 添加客户信息,<insert>元素来实现 -->
<insert id="addCustomer" parameterType="com.itheima.po.Customer">
insert into t_customer(username,jobs,phone)
values(#{username},#{jobs},#{phone})
</insert> <!-- 更新客户信息,<update>元素来实现 -->
<update id="updateCustomer" parameterType="com.itheima.po.Customer">
update t_customer set
username=#{username},jobs=#{jobs},phone=#{phone}
where id=#{id}
</update> <!-- 删除客户信息,<delete>元素来实现 -->
<delete id="deleteCustomer" parameterType="Integer">
delete from t_customer where id=#{id}
</delete>
</mapper>

e)、src->mybatis-config.xml

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 以上是Mybatis映射文件的约束信息 --> <!-- 以下是开发人员需要配置的信息,都放在<configuration>元素中进行配置 --> <configuration> <!--1、配置环境 ,默认的环境id为mysql-->
<environments default="mysql"> <!--1.2、配置id为mysql的数据库环境 -->
<environment id="mysql"> <!-- 使用JDBC的事务管理 -->
<transactionManager type="JDBC" /> <!--数据库连接池 -->
<dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="******" /> </dataSource>
</environment>
</environments> <!--2、配置Mapper的位置 -->
<mappers>
<mapper resource="com/itheima/mapper/CustomerMapper.xml" />
</mappers> </configuration>

f)、src->com.itheima.test

①测试类:MybatisTest.java

 package com.itheima.test;
import java.io.InputStream;
import java.util.List;
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.Test;
import com.itheima.po.Customer;
/**
* 入门程序测试类
*/
public class MybatisTest {
/**
* 根据客户编号查询客户信息
*/
@Test
public void findCustomerByIdTest() throws Exception { // 1、通过输入流读取配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource); // 2、根据配置文件构建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 3、通过SqlSessionFactory工厂创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(); // 4、SqlSession执行映射文件中定义的SQL,并返回映射结果(执行查询操作)
// 参数1:表示映射SQL的标识字符串,它由CustomerMapper.xml中<mapper>元素的namespace属性值+<select>元素的id属性值组成
// 参数2:表示查询所需要的参数
Customer customer = sqlSession.selectOne("com.itheima.mapper.CustomerMapper.findCustomerById", 1); // 5、打印输出结果
System.out.println(customer.toString()); // 6、关闭SqlSession
sqlSession.close();
} /**
* 根据用户名称来模糊查询用户信息列表
*/
@Test
public void findCustomerByNameTest() throws Exception{ // 1、通过输入流读取配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource); // 2、根据配置文件构建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 3、通过SqlSessionFactory创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(); // 4、SqlSession执行映射文件中定义的SQL,并返回映射结果(返回集合对象,查询的结果为多条语句)
List<Customer> customers = sqlSession.selectList("com.itheima.mapper.CustomerMapper.findCustomerByName", "j"); for (Customer customer : customers) {
//打印输出结果集
System.out.println(customer);
}
// 5、关闭SqlSession
sqlSession.close();
} /**
* 添加客户
*/
@Test
public void addCustomerTest() throws Exception{ // 1、读取配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource); // 2、根据配置文件构建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 3、通过SqlSessionFactory创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(); // 4、SqlSession执行添加操作
// 4.1先创建Customer对象,并向对象中添加数据
Customer customer = new Customer();
customer.setUsername("rose");
customer.setJobs("student");
customer.setPhone("13333533092"); // 4.2执行SqlSession的插入方法,返回的是SQL语句影响的行数
int rows = sqlSession.insert("com.itheima.mapper.CustomerMapper.addCustomer", customer); // 4.3通过返回结果判断插入操作是否执行成功
if(rows > 0){
System.out.println("您成功插入了"+rows+"条数据!");
}else{
System.out.println("执行插入操作失败!!!");
} // 4.4提交事务
sqlSession.commit(); // 5、关闭SqlSession
sqlSession.close();
} /**
* 更新客户
*/
@Test
public void updateCustomerTest() throws Exception{ // 1、读取配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource); // 2、根据配置文件构建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 3、通过SqlSessionFactory创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(); // 4、SqlSession执行更新操作
// 4.1创建Customer对象,对对象中的数据进行模拟更新
Customer customer = new Customer();
customer.setId(1);
customer.setUsername("rose");
customer.setJobs("programmer");
customer.setPhone("13311111111"); // 4.2执行SqlSession的更新方法,返回的是SQL语句影响的行数
int rows = sqlSession.update("com.itheima.mapper.CustomerMapper.updateCustomer", customer); // 4.3通过返回结果判断更新操作是否执行成功
if(rows > 0){
System.out.println("您成功修改了"+rows+"条数据!");
}else{
System.out.println("执行修改操作失败!!!");
} // 4.4、提交事务
sqlSession.commit(); // 5、关闭SqlSession
sqlSession.close();
} /**
* 删除客户
*/
@Test
public void deleteCustomerTest() throws Exception{ // 1、读取配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource); // 2、根据配置文件构建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 3、通过SqlSessionFactory创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(); // 4、SqlSession执行删除操作
// 4.1执行SqlSession的删除方法,返回的是SQL语句影响的行数
int rows = sqlSession.delete("com.itheima.mapper.CustomerMapper.deleteCustomer", 5); // 4.2通过返回结果判断删除操作是否执行成功
if(rows > 0){
System.out.println("您成功删除了"+rows+"条数据!");
}else{
System.out.println("执行删除操作失败!!!");
} // 4.3、提交事务,表示已经完成了对数据库的操作
sqlSession.commit(); // 5、关闭SqlSession(会话对象)
sqlSession.close();
} }

②运行结果:

根据客户编号查询用户id为1的信息:

根据客户名模糊查询客户表中客户名称带有"j"的两条信息。

添加一条客户(id为4)信息:

更新用户id为4的信息:

删除用户id为4的一条记录:

个人总结:

Mybatis操作大致可以分为以下几个步骤:

1)、用输入流读取配置(mybatis-config)文件;

2)、通过配置文件创建SqlSessionFactory会话工厂;

3)、通过SqlSessionFactory创建SqlSession会话对象;

a)、可以创建用户实现类(作为sql方法的参数)对用户数据的“增改”操作,然后通过创建出来的SqlSession对象去执行sql方法。

4)、使用SqlSession对象(mybatis底层通过Executor接口,其会根据SqlSession传递的参数动态生成执行的SQL语句,同时负责查询缓存的维护)操作数据库。

5)、关闭SqlSession会话对象。

Java EE学习笔记(六)的更多相关文章

  1. Java IO学习笔记六:NIO到多路复用

    作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...

  2. java jvm学习笔记六(实现写自己的安全管理器)

    安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用AccessController的checkPerssiom方法,访问控 ...

  3. Java泛型学习笔记 - (六)泛型的继承

    在学习继承的时候, 我们已经知道可以将一个子类的对象赋值给其父类的对象, 也就是父类引用指向子类对象, 如: Object obj = new Integer(10); 这其实就是面向对象编程中的is ...

  4. Java IO学习笔记六

    打印流 在整个IO包中,打印流是输出信息最方便的类,主要包含字节打印流(PrintStream)和字符打印流(PrintWrite).打印流提供了非常方便的打印功能,可以打印任何的数据类型,例如:小数 ...

  5. Java基础学习笔记六 Java基础语法之类和ArrayList

    引用数据类型 引用数据类型分类,提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类.我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner ...

  6. Java EE学习笔记(七)

    MyBatis的核心配置 1.MyBatis的核心对象 1).SqlSessionFactory是MyBatis框架中十分重要的对象,它是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建Sql ...

  7. Java NIO学习笔记六 SocketChannel 和 ServerSocketChannel

    Java NIO SocketChannel Java NIO SocketChannel是连接到TCP网络socket(套接字)的通道.Java NIO相当于Java Networking的sock ...

  8. 《Thinking in Java》学习笔记(六)

    1.Class相关知识 Class类可以理解为类的图纸,通过Class类可以分析类的结构.构建出类的实例. Class.forName("test.TestClass").newI ...

  9. Java EE学习笔记(十)

    MyBatis与Spring的整合 1.整合环境搭建 1).要实现MyBatis与Spring的整合,很明显需要这两个框架的JAR包,但是只使用这两个框架中所提供的JAR包是不够的,还需要其他的JAR ...

随机推荐

  1. 分布式版本控制系统—git命令

    一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...

  2. python字典无序?有序?

    默认情况下Python的字典输出顺序是按照键的创建顺序. 字典的无序是指,不能人为重新排序.比如说你按键值1,2,3,4的顺序创建的字典,只能由解析器按创建顺序,还是1,2,3,4的输出.你无法控制它 ...

  3. HTML5 Canvas 时钟

    1. [图片] QQ截图20120712130049.png ​2. [代码][HTML]代码 <!DOCTYPE html><html lang="en" &g ...

  4. Asterisk 拨号方案中截取字符串

    在dialplan中要截取字符串可用如下几种方式: 1.转到agi中由php进行处理,这种方法比较简单,在这里不再缀述 2.在dialplan中利用内置的方法进行截取 如 [test] exten = ...

  5. CodeForces813E:Army Creation (主席树---上一题的加强版)

    As you might remember from our previous rounds, Vova really likes computer games. Now he is playing ...

  6. bzoj 4289 PA2012 Tax——构图

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 可以把一个点上的边按权值排序,然后边权小的向第一个比它大的连差值的边,边权大的向第一个 ...

  7. bzoj 3027 [Ceoi2004] Sweet —— 生成函数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3027 就是 (1+x+x2+...+xm[i]) 乘起来: 原来想和背包一样做,然而时限很短 ...

  8. PYTHON 异常处理 二 TRY 模块

    异常处理 捕捉异常可以使用try/except语句. try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理. 如果你不想在异常发生时结束你的程序,只需在try ...

  9. Asset Catalog Help (四)---Adding an iOS App Icon Set or Launch Image Set

    Adding an iOS App Icon Set or Launch Image Set Organize different resolutions of your app icons and ...

  10. error: templates may not be ‘virtual’

     模板函数不能是虚函数,原因如下:   首先呢,模板函数并不是函数,他需要特定的类型去实例化成为函数.你定义一个函数模板,是不生成任何函数的,只有当你用代码去调用它时,才会根据你的类型去实例化成为特定 ...