Mybatis基本入门搭建
一:Mybatis框架概述
1:什么是Mybatis
官方定义:
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了对JDBC的操作,使开发者只需要关注 sql 语句本身,而不需要花费精力去注册驱动、创建Connection、Statement等对象,也不需要手动设置配置参数。
- mybatis 通过 xml 或注解的方式对要执行的各种 statement(声明) 配置起来,并通过 java 对象和 statement 中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。
- 采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。
注:ORM思想(Object Relational Mapping) 对象关系映射,简单说就是把数据库表和实体类的属性一一映射,让我们操作实体类就可以操作数据库表
2:Mybatis的引入
在我们没学过mybatis的时候,我相信大部分人都是手写JDBC,手动关连接、映射对象,这就导致开发者效率低下;可是如今mybatis的登场我们可以简化了对持久层(CRUD)的操作了。
原生态的JDBC编写:
实体类就是对应数据库的几个字段
# 配置文件名称 db_config.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/demo_school
username=root
password=123 ******************************************************* /**
* @author ant
* @Class 获取连接数据库对象的工具类
*/
//获取Connection对象
public class JDBCUtils {
//聚合Connection对象
private static Connection con; //静态块来创建Connection对象
static {
try {
//通过类加载机制来读取配置文件
InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("db_config.properties");
//创建读取文件对象
Properties pro = new Properties();
//传入流(配置文件)
pro.load(in);
//获取四大配置
String driver = pro.getProperty("driver");
String url = pro.getProperty("url");
String username = pro.getProperty("username");
String password = pro.getProperty("password"); //注册驱动
Class.forName(driver);
//获取连接
con = DriverManager.getConnection(url, username, password); //抛出IO异常 读取文件位置
} catch (IOException e) {
e.printStackTrace();
//抛出空对象异常
} catch (ClassNotFoundException e) {
e.printStackTrace();
//抛出sql异常
} catch (SQLException e) {
e.printStackTrace();
}
} //返回数据库连接对象
public static Connection getCon() {
return con;
} //关闭连接对象
public static void close(Connection con) {
try {
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
} **************************************************** /**
* @author ant
* @Class Clinet类测试
*/
public class test { public static void main(String[] args) throws IOException { //调用工具类获取Connection对象
Connection con = JDBCUtils.getCon();
try {
//获取预处理 statement
PreparedStatement ps = con.prepareStatement("select * from teacher where tname=?");
//为预处理语句设置占位符数据
ps.setString(1, "张老师");
//查询语句
ResultSet resultSet = ps.executeQuery();
//循环
while (resultSet.next()) {
//获取每个字段数据
int tid = resultSet.getInt("tid");
String tname = resultSet.getString("tname");
String tsex = resultSet.getString("tsex");
int tage = resultSet.getInt("tage");
double tsalary = resultSet.getDouble("tsalary");
String taddress = resultSet.getString("taddress");
//赋予对象上
Teacher t = new Teacher(tid, tname, tsex, tage, tsalary, taddress);
//打印
System.out.println("打印数据了:");
System.out.println(t.toString());
} //关闭连接
resultSet.close();
JDBCUtils.close(con); } catch (SQLException e) {
e.printStackTrace();
}
}
} ****************************************************
打印数据了:
Teacher{tid=1, tname='张老师', tsex='男', tage=28, tsalary=10858.0, taddress='江苏南京'}
JDBC原生操作
资料导入:SQL建库建表语句来自本人腾讯文档
通过上面的JDBC原生编写会发现繁琐,而且还存在一些问题
- 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
- Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码。
- 使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
- 对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。
二:Mybatis框架入门编写
1:准备工作
这个下面是mybatis版本号,有些朋友没有那个啥,可能会访问不了那个网站
2:开始搭建Mybatis案例
(1):配置文件开发代码编写
注:这个是maven坐标 <dependencies>
<!--导入mybatis坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--导入mysql驱动 我选的是5.x.x 的版本 稳定点-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<!--导入log4j日志坐标-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies> +++++++++++++++++++++++++++++++++++++++++
注:下面的是实体老师类 Teacher package cn.xw.domain;
/**
* @author ant
* @bean 这个是老师类
*/
public class Teacher {
private int tid; //老师id
private String tname; //老师姓名
private String tsex; //老师性别
private int tage; //老师年龄
private double tsalary; //老师薪资
private String taddress; //老师住址
//下面省去构造器/get/set/tostring 你们自己加一下
} +++++++++++++++++++++++++++++++++++++++++
注:操作TeacherDao接口类 /**
* @author ant
* @interface 数据操作的接口 老师的dao
*/
public interface TeacherDao { //查询全部老师信息
List<Teacher> findAll(); }
+++++++++++++++++++++++++++++++++++++++++ 注:下面这个是配置文件TeacherDao.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">
<!--TeacherDao类的配置文件 还有使用namespace指明要配置的类-->
<mapper namespace="cn.xw.dao.TeacherDao">
<!--每个方法就会对应一个查询 id是方法名 resultType是实体类-->
<select id="findAll" resultType="cn.xw.domain.Teacher">
select * from teacher;
</select>
</mapper> +++++++++++++++++++++++++++++++++++++++++ 注:主配置文件SqlMapConfig.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>
<!--配置环境 default="mysql" 说明找下面的一个id为mysql的配置 将来这个下面会有许多如oracle配置啦等等-->
<environments default="mysql">
<!--配置一个名为mysql的 数据库连接配置 -->
<environment id="mysql">
<!--配置事务类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源连接池-->
<dataSource type="POOLED">
<!--四大配置 driver驱动 url数据库地址 username/password账号密码-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/demo_school"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</dataSource>
</environment>
</environments>
<!--映射的配置文件位置 映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<mapper resource="cn/xw/dao/TeacherDao.xml"></mapper>
</mappers>
</configuration> +++++++++++++++++++++++++++++++++++++++++ 注:测试类Client public class Client {
public static void main(String[] args) throws IOException {
//获取配置文件的流信息
InputStream config = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建一个SqlSessionFactoryBuilder,这个后期方便创建一个工厂对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//通过SqlSessionFactory来创建一个SqlSessionFactory工厂对象
SqlSessionFactory factory = builder.build(config);
//通过工厂方法来创建一个具体的sqlSession对象来操作数据库
SqlSession sqlSession = factory.openSession();
//通过动态代理的方式来获取具体的被代理类
TeacherDao mapper = sqlSession.getMapper(TeacherDao.class);
//获取数据循环打印
List<Teacher> teachers = mapper.findAll();
for (Teacher teacher : teachers) {
System.out.println(teacher.toString());
}
//关闭
config.close();
sqlSession.close();
}
}
mybatis使用配置文件的基本实现
文字描述搭建入门案例:
①:创建一个maven工程并导入相应的坐标
②:创建实体类和dao接口
③:创建mybatis的主配置文件SqlMapConfig.xml
④:创建dao接口的映射配置文件xxx.xml
(2):注解开发代码编写
在写完配置文件开发后,会发现操作数据库变得容易,但是这么说吧,现在的查询就一个类一条sql语句的配置,如果将来开发中有特别多的类和各种各样的sql配置,你就会发现配置太繁琐了,所有我接下来就和大家介绍另一种写法:注解开发
注解开发和配置文件开发挺相似的,大家接下来就跟着我的操作来完成,(前提你的配置文件开发的那些代码可以运行)
①:删除配置文件目录,cn.xw.dao.TeacherDao.xml是配置路径,把cn下的全部目录删除,如果保留来写注解开发会出错
②:更改主配置文件SqlMapConfig.xml 只需要更改<mappers>标签即可,其它不动
<!--映射的配置文件位置 映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<!--class配置的是注解 表示配置src目录下的dao操作类-->
<mapper class="cn.xw.dao.TeacherDao"></mapper>
<!--这个是配置文件开发 配置文件路径 我们直接注释-->
<!--<mapper resource="cn/xw/dao/TeacherDao.xml"></mapper>-->
</mappers>
③:更改dao接口,我这里是TeacherDao接口
/**
* @author ant
* @interface 数据操作的接口 老师的dao
*/
public interface TeacherDao {
//查询全部老师信息
//这里的注解后面会详细介绍 这里只是做个入门
@Select("select * from teacher;")
List<Teacher> findAll();
}
大功告成,其它的不用修改,运行就可以了
(3):实现类开发代码编写
这个实现类开发的方法极少有人写,因为用这种写法根没使用框架差不多,繁琐,最多在学习中了解这种写法
项目的架构和配置文件开发的框架差不多,只是在dao的下面多了一个实现类
注:pom.xml文件 <dependencies>
<!--导入mybatis坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--导入mysql驱动 我选的是5.x.x 的版本 稳定点-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<!--导入log4j日志坐标-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies> **************************************************** 注:实体类 Teacher public class Teacher { private int tid; //老师id
private String tname; //老师姓名
private String tsex; //老师性别
private int tage; //老师年龄
private double tsalary; //老师薪资
private String taddress; //老师住址
//下面的构造器/getset/toString省略你们自己写上就行
} **************************************************** 注:TeacherDao接口 /**
* @author ant
* @interface 抽象老师接口
*/
public interface TeacherDao { //接口方法 查询全部老师
List<Teacher> findAll();
} **************************************************** 注:TeacherDaoImpl实现类 /**
* @author ant
* @class TeacherDao接口的实现类
*/
public class TeacherDaoImpl implements TeacherDao {
//聚合mybatis工厂对象
private SqlSessionFactory factory; //构造器传入对象
public TeacherDaoImpl(SqlSessionFactory factory) {
this.factory = factory;
} //查询全部方法
public List<Teacher> findAll() {
//获取SqlSession
SqlSession sqlSession = factory.openSession();
//调用查询方法 带list后缀的说明数据有多个
List<Teacher> teachers = sqlSession.selectList("cn.xw.dao.TeacherDao.findAll");
//关闭对象
sqlSession.close();
//返回数据
return teachers;
}
} **************************************************** 注:配置文件 resource/cn/xw/dao/TeacherDao.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">
<mapper namespace="cn.xw.dao.TeacherDao">
<select id="findAll" resultType="cn.xw.domain.Teacher">
select * from teacher;
</select>
</mapper> **************************************************** 注:主配置文件SqlMapConfig.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>
<!--配置环境 default="mysql" 说明找下面的一个id为mysql的配置 将来这个下面会有许多如oracle配置啦等等-->
<environments default="mysql">
<!--配置一个名为mysql的 数据库连接配置 -->
<environment id="mysql">
<!--配置事务类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源连接池-->
<dataSource type="POOLED">
<!--四大配置 driver驱动 url数据库地址 username/password账号密码-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/demo_school"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</dataSource>
</environment>
</environments> <!--映射的配置文件位置 映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<!--这个是配置文件开发 配置文件路径-->
<mapper resource="cn/xw/dao/TeacherDao.xml"></mapper>
</mappers>
</configuration> ****************************************************
注:测试类客户端 public class Client { public static void main(String[] args) throws IOException { //获取配置文件的流信息
InputStream config = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建一个SqlSessionFactoryBuilder,这个后期方便创建一个工厂对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//通过SqlSessionFactory来创建一个SqlSessionFactory工厂对象
SqlSessionFactory factory = builder.build(config); //创建TeacherDao的实现类 传入SqlSessionFactory工厂对象
TeacherDao teacherDao = new TeacherDaoImpl(factory); //通过TeacherDao的实现类调用findAll方法查询全部,返回数据 打印
List<Teacher> teachers = teacherDao.findAll();
for (Teacher teacher : teachers) {
System.out.println(teacher.toString());
}
//关闭对象
config.close();
}
}
mybatis使用实现类来完成
(4):总结
通过上面的三种写法,我们对mybatis有了一个小小的了解 ,但是这个了解只是最基础的,其实mybatis的写法有配置文件开发、注解开发、实现类开发;这三种最常用的也就注解和配置文件2中,那个实体类开发只需要了解一下即可。如果想深入了解,这点还是远远不够的,而且一旦出现多表将无法完成一系列CRUD操作,所有还得继续学习。
这三种开发方式我将会在接下来的几篇里详细介绍,包括配置文件、多表操作、缓存.......
Mybatis基本入门搭建的更多相关文章
- MyBatis基础入门《一》环境搭建
MyBatis基础入门<一>环境搭建 参考资料链接:http://www.mybatis.org/mybatis-3/ 使用maven构建项目,STS开发工具,jdk1.8 项目结构: m ...
- mybatis学习:mybatis的环境搭建与入门
一.mybatis的概述: mybatis是一个持久层框架,用java编写 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接登繁杂过程 它使用了ORM思想 ...
- MyBatis基础入门《二》Select查询
MyBatis基础入门<二>Select查询 使用MySQL数据库,创建表: SET NAMES utf8mb4; ; -- ---------------------------- -- ...
- Mybatis基础入门学习
Mybatis基础入门学习 mybatis架构分析 搭建测试mybatis架构 )下载并导入mybatis3.2.7.jar(架构),mysql-connector-java-5.1.7-bin.ja ...
- SpringBoot+SpringMVC+MyBatis快速整合搭建
作为开发人员,大家都知道,SpringBoot是基于Spring4.0设计的,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程.另外Spr ...
- Mybatis(一) 入门
对原生态jdbc程序中问题总结 创建mysql数据库 jdbc程序 使用jdbc查询mysql数据库中用户表的记录. 创建java工程,加入jar包 数据库驱动包 第一个是mysql驱动 第二个是or ...
- Spring+SpringMvc+Mybatis框架集成搭建教程
一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以在自己搭建SSM框架集成的时候,出现了这样或者那样的问题,很是苦恼 ...
- MyBatis学习总结(一)——MyBatis快速入门
一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...
- MyBatis快速入门
一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...
随机推荐
- Java ThreadLocal解析
简介 ThreadLocal 类似局部变量,解决了单个线程维护自己线程内的变量值(存.取.删),让线程之间的数据进行隔离.(InheritableThreadLocal 特例) 这里涉及三个类,Thr ...
- 【前端背景UI】鼠标磁性动态蜘蛛网背景源码
<div style="float:right;" id="hub_iframe"></div> <script type=&qu ...
- 王玉兰201771010128《面象对象程序设计(Java)》第九周学习总结
第一部分:理论基础部分总结: 一:(1)异常:在程序的执行过程中所发生的异常事件,它中断指令的正常执行. 常见的几种错误:A:用户输入错误:B:设备错误;硬件出错:C:物理限制:磁盘满了,可用存储空间 ...
- HDU-6393 Traffic Network in Numazu
题意:给你一个n边n点的无向连通图,两个操作,操作一改变某个边的权值,操作二查询某两个点之间的路径长度. 题解:随便删掉环上一条边搞一棵树出来,因为两点间距离是两点各自到根的距离之和减去2*lca两点 ...
- POJ3255
题目链接:http://poj.org/problem?id=3255 解题思路: 昨晚两点多睡不着翻起来刷<挑战>的题,结果遇到这道求次短路的题,一脸懵逼.想了半小时没什么思路就看他的解 ...
- 1417. 重新格式化字符串--来源:力扣(LeetCode)
题目描述: 给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母. 请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同.也就是说,字母后面应该跟着数字,而数字后面应该跟着字母. 请 ...
- 【Python】利用python自动发送邮件
前言 在训练网络的过程中,需要大量的时间,虽然可以预估网络训练完成时间,但蹲点看结果着实有点不太聪明的亚子. 因此,参照师兄之前发的python利用smtp自动发邮件的代码,我作了些调整,并参照网上的 ...
- java颜色对照表
- Java工作流引擎的测试容器-功能-使用方法-注意事项
工作流引擎的测试容器-功能-使用方法-注意事项 关键字 Ccbpm, ccflow,jflow,工作流引擎,工作流引擎测试容器,表单引擎 功能说明 工作流的测试容器是为了解决手工模拟人工登录模式下测试 ...
- echarts的时间轴的提示内容写在轴下方
echarts的时间轴的提示内容写在轴下方 在echarts中横坐标的拖动轴dataZone的提示内容在两端,并且没有相关配置让其显示在轴下方或者其他位置. 解决方式: 在图标下方添加dom并且监听拖 ...