什么是MyBatis?

答:它是一个持久层框架

说的太简单了吗?那让我们来看一下官方的文档描述:

MyBatis有什么作用呢?

1.持久层的零实现

2.可以自动将数据封装到对象里面不需要手工编写映射的关系

MyBatis基于XML配置文件的配置流程图:    

配置流程步骤及代码:

1.导入包:

2.创建总的配置文件

  注意,要在设置中设置两个规则文件,第一个是用于总配置文件中,第二个是用于配置映射文件中,在配置中遇到PUBLIC ID

  可在MyBatis的官方文档中找到

PUBLIC ID

总配置文件编写代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
<configuration>
<!--environments标签用于配置数据库连接信息,可以配置多个数据库的连接信息
default属性:环境集里面可以配置多个数据库连接环境,但是必须要指定默认的环境,指定的是环境environment标签的ID
-->
<environments default="sms">
<!-- environment环境标签 ,用于配置一个数据库连接的信息-->
<environment id="sms">
<!-- 指定使用的事务类型 -->
<!-- 观点:任何框架的内置属性都可以在代码里面找到 -->
<!-- 大部分配置文件的解释类都是在configuration、builder这个两个单词或者单词的缩写的包里面
在org.apache.ibatis.session.Configuration配置类里面找到对应的代码查看
JDBC : 使用JDBC的事务处理
MANAGER: 不需要事务处理
-->
<transactionManager type="JDBC"></transactionManager>
<!--
dataSource标签:作用,配置数据库连续信息
type:配置数据源的类型
JNDI :使用JNDI数据源,就是在web服务器配置数据源,让程序调用
POOLED : 使用默认内置的连接池
UNPOOLED:使用直连数据库,不需要连接池
-->
<dataSource type="POOLED">
<!-- 配置四要素 -->
<property name="driver" value="org.gjt.mm.mysql.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/sms" />
<property name="username" value="root" />
<property name="password" value="" />
</dataSource>
</environment>
</environments>

创建一个MyBatisUtils工具类,用来加载总配置文件

package cn.gzsxt.utils;

import java.io.IOException;
import java.io.Reader; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MybatisUtils {
//注意事项,我们正常情况下,一个项目只有一个数据源。因为如果出现多个数据源,数据库的连接就可能来自于不同的数据源
//这样可以导致数据库连接无法同步,从而导致事务失效! //要求:对外只开放一个会话工厂。
public static final SqlSessionFactory SSF=createSSF(); //声明一个线程变量
private static final ThreadLocal<SqlSession> THREAD_LOCAL=new ThreadLocal<>(); //1.获得会话工厂
private static SqlSessionFactory createSSF(){ try {
//读取配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//创建会话工厂构建类对象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//构建会话工厂
return builder.build(reader);
} catch (IOException e) {
e.printStackTrace();
}
return null;
} //2.获得会话
//需求:同访问的一条线程,获得的会话是相同的
//答:可以通过线程变量实现(ThreadLoad)
//ThreadLoad对象的作用,就是可以实现,同一条线程共享一个变量。
public static SqlSession getSession(){
//如果线程变量没有对象,我们获得会话对象,并且放在线程变量里面
if (THREAD_LOCAL.get()==null) {
SqlSession session = SSF.openSession();
//将对象放在线程变量里面
THREAD_LOCAL.set(session);
}
//如果已经有该会话。直接返回线程变量的会话对象。
return THREAD_LOCAL.get();
} //使用了线程变量,在关闭会话的时候,需要清除线程变量的对象;。
public static void close(){
if (THREAD_LOCAL.get()!=null) {
SqlSession session = THREAD_LOCAL.get();
session.close();
THREAD_LOCAL.remove();
}
} public static void main(String[] args) {
System.out.println(MybatisUtils.getSession());
System.out.println(MybatisUtils.getSession());
} }

创建实体类

package cn.gzsxt.pojo;

