MyBatis详细教程入门(从0-1这一步你必须迈出去)
Posted 李子捌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis详细教程入门(从0-1这一步你必须迈出去)相关的知识,希望对你有一定的参考价值。
MyBatis
1、简介
1.1 什么是MyBatis
- MyBatis 是一款优秀的持久层框架;
- 它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1.2 持久化
数据持久化
- 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
- 内存:断电即失
- 数据库(Jdbc),io文件持久化。
为什么要持久化?
- 有一些对象,不能让他丢掉
- 内存太贵
1.3 持久层
Dao层、Service层、Controller层
- 完成持久化工作的代码块
- 层界限十分明显
1.4 为什么需要MyBatis
- 帮助程序员将数据存入到数据库中
- 方便
- 传统的JDBC代码太复杂了,简化,框架,自动化
- 不用MyBatis也可以,技术没有高低之分
- 优点:
- 简单易学
- 灵活
- sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql
2、第一个Mybatis程序
思路:搭建环境 --> 导入MyBatis --> 编写代码 --> 测试
新建项目
- 创建一个普通的maven项目
- 删除src目录 (就可以把此工程当做父工程了,然后创建子工程)
- 导入maven依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--Junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<!--log4j依赖-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
4.创建一个Module
2.2 创建一个模块
-
编写mybatis的核心配置文件
<?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"> <configuration> <!--环境配置,可以配置多套环境,但是只能指定一个环境使用--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> </configuration>
-
编写mybatis工具类
package com.liziba.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.InputStream; /** * @auther LiZiBa * @date 2021/1/17 17:01 * @description: mybatis工具类 **/ public class MybatisUtil { /** SqlSessionFactory对象 */ static SqlSessionFactory sqlSessionFactory; static { try{ // 第一步:通过SqlSessionFactoryBuilder获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); }catch (Exception e) { e.printStackTrace(); } } /** * 获取SqlSession (SqlSession提供执行数据库语句方法) * @return SqlSession对象 */ public static SqlSession getSqlSession() { return sqlSessionFactory.openSession(); } }
2.3 编写代码
-
实体类
package com.liziba.mybatis.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.apache.ibatis.type.Alias; /** * @auther LiZiBa * @date 2021/1/17 17:07 * @description: **/ @Data @AllArgsConstructor @NoArgsConstructor // 别名自定义默认使用实体首字母小写 User-->Alias-->user @Alias("user") public class User { private Integer id; private String name; private String password; }
-
Dao/Mapper接口
public interface UserMapper { /** * 查询所有User * @return */ List<User> getUserList(); }
-
接口实现类 (由原来的UserMapperImpl转变为一个Mapper配置文件)
<?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="com.liziba.mybatis.mapper.UserMapper"> <!--查询所有User--> <select id="getUserList" resultType="com.liziba.mybatis.pojo.User"> select id,name,pwd as password from user </select> </mapper>
-
测试
package com.liziba.mybatis.mapper; import com.liziba.mybatis.pojo.User; import com.liziba.mybatis.utils.MybatisUtil; import org.apache.ibatis.session.RowBounds; import org.apache.ibatis.session.SqlSession; import org.apache.log4j.Logger; import org.junit.Test; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @auther LiZiBa * @date 2021/1/17 17:28 * @description: **/ public class UserMapperTest { /** * 测试获取全部user */ @Test public void getUserListTest() { // 开启一个SqlSession SqlSession sqlSession = MybatisUtil.getSqlSession(); // 通过SqlSession获取UserMapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> userList = userMapper.getUserList(); // 循环输出userList userList.forEach(user -> { System.out.println(user.toString()); }); // 关闭SqlSession sqlSession.close(); } }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fgbp0vH1-1622730704315)(C:\\Users\\Leon Plious\\AppData\\Roaming\\Typora\\typora-user-images\\1610891512594.png)]
可能会遇到的问题:
-
配置文件没有注册
-
绑定接口错误
-
方法名不对
-
返回类型不对
-
Maven导出资源问题
3、CURD
3.1 namespace
namespace中的包名要和Dao/Mapper接口的包名一致
3.2 select
选择,查询语句;
-
id:就是对应的namespace对于的mapper中的方法名;
-
resultType : Sql语句执行的返回值;
-
parameterType : 参数类型;
-
编写接口
/** * 通过id获取用户 * @param id * @return */ User getUserById(Integer id);
-
编写对应的mapper中的sql语句
<!--通过id查询用户--> <select id="getUserById" resultType="com.liziba.mybatis.pojo.User"> select * from user where id = #{id} </select>
-
测试
/** * 通过id获取用户 */ @Test public void getUserByIdTest() { logger.info("通过id获取用户"); SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.getUserById(1); System.out.println(user.toString()); sqlSession.close(); }
-
*insert/update/delete 语句需要提交事务sqlSession.commit();
3.3 Insert
-
编写接口
/** * 插入User * @param user */ void addUser(User user);
-
编写对应的mapper中的sql语句
<!--添加User--> <insert id="addUser" parameterType="user"> insert into user (id, name, pwd) values (#{id}, #{name}, #{pwd}) </insert>
-
测试
/** * 测试插入user */ @Test public void addUserTest() { SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = new User(5, "liangqinshi", "123456"); userMapper.addUser(user); // 增加、删除、修改一定要提交事务 sqlSession.commit(); sqlSession.close(); }
3.4 update
-
编写接口
/** * 通过id修改User * @param user */ void updateUserById(User user);
-
编写对应的mapper中的sql语句
<!--通过id修改用户--> <update id="updateUserById" parameterType="user"> update user set name = #{name} ,pwd = #{pwd} where id = #{id} </update>
-
测试
/** * 通过id修改用户 */ @Test public void updateUserByIdTest() { SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = new User(1, "liziba01", "654321"); userMapper.updateUserById(user); sqlSession.commit(); sqlSession.close(); }
3.5 Delete
-
编写接口
/** * 通过id删除用户 * @param id */ void deleteUserById(Integer id);
-
编写对应的mapper中的sql语句
<!--通过id删除用户--> <delete id="deleteUserById" parameterType="int"> delete from user where id = #{id} </delete>
-
测试
/** * 通过id删除用户 */ @Test public void deleteUserByIdTest() { SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); userMapper.deleteUserById(5); sqlSession.commit(); sqlSession.close(); }
3.6 万能Map
假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应该考虑使用Map!
- UserMapper接口
/**
* 通过Map对象插入User
* @param map
*/
void addUserByMap(Map<String, Object> map);
- UserMapper.xml
<!--通过map添加User-->
<insert id="addUserByMap" parameterType="map">
insert into user (id, name, pwd) values (#{id}, #{name}, #{password})
</insert>
- 测试
/**
* 通过map新增User
*/
@Test
public void addUserByMapTest() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 构建map,传入参数
Map<String, Object> userMap = new HashMap<>();
userMap.put("id", 4);
userMap.put("name", "xieli");
userMap.put("password", "123456");
userMapper.addUserByMap(userMap);
sqlSession.commit();
sqlSession.close();
}
Map传递参数,直接在sql中取出key即可! 【parameter=“map”】
对象传递参数,直接在sql中取出对象的属性即可! 【parameter=“Object”】
只有一个基本类型参数的情况下,可以直接在sql中取到
多个参数用Map , 或者注解!
3.7 模糊查询
*建议Java代码执行的时候,传递通配符% %
- UserMapper接口
/**
* 通过名字模糊查询User
* @param nameLike %nameLike%
* @return
*/
List<User> getUserLikeByName(String nameLike);
- UserMapper.xml
<!--通过名字模糊查询-->
<select id="getUserLikeByName" resultMap="UserMap">
select * from user where name like #{nameLike}
</select>
- 测试
/**
* 通过名字模糊查询
*/
@Test
public void getUserLikeByNameTest() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
String nameLike = "%li%";
List<User> users = userMapper.getUserLikeByName(nameLike);
users.forEach(user -> {
System.out.println(user.toString());
});
sqlSession.close();
}
4、配置解析
4.1 核心配置文件
-
mybatis-config.xml
-
Mybatis的配置文件包含了会深深影响MyBatis行为的设置和属性信息。
configuration(配置) properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境配置) environment(环境变量) transactionManager(事务管理器) dataSource(数据源) databaseIdProvider(数据库厂商标识) mappers(映射器)
4.2 环境配置 environments
MyBatis 可以配置成适应多种环境
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境
学会使用配置多套运行环境!
MyBatis默认的事务管理器就是JDBC ,连接池:POOLED
4.3 属性 properties
我们可以通过properties属性来实现引用配置文件
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。【db.poperties】
-
编写一个配置文件
db.properties
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC username=root password=123456
-
在核心配置文件中引入
<!--属性配置--> <!--数据库连接配置,如果属性properties存在与外部配置文件相同的key则以外部文件为标准--> <properties resource="db.properties" />
- 可以直接引入外部文件
- 可以在其中增加一些属性配置
- 如果两个文件有同一个字段,优先使用外部配置文件的
4.4 类型别名 typeAliases
-
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置.
-
意在降低冗余的全限定类名书写。
<!--别名配置--> <!-- 在实体类比较少的时候,使用第一种方式。 如果实体类十分多,建议用第二种扫描包的方式。 第一种可以自定义别名,第二种需要在实体上增加注解才能自定义别名。 --> <typeAliases> <!--第一种--> <typeAlias type="com.liziba.mybatis.pojo.User" alias="user"></typeAlias> </typeAliases>
也可以指定一个包,每一个在包
com.liziba.mybatis.pojo
中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如com.liziba.mybatis.pojo.User
的别名为user
,;若有注解,则别名为其注解值。见下面的例子:<typeAliases> <!--第二种--> <package name="com.liziba.mybatis.pojo"/> </typeAliases>
在实体类比较少的时候,使用第一种方式。
如果实体类十分多,建议用第二种扫描包的方式。
第一种可以自定义别名,第二种不行,如果非要改,需要在实体上增加注解。
@Alias("user") public class User { ... }
4.5 设置 Settings
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
https://mybatis.org/mybatis-3/zh/configuration.html#settings
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="mu以上是关于MyBatis详细教程入门(从0-1这一步你必须迈出去)的主要内容,如果未能解决你的问题,请参考以下文章
黑客入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
工作总结:Git的学习和使用,最详细的Git教程,从入门到精通
API 入门 (27) 使用 OpenAPI 描述 REST API——资源和操作