搭建MyBatis

1-开发环境

2-创建Maven工程

  • 2.1- 打包方式

  • 2.2 导入依赖

<!--    打包方式jar-->
<packaging>jar</packaging> <dependencies>
<!-- MyBatis核心-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency> <dependency>
<!-- junit测试-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency> <dependency>
<!-- mysql驱动-->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.13</version>
</dependency> </dependencies>

3-创建Mybatis核心配置文件 ----> (连接"数据库")

  • 核心配置文件"主要"用于:1-配置廉价数据库的环境 、2-MyBatis全局配置信息

  • 核心配置文件"主要"放置:src / main / resources 目录下面

  • 映射文件"主要"用于:写SQL语句

3.1-配置mybatis的核心文件:

  • 3.1.1 :1-放置路径、2-文件名称"mybatis-config.xml"

  • 3.1.2:核心文件的内容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 配置链接数据库的环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/> <!--事务管理器-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/> <!--驱动名称-->
<property name="url" value="jdbc:mysql://localhost:3306/learn_mybatis"/> <!--连接地址-->
<property name="username" value="root"/> <!--用户名-->
<property name="password" value="${password}"/> <!--用户密码-->
</dataSource>
</environment>
</environments> <!-- 引入映射文件-->
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>

4-创建Mapper接口

  • Mapper接口的解析:MyBatis的 "Mapper接口" 等于 "以前的Dao接口"

  • 但是区别:Mapper只是接口,我们不需要提供"实现类" --->(需要和"SpringJpa"区别开来)

  • 4.1-首先我们需要创建一个数据库:

  • 4.2-创建t_user表对应的实体类:

  • 4.3-创建操作"User实体类"的"UserMapper"

5-创建Mapper的映射文件:

ORM : 对象 关系 映射

  • 对象:java的‘实体类’对象

  • 关系;关系型数据库

  • 映射:二者之间的对应关系

  • 5.1-加深"对应关系"的理解:

  • 5.2-映射文件的"命名规则"

  • 5.3-映射文件的"书写路径" ---> (选择"表",进行CRUD)

  • //一个"提供接口",一个"实现sql语句操作数据库"

  • 5.4-细节:MyBatis面向接口编程的"两个一致"(2点)

  • 第一点:

5.4.1- 细节: 1-映射文件的 "namespace" 要和 "mapper接口的全类名” 保持一致

全类名:拿5.3的"UserMapper"来举例子:他的全类名是:com.guigu.mapper.UserMapper(java包下开始算起)

所以:

  • 第二点:

5.4.2- 细节: 2-映射文件中的 "SQL语句的id" 要和 "mapper接口中的方法名" 一致

所以:

  • 5.5-在"核心文件中‘配置’映射文件"

resource文件下的"资源" ---(图中的是“核心配置文件”)

6-测试写的mapper是否可以

  • 在test里面写一个"UserMapperTests"

package com.atguigu.mapper;

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
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 UserMapperTests { @Test
public void UserMapper() throws IOException {
//配置核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取sqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取mapper接口对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
System.err.println(mapper);
//测试功能
Integer result = mapper.insertUser();
System.out.println("Result --> "+ result); //查看受影响的'行数',如果等于1,表示正常
// 7. 提交事务,事务是不会自动提交的,需要手动提交事务
sqlSession.commit();
// 8. 关闭 sqlSession,最后一定要记得关闭会话
sqlSession.close(); }
}
细节(替换):

openSession() 获得 SqlSession默认是不会自动提交事务,因此需要自己手动提交。

openSession(true) 获得 SqlSession默认会自动提交事务

7-添加日志功能

  • 7.1-导入依赖

<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
  • 7.2-添加log的资源文件

  • 路径:resources包 下的 log4j.xml 文件

  • 7.3-log4j.xml代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5d %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n"/>
</layout>
</appender> <logger name="java.sql">
<level value="debug"/>
</logger>
<logger name="org.apache.ibatis" >
<level value="info"/>
</logger> <!-- 默认配置,级别为debug 且根据name为log.console和 log.file两个appender输出-->
<root>
<level value="debug"/>
<appender-ref ref="STDOUT"/>
</root>
</log4j:configuration>

8-附加篇;对"Mybatis"来实现对"数据库"的CEUD的细节分析:

  • 8.1-有的配置;

解析:
1-"实体类” 用来对 “数据库的字段”(对应) 2-“核心配置”(用来连接Mysql的库) 3-“接口”(用来给Service层调用方法)
但是,真正用 “sql语句” 来对 “数据库” 进行操作的是 ---> “映射文件” //所以,“接口” 和 “映射文件”的 “两个一致” 格外重要!!!(如果不懂两个一致,翻看上面的-5.4)
  • 8.2:疑问:

那  “接口”  和  “映射文件”   就可以进行对数据的操作,  那"User实体类"的作用是什么?

