Java研学-MyBatis框架

一 MyBatis框架

1 框架介绍

  框架:对基础代码进行封装并提供相应的API,调用API可省去一些代码的编写,从而提高效率。一个好的框架一定是经过测试,自身的功能已经实现,可以完成特定的功能。

2 MyBatis 框架

  MyBatis 框架是一款持久层框架,他集成了绝大部分的JDBC代码与手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的domain对象,支持自定义sql,存储过程与高级映射
在这里插入图片描述
Mybatis的功能架构分为三层:

  API接口层:提供给外部使用的接口API,通过这些本地API可操纵数据库。接口层接收到调用请求就会调用数据处理层完成具体的数据处理。

  数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

  基础支撑层:负责最基础的功能支撑,即连接管理、事务管理、配置加载和缓存处理,将这些共用的东西抽取出来作为最基础的组件。为上层提供最基础的支撑(数据处理层)

3 使用流程

  ① 编写 mybatis-config.xml 文件:配置连接数据的四要素(数据源),以及项目需要依赖的通用配置
  ② 编写 XxxMapper.xml文件:映射文件,编写SQL语句和类型映射
  ③ MyBatis 加载配置文件,创建SqlSessionFactory 对象(类似连接池)
  ④ 通过SqlSessionFactory来生产SqlSesson 对象 SqlSesson(类似 Connection连接对象)
  ⑤ 使用SqlSession即可执行CRUD操作
  ⑤ mybatis底层会进行数据处理,SQL执行以及结果集的处理

4 准备环境与测试

① 添加项目需要的 jar 包,或者导入对应的依赖

  Lombok,可自动生成getter/setter/toString等方法

  mysql-connector-java-5.1.36-bin.jar,Java语言连接MySQL数据库的驱动包,它提供了一系列的类和方法,可以用来执行创建和查询数据库、插入和更新数据、管理用户和权限等任务

  mybatis-3.4.6.jar,MyBatis框架的核心包,它提供了一系列的类和方法,用于对数据库进行操作。MyBatis框架是一个持久层框架,它可以通过配置文件和映射文件来将SQL语句映射到Java对象,从而简化了数据库的操作。

② 数据库表