import java.io.Serializable;
import java.util.Date; public class Student implements Serializable { private static final long serialVersionUID = 1734561915065710177L;
private Long studentId;//bigint(20) not null auto_increment comment '学生编号',
private String studentName;//varchar(50) null default null comment '姓名',
private String studentPwd;//varchar(50) null default null comment '密码',
private Integer studentStatus;//int(11) null default null comment '状态',
private Date createDate;//datetime null default null comment '创建时间',
private String studentAccount;//varchar(50) null default null comment '学生帐号',
public Long getStudentId() {
return studentId;
}
public void setStudentId(Long studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getStudentPwd() {
return studentPwd;
}
public void setStudentPwd(String studentPwd) {
this.studentPwd = studentPwd;
}
public Integer getStudentStatus() {
return studentStatus;
}
public void setStudentStatus(Integer studentStatus) {
this.studentStatus = studentStatus;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public String getStudentAccount() {
return studentAccount;
}
public void setStudentAccount(String studentAccount) {
this.studentAccount = studentAccount;
} }

创建映射文件StudentMapper.xml和操作接口,建议将两者放在同一个包下,方便查找

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="cn.gzsxt.mapper.StudentMapper">
<!-- 编写插入的SQL语句
id:唯一标识符,必须和映射接口的方法名一一对应。就意味着映射接口的方法不能有重载
-->
<insert id="insert">
INSERT INTO tb_student(STUDENT_NAME, STUDENT_PWD, STUDENT_STATUS, CREATE_DATE, STUDENT_ACCOUNT) VALUES (#{studentName}, #{studentPwd}, #{studentStatus}, #{createDate}, #{studentAccount})
</insert> </mapper>
package cn.gzsxt.mapper;

import cn.gzsxt.pojo.Student;

public interface StudentMapper {
/**
* 插入记录到学习表
* @param student
* @return
*/
int insert(Student student); }

用总配置文件加载映射文件

<!-- 配置指定加载的映射文件 -->
<mappers>
<mapper resource="cn/gzsxt/mapper/xml/StudentMapper.xml"/> </mappers>

编写一个测试类测试

package cn.gzsxt.test;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test; import cn.gzsxt.mapper.StudentMapper;
import cn.gzsxt.pojo.Student;
import cn.gzsxt.utils.MybatisUtils; public class StudentMapperTest { @Test
public void insert(){
//获得会话对象
SqlSession session = MybatisUtils.getSession();
//构建映射接口的动态对象
StudentMapper studentMapper = session.getMapper(StudentMapper.class); //调用插入方法
Student student=new Student();
student.setStudentName("张三1");
int insert = studentMapper.insert(student);
//提交
session.commit();
System.out.println(insert);
//关闭
MybatisUtils.close();
} }

MyBatis框架基于XML的配置的更多相关文章

  1. Spring框架入门之基于xml文件配置bean详解

    关于Spring中基于xml文件配置bean的详细总结(spring 4.1.0) 一.Spring中的依赖注入方式介绍 依赖注入有三种方式 属性注入 构造方法注入 工厂方法注入(很少使用,不推荐,本 ...

  2. Spring学习--基于 XML 的配置声明切面

    正常情况下 , 基于注解的生命要优先于基于 XML 的声明. 通过 AspectJ 注解 , 切面可以与 AspectJ 兼容 , 而基于 XML 的配置则是 Spring 专有的.由于 Aspect ...

  3. JavaWeb_(Struts2框架)struts.xml核心配置、动态方法调用、结果集的处理

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  4. (spring-第2回【IoC基础篇】)Spring的Schema,基于XML的配置

    要深入了解Spring机制,首先需要知道Spring是怎样在IoC容器中装配Bean的.而了解这一点的前提是,要搞清楚Spring基于Schema的Xml配置方案. 在深入了解之前,必须要先明白几个标 ...

  5. 跟着刚哥学习Spring框架--通过XML方式配置Bean(三)

    Spring配置Bean有两种形式(XML和注解) 今天我们学习通过XML方式配置Bean 1. Bean的配置方式 通过全类名(反射)的方式   √ id:标识容器中的bean.id唯一. √ cl ...

  6. idea的spring整合基于xml文件配置的mybatis报Invalid bound statement (not found): com.music.dao.MusicDao.findAll的问题

    一. 题主当时就是自己尝试整合spring和mybatis的时候遇到了这个问题,当时题主只看到了用注解的方式配置的dao层,题主用的是xml文件配置的形式, 而且坑爹的是题主的两个文件的路径写的也不一 ...

  7. Mybatis框架基于映射文件和配置文件的方式,实现增删改查,可以打印日志信息

    首先在lib下导入: 与打印日志信息有关的架包 log4j-1.2.16.jar mybatis架包:mybatis-3.1.1.jar 连接数据库的架包:mysql-connector-java-5 ...

  8. Mybatis之基于XML的增删改查

    这里先吐槽下,写的半天的东西,IE浏览器弹出调试窗口导致写的东西全部没保存,搞得我还要重新用谷歌写,思路全没了,fuck. 前面学习了下spring的DAO层,说起DAO层,那ORM肯定是少不了的,O ...

  9. MyBatis框架的XML数据访问Dao层接口的组合使用

    MyBatis 的前生为Apache的开源项目iBatis.其优势在于灵活,几乎可以替代JDBC,同时提供了编程接口.目前MyBatis的数据访问Dao层不需要实现类,也不需要像JDBC那样拼接Hql ...

随机推荐

  1. cf55D 数位dp记忆化搜索+状态离散

    /* 漂亮数定义:可以整除任意数位上的数 求出区间[l,r]之间的漂亮数个数 因为 dp[i][j][k]:i位前模lcm的值是j,i位前lcm是k的漂亮数个数 */ #include<bits ...

  2. Windows Internals 笔记——线程

    1.进程有两个组成部分,一个进程内核对象和一个地址空间.线程也有两个组成部分: 一个是线程的内核对象,操作系统用它管理线程.系统还用内核对象来存放线程统计信息的地方. 一个线程栈,用于维护线程执行时所 ...

  3. 解决使用maven的java web项目导入后出现的有关问题 -cannot be read or is not a valid ZIP file

    解决使用maven的java web项目导入后出现的有关问题 -cannot be read or is not a valid ZIP file   错误问题:虽然查找repository目录下是有 ...

  4. MongoDB超级简明入门教程

    1.概念篇 MongoDB和MySQL分别作为非关系型数据库和关系型数据库的代表,通过它们之间的对比可以很快的建立起对MongoDB的认知. MongoDB MySQL 数据库(Database) 数 ...

  5. Angular组件——投影

    运行时动态改变组件模版的内容.没路由那么复杂,只是一段html,没有业务逻辑. ngContent指令将父组件模版上的任意片段投影到子组件上. 一.简单例子 1.子组件中使用<ng-conten ...

  6. 解决 RecyclerView 在Android Studio已经导入情况下还无法实例引用问题

    系统:Windows 10 IDE::android studio 1. 问题:RecyclerView 在Android Studio已经导入情况下还无法实例引用问题 由于RecyclerView是 ...

  7. [C#]_[使用微软OpenXmlSDK (OpenXmlReader)读取xlsx表格] 读取大数据量100万条数据Excel文件解决方案

      1.OpenXmlSDK是个很好的类库,可惜只能通过C#调用,C#的童鞋又福气了. 2.服务端程序由于没法安装office,所以这个对asp.net网站来说是最理想的库了.需要.net 4.0版本 ...

  8. Zlib:error can't decompress data; zlib not available

    查看:yum list |grep zlib* 看到的是全部都安装好的: 版本为1.2.3,现在要升级为1.2.11 卸载 [root@biluos1 zlib-1.2.11]# rpm –nodep ...

  9. 关于Function Language(函数式语言是什么?包含哪些语言?为什么函数式语言流行?)

    1.What? Function Language是一种非冯诺依曼式的程序设计语言.函数式语言的主要成分是原始函数.定义函数和函数型. 这种语言具有较强的组织数据结构的能力,可以把某一数据结构(如数组 ...

  10. django-request对象

    HTTP 应用的信息是通过 请求报文 和 响应报文 传递的,关于更多的相关知识,可以阅读<HTTP权威指南>获得. 其中 请求报文 由客户端发送,其中包含和许多的信息,而 django 将 ...