解答:
1- 增、删、改 -> 这三个的"返回值是Integer" 受影响的行数,不需要"User实体类" 2- 但是,"查",需要查到数据,"用User实体类" 来"接收"查到的数据 ,这时候User就有用处啦! 接下来,用"代码8.3"来展示,"User实体类"的 "用处"
  • 8.3 - 用"按id查询"来体现出 "User实体类" 的作用

  • 1-首先,先写"UserMapper接口"

 /**
* 用id查询单条数据
*/
User FindUserById(); /**
* 用id查询多条数据(多条)
*/
List<User> FindAllUser();
  • 2-再写,"UserMapper的映射文件"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.atguigu.mapper.UserMapper"> //这个是 "映射文件" 去映射 "Mapper接口" <!-- mapper的接口: User FindUserById();
细节:映射文件中的 "SQL语句的id" 要和 "mapper接口中的方法名" 一致
--> <!--
查询功能必须有:resultType或者resultMap 1-resultType:默认的映射关系(大白话:"表的字段"和"实体类的属性"一致) 2-resultMap:自定义映射关系(大白话:"表的字段"和"实体类的属性"不一致,需要"额外的步骤")
或者"一对多、多对一"的情况也使用-resultMap
-->
<select id="FindUserById" resultType="com.atguigu.pojo.User">
select * from t_user where id=5;
</select> <!-- List<User> FindAllUser();-->
<select id="FindAllUser" resultType="com.atguigu.pojo.User">
select * from t_user where FIND_IN_SET(id,'2,3,5');
</select> </mapper>
  • 解析:

1-"查询功能"必须有:"resultType"或者"resultMap" //用来,可以让"查询到的数据,有一个实体类容器装起来"

2-当然,那"resultType"或者"resultMap" 的使用时需要细节的:

     1-resultType:默认的映射关系(大白话:"表的字段"和"实体类的属性"一致)

     2-resultMap:自定义映射关系(大白话:"表的字段"和"实体类的属性"不一致,需要"额外的步骤")
eg:“数据库 2.1或者"一对多、多对一"的情况也使用-resultMap
//百度搜索:resultMap的用法

8.4-测试:

package com.atguigu.mapper;

import com.atguigu.pojo.User;
import org.junit.Test; import java.io.IOException;
import java.io.InputStream;
import java.util.List; 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 UserMapperTests { @Test
public void UserMapper() throws IOException {
//配置核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取sqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取mapper接口对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//测试功能
Integer result = mapper.UpdateUser();
System.out.println("Result --> "+ result); //查看受影响的'行数',如果等于1,表示正常
// 7. 提交事务,事务是不会自动提交的,需要手动提交事务 (用---> sqlSessionFactory.openSession(true); 替换)
//sqlSession.commit();
// 8. 关闭 sqlSession,最后一定要记得关闭会话
sqlSession.close(); } @Test //删除
public void DeleteUserMapper() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Integer result = mapper.DeleteUser();
System.out.println("Result --> "+ result); //查看受影响的'行数',如果等于1,表示正常
sqlSession.close(); } @Test //查询id
public void FindUserById() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User result = mapper.FindUserById();
System.err.println("Result --> "+ result);
sqlSession.close(); } @Test //查询All
public void FindAllUser() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.FindAllUser();
System.err.println("Result --> "+ users);
sqlSession.close(); } }

附加篇:@Test每次都要写这么多,肯定不方便呀。

所以我们把“sqlSession”封装成一个“工具类”

  • 1-工具类路径:

  • 封装sqlSession内容:

  • 细节:"工具类”,一般设置为static静态的,方便调用

package com.atguigu.mybatis.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException;
import java.io.InputStream; /**
* 封装了sqlSession方法;
*/
public class SqlSessionUtils {
public static SqlSession getSession() { SqlSession sqlSession = null;
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
sqlSession = sqlSessionFactory.openSession(true);
} catch (IOException e) {
e.printStackTrace();
} return sqlSession;
}
}
  • 在test尝试 -- "Session的封装方法"

//优化后的@Test,代码模块

package com.atguigu.mapper;

import com.atguigu.mybatis.mapper.ParameterMapper;
import com.atguigu.mybatis.pojo.User;
import com.atguigu.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; import java.io.IOException;
import java.io.InputStream;
import java.util.List; public class ParameterMapperTests {
@Test //查询All
public void FindAllUser() throws IOException { SqlSession sqlSession = SqlSessionUtils.getSession();
ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
List<User> users = mapper.FindAllUser();
System.err.println("Result --> "+ users);
sqlSession.close(); }
}

