学习笔记_J2EE_Mybatis_01_mybatis入门
mybatis入门
1.概述
因为觉得自己写的概念信息未必比别人好,而且这些理论知识了解就好,内核信息还是要看源码。所以从相对权威的百度百科转载了基本信息,也因此它的真实性是经过检验的。
1.1 什么是 MyBatis?
1.1.1 基本信息
1.1.2 官方描述
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis官方提供的 入门学习地址:http://www.mybatis.org/mybatis-3/zh/index.html
项目发布在GitHub上:https://github.com/mybatis/mybatis-3/tree/master/src/site
1.1.3 背景介绍
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
1.1.5 框架架构

第一步:导入包(任何框架需要的事情):mybatis的支撑包和数据库的JDBC支撑包
第二步:创建总配置文件,文件名随便写,(如果使用properties文件作为数据库对象的信息文件,则先建立一个对应的db.properties文件)
第三步:创建一个MybatisUtils工具类,(获得操作对象)
第四步:创建一个映射接口
第五步:创建一个映射文件
第六步:在总配置文件加载映射文件。
第七步:编写测试代码
2.1.1.2 mybatis官方推荐到的工程目录架构
/my_application
/bin
/devlib
/lib <-- MyBatis *.jar 文件在这里。
/src
/org/myapp/
/action
/data <-- MyBatis 配置文件在这里, 包括映射器类, XML 配置, XML 映射文件。
/mybatis-config.xml
/BlogMapper.java
/BlogMapper.xml
/model
/service
/view
/properties <-- 在你 XML 中配置的属性文件在这里。
/test
/org/myapp/
/action
/data
/model
/service
/view
/properties
/web
/WEB-INF
/web.xml
2.1.1.3 我的工程目录架构

2.1.2 操作示例
2.1.2.1 导入包 /MybatisDemo/lib
(A) mybatis框架支撑包 mybatis-3.4.1.jar
下载地址:http://www.mybatis.cn/82.html
(B) MYSQL数据库JDBC支撑包 mysql-connector-java-5.1.47.jar
下载地址:http://dev.mysql.com/downloads/connector/ >> Connector/J >> 选择对应版本 >>到这就不需要我说了吧
我这里使用的是mysql数据库,所以导入的是mysql的JDBC支撑包

