最近跟着狂神学习了mybatis的框架,做了一些笔记,强推一波狂神,
b站主页:遇见狂神说的个人空间 - 哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili,学习java的可以多照着狂神的视频进行学习,收获颇丰。
1、简介
1.1 什么是mybatis?
-
MyBatis 本是apache的一个开源项目iBatis,
-
2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
-
2013年11月迁移到Github。
1.2、持久化
数据持久化
-
持久化是将程序的数据在持久化状态和瞬时状态转化的过程
-
内存: 断电即失
-
数据库(jdbc)io文件持久化
-
生活:冷藏、罐头
为什么需要持久化?
-
有一些对象不能让他丢失
-
内存太贵
1.3、持久层
dao层 、service层,controller层。。。
-
完成持久化工作的代码块
-
层界限十分明显
1.4、为什么需要mybatis
-
方便
-
传统的JDBC代码太复杂,简化,框架
-
不用mybatis也可以,更容易上手,技术无高低之分
优点:
-
简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
-
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
-
解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
-
提供映射标签,支持对象与数据库的orm字段关系映射
-
提供对象关系映射标签,支持对象关系组建维护
-
提供xml标签,支持编写动态sql。
最重要的一点:使用的人多
2、第一个mybatis程序
思路:搭建环境->导入mybatis->编写代码->测试!
2.1、搭建环境
新建项目:
-
新建一个maven项目
-
删除src目录
-
导入maven依赖
<!--导入依赖-->
<dependencies>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
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?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"/> <property name="username" value="root"/> <property name="password" value="admin"/> </dataSource> </environment> </environments> <!--每一个mapper.xml都需要在mybatis核心配置文件中注册!--> <mappers> <mapper resource="com/yps/dao/UserMapper.xml"/> </mappers> </configuration>
编写mybatis工具类
package com.yps.utils; 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; //sqlSessionFactory-->sqlSession public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { //获取sqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 // SqlSession 的实例。SqlSession 提供了在数据库执行 // SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接 // 执行已映射的 SQL 语句。例如: public static SqlSession getSqlSession() { return sqlSessionFactory.openSession(); } }
2.3、编写代码
-
实体类
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 getUName() {
return name;
}
public void setUsername(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
dao接口 UserDao.java
import java.util.List;
import java.util.Map;
public interface UserMapper {
//获取查询全部用户
List<User> getUserList()
}
接口实现类由原来的UserDaoImpl转变为一个Mapper.xml文件.建立配置文件 UserDaoImpl.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接口-->
<mapper namespace="com.yps.dao.UserMapper">
<!--查询语句-->
<select id="getUserList" resultType="com.yps.pojo.User">
select * from mybatis.user
</select>
</mapper>
2.4、测试
junit
MapperRegistry是什么?
配置文件中的mappers
junit测试
@Test
public void test() {
//第一步 读取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//第二步 执行Sql
//方式一: getMapper
//原先的实现类变成了xml文件,所以拿到接口 就可以执行实现类的方法了
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
//方式二
//List<User> userList = sqlSession.selectList("com.yps.dao.UsrDao.getUserList");
for (User user : userList) {
System.out.println(user);
}
//关闭sqlSession
sqlSession.close();
}
可能遇到的问题
-
配置文件没有注册
-
绑定接口错误
-
方法名不对
-
返回类型不对
-
maven导出资源问题
3、CRUD
1、namespace
命名空间,namespace中的包名要和Dao/mapper接口的包名一致!
2、select
选择、查询语句;
-
id:就是对应的namespace中的方法
-
resultType :Sql语句执行的返回值!
-
parameterType: 参数类型!
-
编写接口
//获取查询全部用户
List<User> getUserList();
2. 编写对应的mapper中的sql语句
<select id="getUserList" resultType="com.yps.pojo.User">
select * from mybatis.user
</select>
3、测试
@Test
public void test() {
//第一步 读取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//第二步 执行Sql
//方式一: getMapper
//原先的实现类变成了xml文件,所以拿到接口 就可以执行实现类的方法了
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
//方式二
//List<User> userList = sqlSession.selectList("com.yps.dao.UsrDao.getUserList");
for (User user : userList) {
System.out.println(user);
}
//关闭sqlSession
sqlSession.close();
}
3、insert
<insert id="addUser" parameterType="com.yps.pojo.User">
insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd});
</insert>
4、update
<update id="updateUser" parameterType="com.yps.pojo.User">
update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id};
</update>
5、delete
<delete id="deleteUser" parameterType="com.yps.pojo.User">
delete from mybatis.user where id=#{id}
</delete>
注意点!
-
增删改需要提交事务!
6、分析错误
7、万能的Map
假设我们的实体类,或者数据库中的表,字段参数过多,我们考虑使用map
dao接口
//万能的map
int addUser2(Map<String, Object> map);
mapper文件
<insert id="addUser2" parameterType="map">
insert into mybatis.user(id,name,pwd) values (#{userid},#{username},#{userpwd})
</insert>
测试程序
@Test
public void addUser2() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("userid", 10);
//map.put("username", "hello");
map.put("userpwd", "1254");
mapper.addUser2(map);
//提交事务
sqlSession.commit();
sqlSession.close();
}
对象传递参数,直接在sql中取对象的属性即可!【parameterType=“object”】
只有一个基本类型参数的情况下,可以直接在sql中取到!
多个参数用Map,或者注解!