MyBatis_02_(搭建Mybatis)的更多相关文章

  1. 通过Maven搭建Mybatis项目

    学习通过maven工程搭建Mybatis工程开启对M ybaits的学习总结之旅. 1.首先创建Maven工程. 2.在pom.xml文件中加入依赖的jar <!-- mybatis核心包 -- ...

  2. 关于搭建MyBatis框架(二)

    由于在[关于使用Mybatis的使用说明(一)http://www.cnblogs.com/zdb292034/p/8675766.html]中存在不太完善地方,通过此片文档进行修订: 阅读指南:(1 ...

  3. 搭建MyBatis开发环境及基本的CURD

    目录 一.MyBatis概述 1. MyBatis 解决的主要问题 二.快速开始一个 MyBatis 1. 创建mysql数据库和表 2. 创建maven工程 3. 在pom.xml文件中添加信息 4 ...

  4. 如何在Eclipse中搭建MyBatis基本开发环境?(使用Eclipse创建Maven项目)

    实现要求: 在Eclipse中搭建MyBatis基本开发环境. 实现步骤: 1.使用Eclipse创建Maven项目.File >> New >> Maven Project ...

  5. [刘阳Java]_快速搭建MyBatis环境_第2讲

    1.MyBatis的环境配置 导入MyBatis包, mybatis-3.2.8.jar 导入MySQL驱动包, mysql-connector-java-5.1.24-bin.jar 创建表的实体类 ...

  6. 由“单独搭建Mybatis”到“Mybatis与Spring的整合/集成”

    在J2EE领域,Hibernate与Mybatis是大家常用的持久层框架,它们各有特点,在持久层框架中处于领导地位. 本文主要介绍Mybatis(对于较小型的系统,特别是报表较多的系统,个人偏向Myb ...

  7. 搭建MyBatis框架

    一.开发环境 1.JDK 1.6.0_22 2.MyEclipse 10.7.1 3.Oracle_10g_10.2.0.4 注:各软件版本不是必须的,正常任意版本都行,文件较大就不附上下载地址了,推 ...

  8. 移动商城第三篇【搭建Mybatis和Spring环境、编写Dao、Service在Core模块】

    Mybatis和Spring环境搭建 由于我们的所编写的dao层.service代码可能前台和后台都需要用到的,因此我们把环境搭建在core模块中 逆向工程 首先,我们要做的就是品牌管理,我们首先来看 ...

  9. 第三章.搭建MyBatis工程环境

    1.数据库的准备: 数据库: create DATABASE mybatis: 数据表: CREATE TABLE `user` ( `id` int(10) NOT NULL AUTO_INCREM ...

  10. Spring mvc 搭建Mybatis

    本文建立在spring mvc已经搭建起来的基础上. 首先看要引入的jar包,其中高亮的是为了mybatis新引入的. <properties>       <spring.webm ...

随机推荐

  1. .NET微服务系统迁移至.NET6.0的故事

    本次迁移涉及的是公司内部一个业务子系统,该系统是一个多样化的应用,支撑着公司的多个业务方向.目前,该系统由40多个基于.NET的微服务应用构成,使用数千个CPU核心和数TB内存,在数百个Linux容器 ...

  2. Centos 7.x系统下忘记用户登录密码,重置密码的方法

    转载csdn: Centos 7.x系统下忘记用户登录密码,重置密码的方法_ATree的博客-CSDN博客_centos7密码忘记 重置密码的方法 Centos7修改root密码_shanvlang的 ...

  3. LeetCode ● 216.组合总和III ● 17.电话号码的字母组合

    LeetCode 216.组合总和III 分析1.0 回溯问题 组合总和sum == n 时以及path中元素个数 == k 时,res.add(new path) 返回后递归删除掉当前值 class ...

  4. LeetCode 周赛 334,在算法的世界里反复横跳

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 今天是 LeetCode 第 334 场周赛,你参加了吗?这场周赛考察范围比较基础,整体 ...

  5. postgresql 数据库 INSERT 或 UPDATE 大量数据时速度慢的原因分析

    前言 最近这段时间一直使用pg 数据库插入更新大量的数据,发现pg数据库有时候插入数据非常慢,这里我对此问题作出分析,找到一部分原因,和解决办法. 一 死元祖过多 提起pg数据库,由于他的构造,就不得 ...

  6. 【django-vue】前端取消默认样式 main.js配置 后端主页模块接口 跨域问题详解 项目自定义配置 git介绍和安装

    目录 回顾 上节课回顾 今日内容 1 前端全局样式和js配置 1.1 global.css 1.2 settings.js 1.3 main.js 2 后端主页模块接口 三种开发模式 模型父类Base ...

  7. org.elasticsearch.ElasticsearchException: not all primary shards of [.geoip_databases] index are active解决办法

    解决办法 在配置elasticsearch.yml中加上 ingest.geoip.downloader.enabled: false

  8. C++调用C#DLL并调试

    使用C++ 来调用C#DLL 并且调试程序 环境:使用VS studio 2019 C#项目的设置 1.C# -> 属性 -> 应用程序 -> 目标框架 ->.NET Fram ...

  9. C++ MFC字符转换

    创建Win32 空项目 字符说明:国外 1个字符对应1个字节   多字节 中文  1个字符对应对个字节  宽字节   Unicode  utf-8  3个   GBK  2个 多字节转为 宽字节    ...

  10. Anaconda jupyter notebook 出现 kernel error 解决办法

    kenel出现错误如图: 解决办法 首先打开Anaconda Prompt输入jupyter kernelspec list查看安装的内核和位置进入安装目录,打开kernel.jason, 查看pyt ...