CREATE TABLE `t_employee` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`eid` varchar(10) NOT NULL,`ename` varchar(6) NOT NULL,`job` varchar(10) DEFAULT NULL,`salary` int(10) DEFAULT NULL,`password` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `eid` (`eid`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

③ 实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {private Long id;private String eid;private String ename;private String password;private String job;private Integer salary;
}

④ resources下编写主配置文件:mybatis-config.xml,拷贝xml约束,添加环境配置(事物管理器,连接池,映射文件),在此还需要关联映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--配置日志--><settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--配置数据库连接信息--><environments default="dev"><environment id="dev"><!--配置事务管理模式--><transactionManager type="JDBC"></transactionManager><!--配置数据源信息--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///web_crud"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!--加载映射文件--><mappers><mapper resource="mappers/EmployeeMapper.xml"></mapper><!--扫描映射文件所在的包路径:mapper映射文件和mapper接口的路径需要保持一致,mapper路径需通过/分隔--></mappers>
</configuration>

⑤ 于mapper目录中,编写对应的mapper文件,拷贝约束信息,编写SQL语句,一个项目可以操作多张表,每张表都需要一个mapper配置文件来编写SQL语句每条SQL语句都需要有一个唯一的标识,这个唯一的标识由 namespace+sqlid 组成
使用namespace+sqlid就得到了保存用户信息的唯一标识,如:cn.tj.mybatis.mapper.EmployeeMapper.insert 之后可以通过标识找到这条SQL语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace用来区别项目下的多个文件的标识-->
<mapper namespace="employee"><!--增加用户:id当前文件中sql标签的唯一标识--><insert id="insertEmployee">insert into t_employee(eid,ename,job,salary,password) values(#{eid},#{ename},#{job},#{salary},#{password})</insert>
</mapper>

⑥ 接口

public interface EmployeeDao {//增加员工void insertEmployee(Employee employee);
}

⑦ 实现类

public class EmployeeDaoImpl implements EmployeeDao {@Overridepublic void insertEmployee(Employee employee) {try {//1.加载配置文件信息InputStream rs = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(rs);//2.创建sqlSession//openSession()默认的时候是需要手动提交事务,如果设置自动提交事务需要参数设置为trueSqlSession sqlSession = factory.openSession(true);//3.执行增加操作sqlSession.insert("employee.insertEmployee",employee);//手动提交事务//sqlSession.commit();//4.关闭对象sqlSession.close();} catch (IOException e) {e.printStackTrace();}}
}

⑧ 测试类

public class EmployeeTest {/*增加用户测试*/@Testpublic void employee_insert(){EmployeeDao employeeDao=new EmployeeDaoImpl();Employee employee = new Employee(null, "tj012", "大黄", "123", "BA", 18000);employeeDao.insertEmployee(employee);System.out.println("增加用户成功");}
}

二 代码重构

  通过代码实现对员工表的基础增删改查

1 实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {private Long id;private String eid;private String ename;private String password;private String job;private Integer salary;
}

2 mybatis-config.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--加载外部配置文件--><properties resource="db.properties"></properties><!--类型别名--><typeAliases><!--一个实体类对应一个别名,映射文件中的resultType属性可以将路径缩写--><!--<typeAlias type="cn.tj.mybatis.domain.Employee" alias="employee"></typeAlias>--><!--扫描实体类所在的包路径将实体类全部起别名:别名默认是实体类名称  不区分大小写--><package name="cn.tj.mybatis.domain"/></typeAliases><!--配置数据库连接信息--><environments default="dev"><environment id="dev"><!--配置事务管理模式--><transactionManager type="JDBC"></transactionManager><!--配置数据源信息--><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--加载映射文件--><mappers><mapper resource="mappers/EmployeeMapper.xml"></mapper></mappers>
</configuration>

3 mapper映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace用来区别项目下的多个文件的标识-->
<mapper namespace="cn.tj.mybatis.mapper.EmployeeMapper"><!--增加员工:id当前文件中sql标签的唯一标识--><insert id="insertEmployee" useGeneratedKeys="true" keyProperty="id">insert into t_employee(eid,ename,password,job,salary) values(#{eid},#{ename},#{password},#{job},#{salary})</insert><!--修改员工--><update id="updateEmployee">update t_employee set eid=#{eid} ,ename=#{ename} ,password=#{password} ,job=#{job},salary=#{salary} WHERE id=#{id}</update><!--删除员工--><delete id="deleteEmployee">DELETE from t_employee WHERE id=#{id}</delete><!--根据id查询员工:查询必须设置返回类型参数resultType--><select id="selectOne" resultType="employee">SELECT * from t_employee WHERE id=#{id}</select><!--查询所有员工--><select id="selectAll" resultType="employee">SELECT * from t_employee</select><!--模糊查询--><select id="selectByName" resultType="employee">SELECT * from t_employee  WHERE ename like "%"#{ename}"%"</select>
</mapper>

3 db.properties文件(连接数据所需信息)

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///web_crud
jdbc.user=root
jdbc.password=root

4 log4j.properties日志文件,可监控mybatis运行(每一条SQL)(需导入log4j jar包)

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.cn.tj.mybatis.mapper=TRACE
# 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

5 数据库表

CREATE TABLE `t_employee` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`eid` varchar(10) NOT NULL,`ename` varchar(6) NOT NULL,`job` varchar(10) DEFAULT NULL,`salary` int(10) DEFAULT NULL,`password` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `eid` (`eid`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

6 接口

public interface EmployeeDao {//增加用户public void insertEmployee(Employee user);//根据id修改用户public void updateEmployee(Employee user);//根据id删除用户public void deleteEmployee(Long id);//根据id查询用户public Employee selectOne(Long id);//查询所有用户public List<Employee> selectAll();//模糊查询public List<Employee> selectByName(String name);
}

7 实现类

public class EmpoyeeDaoImpl implements EmployeeDao {@Overridepublic void insertEmployee(Employee employee) {try {//1.加载配置文件信息InputStream rs = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(rs);//2.创建sqlSession//openSession()默认的时候是需要手动提交事务,如果设置自动提交事务需要参数设置为trueSqlSession sqlSession = factory.openSession(true);//3.执行增加操作sqlSession.insert("cn.tj.mybatis.mapper.EmployeeMapper.insertEmployee",employee);//手动提交事务
//            sqlSession.commit();//4.关闭对象sqlSession.close();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void updateEmployee(Employee employee) {try {InputStream rs = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(rs);SqlSession sqlSession = factory.openSession(true);sqlSession.update("cn.tj.mybatis.mapper.EmployeeMapper.updateEmployee",employee);sqlSession.close();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void deleteEmployee(Long id) {try {InputStream rs = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(rs);SqlSession sqlSession = factory.openSession(true);sqlSession.delete("cn.tj.mybatis.mapper.EmployeeMapper.deleteEmployee",id);sqlSession.close();} catch (IOException e) {e.printStackTrace();}}@Overridepublic Employee selectOne(Long id) {try {SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSession sqlSession = factory.openSession(true);Employee employee = sqlSession.selectOne("cn.tj.mybatis.mapper.EmployeeMapper.selectOne", id);return employee;} catch (IOException e) {e.printStackTrace();}return null;}@Overridepublic List<Employee> selectAll() {try {SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSession sqlSession = factory.openSession(true);List<Employee> employeeList = sqlSession.selectList("cn.tj.mybatis.mapper.EmployeeMapper.selectAll");return employeeList;} catch (IOException e) {e.printStackTrace();}return null;}@Overridepublic List<Employee> selectByName(String name) {SqlSession sqlSession = MybatisUtil.getSqlSession();return sqlSession.selectList("cn.tj.mybatis.mapper.EmployeeMapper.selectByName", name);}
}

8 工具类

public class MybatisUtil {private static SqlSessionFactory factory=null;/*加载配置文件创建工厂对象,只需要加载一次即可*/static {try {InputStream rs = Resources.getResourceAsStream("mybatis-config.xml");factory = new SqlSessionFactoryBuilder().build(rs);} catch (IOException e) {e.printStackTrace();}}/*加载配置文件创建factory对象*/public static SqlSession getSqlSession(){return factory.openSession(true);}// 关闭对象public static void close(SqlSession sqlSession){if (sqlSession!=null){sqlSession.commit();sqlSession.close();}}
}

9 测试类

public class EmployeeTest {private EmployeeDao employeeDao=new EmpoyeeDaoImpl();/*增加用户测试*/@Testpublic void employee_insert(){Employee employee=new Employee(null,"tj0118","大黄","123","CTO",18000);employeeDao.insertEmployee(employee);System.out.println("用户的id:"+employee.getId());System.out.println("增加用户成功");}/*修改用户*/@Testpublic void employee_update() {employeeDao.updateEmployee(new Employee(2L,"tj018","大黄","123","CEO",18000));}/*删除用户*/@Testpublic void user_delete() {employeeDao.deleteEmployee(8l);}/*根据id查询*/@Testpublic void employee_selectOne() {Employee employee = employeeDao.selectOne(1l);System.out.println(employee);}/*查询所有*/@Testpublic void employee_selectAll() {List<Employee> employeeList = employeeDao.selectAll();for (Employee employee : employeeList) {System.out.println(employee);}}/*模糊查询*/@Testpublic void employee_selectByname() {List<Employee> userList =employeeDao.selectByName("大");for (Employee employee : userList) {System.out.println(employee);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/224170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于物理的AlGaN/GaN HEMT器件2DEG电荷密度分析模型(文献阅读)

标题&#xff1a;A Physics-Based Analytical Model for 2DEG Charge Density in AlGaN/GaN HEMT Devices (IEEE TRANSACTIONS ON ELECTRON DEVICES) 重要公式 2DEG电荷密度建模的困难源于量子阱中Ef随ns的复杂变化。此关系由给出 n s D V t h [ l n ( l e E f − E 0 V t …

文献速递:PET-影像组学专题--PET衍生的影像组学和人工智能在乳腺癌中的应用:一篇系统综述

文献速递&#xff1a;PET-影像组学专题–PET衍生的影像组学和人工智能在乳腺癌中的应用&#xff1a;一篇系统综述 01 文献速递介绍 乳腺癌&#xff08;BC&#xff09;是目前流行度最高的恶性肿瘤&#xff0c;也是全球女性癌症相关死亡的第二大原因&#xff0c;过去十年间发病…

开个酸奶店需要投资多少钱,创业优势在哪里

作为酸奶店创业5年的创业者&#xff0c;我给大家做个详细全面的分析。让你花最少的钱开一家属于你的酸奶店&#xff01; 这几年&#xff0c;随着奶茶店的烂大街&#xff0c;酸奶产品开始展露头脚&#xff0c;受到了无数消费者的追捧。从而很多创业者也瞄准了这个市场&#xff…

产品经理之Axure的元件库使用详细案例

⭐⭐ 产品经理专栏&#xff1a;产品专栏 ⭐⭐ 个人主页&#xff1a;个人主页 ​ 目录 前言 一.Axure的元件库的使用 1.1 元件介绍 1.2 基本元件的使用 1.2.1 矩形、按钮、标题的使用 1.2.2 图片及热区的使用 1.3 表单元件及表格元件的使用 1.3.1表单元件的使用 1.3.…

【Linux】进程周边004之进程的调度与切换(领略Linux系统进程调度算法的神奇)

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.进程切换 2.进程调度 2.…

Infobright列存数据库原理介绍

简介 Infobright 是一个面向 OLAP 场景的开源列存数据库。比较容易找到代码的版本是 Infobright Community Edition 4.0.7&#xff0c;大概是 2006 年前后的代码。2016 年6 月&#xff0c;Infobright 决定停止开源1。由于它同时提供企业版和社区版&#xff0c;开源版本的功能相…

基于ssm大学学术交流论坛论文

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于大学学术交流论坛当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了大学学术交流论坛的发展&#xff0c;它彻底改…

C# 图解教程 第5版 —— 第18章 泛型

文章目录 18.1 什么是泛型18.2 C# 中的泛型18.3 泛型类18.3.1 声明泛型类18.3.2 创建构造类型18.3.3 创建变量和实例18.3.4 使用泛型的示例18.3.5 比较泛型和非泛型栈 18.4 类型参数的约束18.4.1 Where 子句18.4.2 约束类型和次序 18.5 泛型方法18.5.1 声明泛型方法18.5.2 调用…

Linux系统中如何开启和配置OpenGauss数据库的远程连接

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试7. 结语 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍…

基于Maven构建OSGI应用(Maven和OSGI结合)

基于Maven构建OSGI应用。 使用Maven来构建项目&#xff0c;包括项目的创建、子模块buldle的创建等。使用OSGI来实现动态模块化管理&#xff0c;实现模块的热插拔效果&#xff08;即插即用&#xff09;。 创建一个Maven项目&#xff1a;helloworld&#xff0c;并在该项目下创建…

selenium/webdriver运行原理与机制

最近在看一些底层的东西。driver翻译过来是驱动&#xff0c;司机的意思。如果将webdriver比做成司机&#xff0c;竟然非常恰当。 我们可以把WebDriver驱动浏览器类比成出租车司机开出租车。在开出租车时有三个角色&#xff1a; 乘客&#xff1a;他/她告诉出租车司机去哪里&…

解决因找不到qt5core.dll文件而导致无法执行代码问题

Qt5core.dll是Qt5框架的核心模块&#xff0c;用于提供基本的Qt功能。如果在代码执行过程中找不到qt5core.dll&#xff0c;可能导致相关功能无法正常使用。以下是五种详细解决方法、qt5core.dll文件详细介绍以及丢失原因。 一、qt5core.dll文件详细介绍 文件名称&#xff1a;q…

vue文件下载请求blob文件流token失效的问题

页面停留很久token失效没有刷新页面&#xff0c;这时候点击下载依然可以导出文件&#xff0c;但是文件打不开且接口实际上返回的是401&#xff0c;这是因为文件下载的方式通过window创建a标签的形式打开的&#xff0c;并没有判断token失效问题 const res await this.$axios.…

10:00面试,10:08就出来了,问的问题超出我认知

本来在上家公司上班&#xff0c;加班是每天必不可少的&#xff0c;但是看在加班费给的比较多的份上&#xff0c;就没有太计较了。没想到9月份下一份通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降30%,这下搞的生活都生活不下去了。 还好有…

Dijkstra求最短路 I(Dijkstra算法)

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为正值。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;则输出 −1。 输入格式 第一行包含整数 n 和 m。 接下来 m 行每行包含三个整…

python和pygame实现捉小兔游戏

python和pygame实现捉小兔游戏 python和pygame实现捉小兔游戏&#xff0c;需要安装使用第三方库pygame&#xff0c;关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 下面是使用Python和Pygame创建的游戏&#xff0c;其中有…

Pytorch从零开始实战13

Pytorch从零开始实战——ResNet与DenseNet探索 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——ResNet与DenseNet探索环境准备数据集模型选择开始训练可视化总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;P…

Java连接数据库实现用户登录和注册功能

目录 需求内容如下 示例代码 数据库studb Java代码 效果图 需求内容如下 1&#xff0c;创建数据库studb 2&#xff0c;库中添加用户表userinfo,包含如下字段 用户id ,用户名&#xff0c;用户密码&#xff0c;用户权限 &#xff08;数据类型和约束自己定义&#xff09…

web微服务规划

一、背景 通过微服务来搭建web系统&#xff0c;就要对微服务进行规划&#xff0c;包括服务的划分&#xff0c;每个服务和数据库的命名规则&#xff0c;服务用到的端口等。 二、微服务划分 1、根据业务进行拆分 如&#xff1a; 一个购物系统可以将微服务拆分为基础中心、会员…

SpringMVC异常处理机制

2.1 异常描述 在J2EE项目的开发中&#xff0c;不管是对底层的数据库操作过程&#xff0c;还是业务层的处理过程&#xff0c;还是控制层的处理过程&#xff0c;都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常&#xff0c;系统的代码耦合度高&a…