2.1.2.2 创建db.properties数据库链接信息文件/MybatisDemo/src/db.properties
db.driver=org.gjt.mm.mysql.Driver
db.url=jdbc:mysql://localhost:3306/mybatisdb
db.username=root
db.password=123456
2.1.2.3 创建mybatis主配置文件xxx.XML 文件名自便,示例:/MybatisDemo/src/mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
<configuration>
<!-- 指定properties配置文件的路径 -->
<properties resource="db.properties"></properties>
<!-- 配置数据库连接 -->
<!--
environments:环境集,可以在里面配置多个environment,一个environment对应一个数据库连接
mybatis支持配置多个数据库连接,但是只能执行一个
default属性:作用就是指定默认执行的数据库连接environment标签的id属性
-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<!-- dataSource:配置数据源
typeAliasRegistry.registerAlias("JNDI", JndiDataSourceFactory.class);
typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class);
typeAliasRegistry.registerAlias("UNPOOLED", UnpooledDataSourceFactory.class);
JNDI:使用JNDI的数据源,就是在WEB服务器配置一个数据库连接池,如再TOMCAT里面配置一个数据源。就是JNDI数据源
POOLED:使用数据库连接池,Mybatis内置默认有一个简单的内置连接池
UNPOOLED:不使用数据库连接,直接使用数据库JDBC直连
--> <dataSource type="POOLED">
<!-- 驱动 -->
<property name="driver" value="${db.driver}"/>
<!-- 连接字符串 -->
<property name="url" value="${db.url}"/>
<!-- 用户名 -->
<property name="username" value="${db.username}"/>
<!-- 密码 -->
<property name="password" value="${db.password}"/> </dataSource>
</environment>
</environments>
</configuration>
2.1.2.4 创建一个MybatisUtils工具类/MybatisDemo/src/cn/slm/util/MybatisUtils.java
package cn.slm.util; 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 = createSqlSessionFactory();
private static final ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); // 1.获得会话工厂
private static SqlSessionFactory createSqlSessionFactory() {
try {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = builder.build(reader);
return sessionFactory; } catch (IOException e) {
e.printStackTrace();
}
return null;
} // 2.获得操作对象,SqlSession对象 public static SqlSession getSqlSession() {
//单例模式 确保sqlSession对象的唯一性有效性
if (threadLocal.get() == null) {
SqlSession session = SSF.openSession();
threadLocal.set(session);
}
return threadLocal.get();
} }
2.1.2.5 创建一个映射接口/MybatisDemo/src/cn/slm/mapper/StudentMapper.java
package cn.slm.mapper;
import cn.slm.pojo.Student;
public interface StudentMapper {
// 需求:实现插入数据到student表
// 注意:如果是增删改操作,返回的类型必须是int类型
// 返回的是操作影响的行数。
int insert(Student student);
}
2.1.2.6 创建一个映射文件/MybatisDemo/src/cn/slm/mapper/xml/StudentMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<!-- 注意事项:使用映射接口的配置方式,namespace必须指向接口的类全名 -->
<mapper namespace="cn.slm.mapper.StudentMapper"> <!--
useGeneratedKeys:作用打开支持ID回填,设置为true
keyColumn:设置ID回填,ID对象数据库的字段名
keyProperty:设置ID回填到JavaBean对应的属性名 -->
<insert id="insert" useGeneratedKeys="true" keyColumn="stu_id" keyProperty="stuId" >
<!-- 注意:如果传递过来的是一个JavaBean对象,那么设置的属性名为,set方法对应的属性名。如:setStuName 对应的是 stuName -->
INSERT INTO tb_student (stu_name, stu_age, stu_password) VALUES (#{stuName}, #{stuAge}, #{stuPassword})
</insert> </mapper>
2.1.2.7 在总配置文件加载映射文件 /MybatisDemo/src/mybatis.xml
<!-- 加载映射文件 如果是多个,则添加多个相应的 mapper-->
<mappers>
<mapper resource="cn/slm/mapper/xml/StudentMapper.xml"/>
</mappers>
完整xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
<configuration>
<!-- 指定数据库配置文件的路径 -->
<properties resource="db.properties"></properties>
<!-- 配置数据库连接 -->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="cn/slm/mapper/xml/StudentMapper.xml"/>
</mappers>
</configuration>
2.1.2.8 编写测试代码
package cn.slm.test; import org.apache.ibatis.session.SqlSession;
import org.junit.Test; import cn.slm.mapper.StudentMapper;
import cn.slm.pojo.Student;
import cn.slm.util.MybatisUtils; public class MybatisTest {
@Test
public void insert(){
//1.获得操作对象,session
SqlSession session = MybatisUtils.getSqlSession();
//2.获得操作接口的动态对象
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
Student student=new Student();
student.setStuName("陈七");
//3.插入对象
int count = studentMapper.insert(student);
//4.提交事务
session.commit();
//5.关闭
session.close();
//6.打印返回值
System.out.println("数据库库受影响记录数:"+count);
System.out.println("ID:"+student.getStuId());
} }
2.1.2.9 测试结果
2.1.2.9.1 junit执行情况:

2.1.2.9.2 控制台打印的返回值

2.1.2.9.3 数据库中表的更新

学习笔记_J2EE_Mybatis_01_mybatis入门的更多相关文章
- python学习笔记--Django入门四 管理站点--二
接上一节 python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...
- WebSocket学习笔记——无痛入门
WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报 分类: 物联网学习笔记(37) 版权声明:本文为博主原 ...
- Java学习笔记之---入门
Java学习笔记之---入门 一. 为什么要在众多的编程语言中选择Java? java是一种纯面向对象的编程语言 java学习起来比较简单,适合初学者使用 java可以跨平台,即在Windows操作系 ...
- DBFlow框架的学习笔记之入门
什么是DBFlow? dbflow是一款android高性的ORM数据库.可以使用在进行项目中有关数据库的操作.github下载源码 1.环境配置 先导入 apt plugin库到你的classpat ...
- MongoDB学习笔记:快速入门
MongoDB学习笔记:快速入门 一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...
- 学习笔记_J2EE_SpringMVC_01_入门
1. 概述 笔者作为一个不太正经的不专业佛教信仰者,习惯了解事物的因果关系,所以概述就有点BBB...了.如果不喜欢这些的,请自行跳过概述章节,直接进入第二章的操作实践:2 入门示例. 1.1. ...
- dubbo入门学习笔记之入门demo(基于普通maven项目)
注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...
- SpringBoot学习笔记<一>入门与基本配置
毕业实习项目技术学习笔记 参考文献 学习视频 2小时学会Spring Boot:https://www.imooc.com/learn/767 学习资料 SpringBoot入门:https://bl ...
- [学习笔记]SiftGPU入门
当有读者看到我这篇SiftGPU入门的学习笔记时,相信你已经读过了高博那篇<SLAM拾萃:SiftGPU>,那篇文章写于16年,已经过去两年的时间.在我尝试配置SiftGPU的环境时,遇到 ...
随机推荐
- Linux keepalived+nginx实现主从模式
双机高可用方法目前分为两种: 主从模式:一台主服务器和一台从服务器,当配置了虚拟vip的主服务器发送故障时,从服务器将自动接管虚拟ip,服务将不会中断.但主服务器不出现故障的时候,从服务器永远处于浪费 ...
- 【dp】 背包问题
问题一:01背包 题目: [题目描述] 一个旅行者有一个最多能装 M 公斤的背包,现在有 n件物品,它们的重量分别是W1,W2,...,Wn它们的价值分别为C1,C2,...,Cn求旅行者能获得最大总 ...
- 互联网+ 何人能挡?带着你的Code飞奔吧!
Python方向: 早期方向 Web全栈 擅长专栏 爬虫系列 数据分析 人工智能 物联网系(lot万物互联)[逆天很看好未来的前景] 自动化运维(安全与测试) 其他系列 游戏开发(最近很火) 导航栏: ...
- 为什么天线的回波损耗以-10dB大小来衡量?
传送门:http://www.eeworld.com.cn/Test_and_measurement/2014/0610/article_9152.html i:对于2端口无损耗网络,可以根据S11的 ...
- 使用django执行数据更新命令时报错:django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency users.00 01_initial on database 'default'.
如果在重新封装更新用户表之前,已经更新了数据表,在数据库中已经有了django相关的依赖表,就会报错: django.db.migrations.exceptions.InconsistentMigr ...
- postgresql某个字段值按照指定规则排序
select id,serial_group_id,state from ap_model order by serial_group_id asc, ( case when state=1 then ...
- Xcode10 不能导入头文件(导入头文件不提示)
连接地址:https://blog.csdn.net/wyz670083956/article/details/87774705 xcode10可能是:Project Settings
- 【踩坑】利用fastjson反序列化需要默认构造函数
利用 fastjson等 反序列化时需要注意,他可能会用到 默认的构造函数,如果没有默认构造函数,某些场景下可能会出现 反序列化熟悉为空的情况,如下图所示:
- 如何为 Jupyter Notebook 安装代码提示功能
按照上一篇博客安装完 Python 和 Jupyter Notebook 后,我们已经可以使用 Notebook 愉快的编写 Python 代码了,但是发现它不像其他编辑器那样会弹出代码提示,这稍微有 ...
- vue组件创建的三种方式
1.使用Vue.extend创建全局的Vue组件 //1.1 使用vue.extend创建组件 var com1 = Vue.extend({ //通过template属性指定组件要展示的html结构 ...