Mybatis 学习笔记总结
Posted IT_Holmes
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis 学习笔记总结相关的知识,希望对你有一定的参考价值。
文章目录
- 1. Mybatis
- 2. Mybatis 准备工作
- 3. Mybatis 的 CRUD实现
- 4. Map和模糊查询
- 5. Mybatis的配置优化
- 6. 环境变量(environments)
- 7. 属性(properties)
- 8. 类型别名(typeAliases)
- 9. settings(设置)
- 10. 映射器(mappers)
1. Mybatis
1.1 Mybatis 官方定义
官方给的定义:
- MyBatis 是一款优秀的持久层框架。
- 它支持自定义 SQL、存储过程以及高级映射。
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数(db.property文件)和获取结果集(ResultSet结果集)的工作 。
- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1.2 Mybatis 历史和获取安装
Mybatis的历史?
Mybatis本是apache的一个开源项目iBatis(现在,我们导入包很多包也是iBatis的名字。) ,后来由阿帕奇转到了谷歌,才改名为Mybatis,之后又迁移到了Github上面。
如何获得Mybatis?
- maven仓库获取。
- Github获取。
一般我们直接maven获取就行。
1.3 Dao层
Dao层(Data access Object)也就是持久层。
我们的内存一般就是 断电即失 。
而jdbc数据库,io持久化。持久化就是将程序数据在持久状态和瞬时状态转化的过程。
1.4 为什么需要Mybatis?
2. Mybatis 准备工作
2.1 错误注意事项(重点!)
Mybatis的错误注意点:
- Type interface com.itholmes.dao.UserDao is not known to the MapperRegistry. 这个错误就是因为我们设置的Mapper.xml没有在Mybatis-config.xml中进行配置注册。
Maven的常见的错误:
- 在Mybatis配置中,遇到的类似下图的错误:
- 原因就是我们设定的xml等配置文件,这些配置文件在maven中,默认是设定在了resources文件中。如果将xml配置文件放到了java结构下,maven测试导入的时候就没办法引入了。
Maven的机制就是约定优于配置。
也就是说我们在resources的其他结构写配置文件,可能无法导出或者生效!不过,这里是有解决办法的!
解决办法就是在pom.xml文件中来进行引入就可:
<!--在build中配置resources,从而也可以将其他结构下的xml配置文件也会被导入,让其生效!-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
配置好之后,再运行就没问题了,也能在target中看到配置文件的导入。
2.2 Mybatis的 使用
第一步:导包导依赖。
mysql驱动包和mybatis包的依赖。
第二步:编写mybatis的核心配置文件,mybatis-config.xml文件。
配合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">
<!--mybatis的核心配置文件-->
<configuration>
<!--
环境,可以设定多个,不同场景用不同的环境。
想用那个环境直接设置default属性就行。
-->
<environments default="development">
<environment id="development">
<!--事务管理器-->
<transactionManager type="JDBC"/>
<!--dataSource是数据源,平时我们遇到的数据源有dbcp,c3p0,德鲁伊等等。-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--
useSSL=true: 安全
连接。
& 在xml需要转义,转义后的内容就是 & 符号。
useUnicode=true: 使用Unicode编码,设置中文。
characterEncoding=UTF-8: 字符集。
serverTimezone=Asia/Shanghai:设置时区。
-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="0818"/>
</dataSource>
</environment>
</environments>
</configuration>
第三步:封装mybatis工具类,负责生产SqlSession。
这里有个工厂过程:
SqlSessionFactoryBuilder => SqlSessionFactory => SqlSession
封装mybatis工具类MybatisUtils 类:
package com.itholmes.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;
public class MybatisUtils
private static String resource = null;
private static InputStream inputStream = null;
private static SqlSessionFactory sqlSessionFactory = null;
static
try
//使用Mybatis的第一步骤:获取sqlSessionFactory对象
resource = "mybatis-config.xml";
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
catch (IOException e)
e.printStackTrace();
public static SqlSession getSqlSession()
/*
* 获取到了SqlSessionFactory,我们可以从中获得 SqlSession 的实例。
* SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
* */
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
第四步:编写代码。
首先,设定一个pojo层的实体类,对应数据库内容的User类:
package com.itholmes.pojo;
public class User
private int id;
private String name;
private String pwd;
public User()
public User(int id, String name, String pwd)
this.id = id;
this.name = name;
this.pwd = pwd;
public int getId()
return id;
public void setId(int id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getPwd()
return pwd;
public void setPwd(String pwd)
this.pwd = pwd;
设定一个Dao层的接口:
package com.itholmes.dao;
import com.itholmes.pojo.User;
import java.util.List;
public interface UserDao
List<User> getUserList();
设定接口实现类:
一般我们平时使用jdbc操作,都是直接写一个UserDaoImpl.java文件,写一堆操作数据库的代码获取结果集啥的。但是在这里我们可以使用一个Mapper.xml配置文件,来替代这些操作。
写一个UserMapper.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">
<!--namespace:绑定一个对应的Dao/Mapper接口。-->
<mapper namespace="com.itholmes.dao.UserDao">
<!--
select查询语句
id属性就是我们要重写的方法的名字,对应namespace绑定的接口。
resultType:返回一个类型。
resultMap:返回多个类型。
-->
<select id="getUserList" resultType="com.itholmes.pojo.User">
select * from mybatis.user
</select>
</mapper>
第五步:编写测试。
package com.itholmes.dao;
import com.itholmes.pojo.User;
import com.itholmes.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import java.util.List;
public class UserDaoTest
@Test
public void test()
//通过我们设定的工具类来获取sqlSession。
SqlSession sqlSession = MybatisUtils.getSqlSession();
/*
方式一:使用getMapper来获取实现类(常用!!!最新推荐的)
*/
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> userList = mapper.getUserList();
/*
方式二:使用getMapper来获取实现类(不常用但是要知道!)
如果返回的是一个结果:sqlSession.selectOne。
如果返回的是一个list:sqlSession.selectList。
如果返回的是一个map:sqlSession.selectMap。
... 等等都是与返回值类型对应出来的。
*/
List<User> userList2 = sqlSession.selectList("com.itholmes.dao.UserDao.getUserList");
System.out.println("userList:");
for (User user : userList)
System.out.println(user);
System.out.println("userList2:");
for (User user : userList2)
System.out.println(user);
//关闭sqlSession
sqlSession.close();
2.3 Mybatis的 注意事项
命名空间:
一定使用全限定名:
三者的关系和注意事项:
3. Mybatis 的 CRUD实现
接下来的操作配置都在我们自己设定的Mapper.xml中进行!
3.1 namespace
namespace中的包名要和 Dao/mapper 接口的包名一致。
3.2 select 查询
选择,查询语句:
- id属性:对应的namespace中的方法名。
- resultType属性:Sql语句执行的返回值!
对应的还有个resultMap,区别就是resultType返回一个类型,resultMap返回多个类型。 - parameterType属性:设置参数类型。
UserMapper.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="com.itholmes.dao.UserMapper">
<select id="getUserList" resultType="com.itholmes.pojo.User" >
select * from mybatis.user
</select>
<!--
parameterType属性:定义参数类型。
#id ,拿到对应方法中参数名为id的参数。
-->
<select id="getUserById" resultType="com.itholmes.pojo.User" parameterType="int">
select * from mybatis.user where id = #id
</select>
</mapper>
UserMapper.java接口:
package com.itholmes.dao;
import com.itholmes.pojo.User;
import java.util.List;
public interface UserMapper
//查询全部用户
List<User> getUserList();
//根据ID查询用户
User getUserById(int id);
测试类:
package com.itholmes.dao;
import com.itholmes.pojo.User;
import com.itholmes.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import java.util.List;
public class UserDaoTest
@Test
public void getUserById()
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User userById = mapper.getUserById(1);
System.out.println(userById);
sqlSession.close();
3.3 增删改 语句
需要注意的是Mybatis的增删改需要手动提交事务!jdbc都是自动提交事务的。
UserMapper.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">
<!--namespace:绑定一个对应的Dao/Mapper接口。-->
<mapper namespace="com.itholmes.dao.UserMapper">
<!--
select查询语句
id属性就是我们要重写的方法的名字,对应namespace绑定的接口。
resultType:返回一个类型。
resultMap:返回多个类型。
-->
<select id="getUserList" resultType="com.itholmes.pojo.User" >
select * from mybatis.user;
</select>
<!--
select查询语句(有参数):
parameterType属性:定义参数类型。
#id ,拿到对应方法中参数名为id的参数。
-->
<select id="getUserById" resultType="com.itholmes.pojo.User" parameterType="int">
select * from mybatis.user where id = #id;
</select>
<!--
insert插入语句:
对象中的属性,可以直接取出来。
-->
<insert id="addUser" parameterType="com.itholmes.pojo.User">
insert into mybatis.user (`id`,`name` ,`pwd`) values (#id,#name,#pwd);
</insert>
<!--
更新语句:
-->
<update id="updateUser" parameterType="com.itholmes.pojo.User">
update mybatis.user set `name`=#name,`pwd`=#pwd where id = #id;
</update>
<!--
删除语句:
-->
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id = #id;
</delete>
</mapper>
UserMapper.java接口文件:
package com.itholmes.dao;
import com.itholmes.pojo.User;
import java.util.List;
public interface UserMapper
//查询全部用户
List<User> getUserList();
//根据ID查询用户
User getUserById(int id);
//插入用户
int addUser(User user);
//修改用户
int updateUser(User user);
//删除用户
int deleteUser(int id);
UserDaoTest测试文件:
package com.itholmes.dao;
import com.itholmes.pojo.User;
import com.itholmes.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import java.util.List;
public class UserDaoTest
@Test
public void test()
//通过我们设定的工具类来获取sqlSession。
SqlSession sqlSession = MybatisUtils.getSqlSession();
/*
方式一:使用getMapper来获取实现类(常用!!!最新推荐的)
*/
UserMapper mapper = sqlSession.getMapper(UserMapper.以上是关于Mybatis 学习笔记总结的主要内容,如果未能解决你的问题,请参考以下文章
springmvc学习总结 -- maven+springmvc+spring+mybatis+mysql详细搭建整合过程讲解