初识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. netstat 参数

    Netstat用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况. NETSTAT [-a] [-b] [-e] [-n] [-o] [-p proto] ...

  2. POJ2406 Power Strings —— KMP or 后缀数组 最小循环节

    题目链接:https://vjudge.net/problem/POJ-2406 Power Strings Time Limit: 3000MS   Memory Limit: 65536K Tot ...

  3. mysql批量sql插入优化

    对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. ...

  4. html5--3.8 input元素(7)

    html5--3.8 input元素(7) 学习要点 input元素及其属性 input元素 用来设置表单中的内容项,比如输入内容的文本框,按钮等 不仅可以布置在表单中,也可以在表单之外的元素使用 i ...

  5. html5--4-5 embed元素及其他

    html5--4-5 embed元素及其他 学习要点 掌握embed元素的使用 了解object元素的使用 温馨提示:关于video和audio的事件方法等涉及都JavaScript知识的内容,暂时不 ...

  6. UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数

    一.IPv4与IPv6的互操作性 1.IPv4客户与IPv6服务器 拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户.这是通过使用IPv4映射 ...

  7. storyBoard学习教程二(页面跳转)

    本篇是接着上一篇 storyBoard 学习教程一 的补充,有过storyBoard 编程经验的伙伴还是不要阅读本篇博客了,我自己认为,太基础太简单了,为了方便别人学习使用,我还是详细的做了这篇教程. ...

  8. <正则吃饺子>:关于使用powerDesign连接oracle数据库,导出数据表结构(ER图吧)

    最近做的项目中,没有完整的数据库表结构图(ER图),自己就根据服务器上oracle数据库和powerdesign整理一份,但是存在两个问题:1.没有把数据库表的相关备注弄下来:2.数据库表中的主外键关 ...

  9. 各浏览器userAgent汇总

    浏览器  navigator.userAgent  备注  IE6  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)   IE7  Mo ...

  10. 2.11 Hive中数据导入导出Import和Export使用

    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ImportExport 一.Export.Import Export ...