MyBatis_02_(搭建Mybatis)
2024-10-21 13:00:33
搭建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();
}
}
最新文章
- 当GitHub把我当成DDos攻击者拉进了黑名单中。。。
- C# 获取本机CPU序列号,MAC地址,硬盘ID,本机IP地址,计算机名,物理内存,PC类型
- NoSql---MongoDB基本操作
- FoxOne---一个快速高效的BS框架
- 【linux-shell】rsync
- Git 学习资源
- POJ - 1426 暴力枚举+同余模定理 [kuangbin带你飞]专题一
- mysql数据库字符集编码查看以及设置
- Baidu 人脸识别FireFly 与PC连接调试
- OpenCV3.2.0+VS2017环境配置与常见问题(巨细坑爹版)
- mysql 初识数据库 目录
- TMS320VC5509总线驱动LED灯
- android 上传图片
- JVM体系结构之七:持久代、元空间(Metaspace) 常量池==了解String类的intern()方法、常量池介绍、常量池从Perm-->;Heap
- Android ActionBar使用方法
- __init__和__new__
- [USACO19FEB]Moorio Kart(DP)
- gulp 打包报错:ReferenceError: internalBinding is not defined
- 第十二届北航程序设计竞赛决赛网络同步赛 J题 两点之间
- win7 PLSQL Developer 10/11/12 连接 Oracle 10/11/12 x64位数据库配置详解(与32位一样,只要注意对应Oracle Instant Client版本) tns 错误和 nls错误