学习笔记_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的环境时,遇到 ...
随机推荐
- 【UOJ448】【集训队作业2018】人类的本质 min_25筛
题目大意 给你 \(n,m\),求 \[ \sum_{i=1}^n\sum_{x_1,x_2,\ldots,x_m=1}^i\operatorname{lcm}(\gcd(i,x_1),\gcd(i, ...
- Linux-存储管理
存储基础知识 从工作原理区分: 机械 HDD 固态 SSD SSD的优势: SSD是摒弃传统磁介质,采用电子存储介质进行数据存储和读取的一种技术,突破了传统机械硬盘的性能瓶颈,拥有极高的存储性 ...
- (八)控件介绍,QLable
Radio单选框 默认互斥,加GroupBox进行分组可以解决这个 checkBox复选 ListWidget TableWIdget:有表头 #include "widget.h" ...
- C#面向对象基本概念总结
快过年了,发一篇自己的复习总结.以下内容均是个人理解,如文章有幸被浏览,如有错误的地方欢迎大家提出,相互学习相互进步! 面向对象三大基本特征:封装,继承,多态 一.类 (对象声明的三种方式:以普通基类 ...
- 51nod 1630(定积分 + 期望)
51nod1630 每个人进入竞技场后,会等概率随机匹配一个人,匹配到的人与当前胜利和失败场数无关. 胜利达到x场,或失败达到y场后,退出竞技场,根据退出时的胜利场数获得奖励,不能中途放弃. 水平高的 ...
- prometheus 基于DNS的目标发现
prometheus 基于DNS的目标发现 DNS服务发现依赖于查询A.AAAA或SRV DNS记录. 1.基于 SRV 记录发现 scrape_configs: - job_name: 'webap ...
- 2. Java内存区域
Java 虚拟机的内存模型分为两部分:一部分是线程共享的,包括 Java 堆和方法区:另一部分是线程私有的,包括虚拟机栈和本地方法栈,以及程序计数器这一小部分内存 2.1 程序计数器 程序计数器(Pr ...
- STM32的内存管理
ref:https://www.cnblogs.com/leo0621/p/9977932.html 这里针对STM32F407芯片+1M外部内存的内存管理!(全篇是个人愚见,如果错误,请不吝指出!) ...
- 谈谈JAVA中的安全发布
谈谈JAVA中的安全发布 昨天看到一篇文章阐述技术类资料的"等级",看完之后很有共鸣.再加上最近在工作中越发觉得线程安全性的重要性和难以捉摸,又掏出了<Java并发编程实战& ...
- 【C++笔记】析构函数(destructor)
“析构函数”是构造函数的反向函数. 在销毁(释放)对象时将调用它们. 通过在类名前面放置一个波形符 (~) 将函数指定为类的析构函数. 声明析构函数 析构函数是具有与类相同的名称但前面是波形符 ...