什么是框架?
框架相当于是一个脚手架,内部已经封装好了很多代码,只需要在其基础上进行开发就可以提高我们的开发效率。
什么是MyBatis?
- MyBatis 是一款优秀的持久层框架。
- 它支持自定义 SQL、存储过程以及高级映射。
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
- 官方文档:https://mybatis.org/mybatis-3...
快速上手
我的mysql版本是5.7
1. 准备数据
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');
2. 依赖导入
org.mybatis
mybatis
3.5.10
mysql
mysql-connector-java
8.0.11
org.projectlombok
lombok
1.18.24
provided
junit
junit
4.13.2
test
3. JavaBean
用于映射数据库:
- 类名 = 表名
- 类成员变量 = 字段
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private Integer age;
private String email;
}
4. 定义接口
创建 com.nhb.dao.UserDao
接口,并定义接口方法,内容如下:
public interface UserDao {
List getAll();
}
5. xml映射实现接口
在 resources
目录下创建 com/nhb/dao/UserDao.xml
,实现接口并定义sql,内容如下:
6. mybatis配置文件
在 resources
目录下创建 mybatis-config
配置文件,内容如下:
7. 测试单元
在 test
目录下创建 com/nhb/MyTest.java
,内容如下:
public class MyTest {
private SqlSession sqlSession;
@Before
public void init() throws IOException {
//定义mybatis配置文件路径
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//传入对应配置文件的输入流,读取配置文件获得SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new
SqlSessionFactoryBuilder().build(inputStream);
//通过SqlSessionFactory获取sqlSession对象(理解为数据库连接)
sqlSession = sqlSessionFactory.openSession();
}
@Test
public void testUserDao(){
//通过sqlSession获取Mapper接口的实现类
UserDao userDao = sqlSession.getMapper(UserDao.class);
List all = userDao.getAll();
//遍历输出
for (User user : all) {
System.out.println(user);
}
}
@After
public void destroy(){
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
}
高效开发
拒绝重复且无意义的东西,提升开发效率。
- IDEA里面设置好
mybatis-config
和UserDao.xml
代码模板。 - IDEA安装MyBatisX插件,接口与实体类互相跳转,自动生成实体类,代码生成等。
- 可以复制粘贴就别手写,容易出错。
参数获取
单个参数
基本参数
使用 #{}
来取值,写任意名字都可以获取参数,建议使用接口的参数名来取值。
定义接口方法
User getById(Integer id);
实现接口方法,并定义sql
单元测试
@Test
public void testGetById(){
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = userDao.getById(1);
System.out.println(user);
}
对象
使用对象中的属性名来获取对应的值
定义接口方法
User getByBean(User user);
实现接口方法,并定义sql
单元测试
@Test
public void testGetByBean(){
UserDao userDao = sqlSession.getMapper(UserDao.class);
User newUser = new User(2, "Jack", 20, "[email protected]");
User user = userDao.getByBean(newUser);
System.out.println(user);
}
多个参数
MyBatis会把多个参数放入一个Map集合中,如果只有一个参数的时候不用做什么特殊处理。 多个参数的情况下要加上 @Param
来设置参数名。
定义接口方法
User getByMap(@Param("id") Integer id,@Param("name") String name);
实现接口方法,并定义sql
单元测试
@Test
public void testGetByMap(){
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = userDao.getByMap(1,"Jone");
System.out.println(user);
}
占位符的区别
#{}
是预编译处理,会将形参变量的值取出,并自动给其添加引号。
${}
是字符串替换,直接替换掉占位符,使用 ${} 的话会导致 sql 注入。
所以为了防止 SQL 注入,能用 #{}
的不要去用 ${}
核心类
sqlSessionFactory
sqlSessionFactory
是一个SqlSession
的工厂类,主要用来获取SqlSession
对象。
//成员方法
SqlSession openSession();
//获取SqlSession对象,传入的参数表示创建的SqlSession是否自动提交
SqlSession openSession(boolean var1);
sqlSession
SqlSession
实现了 Closeable
接口,代表 SqlSession
是可以关闭的,那也就是说SqlSession
代表一种可关闭的连接。SqlSession
提供了在数据库执行SQL命令所需的所有方法,它还提供了事务的相关操作。
//成员方法
//获取Mapper对象
T getMapper(Class var1);
//提交事务
void commit();
//事物回滚
void rollback();
//释放资源
void close();
CRUD操作
定义接口方法
//新增
int save(User user);
//删除
int removeById(Integer id);
//修改
int updateById(User user);
//查询
User getById(Integer id);
实现接口方法,并定义sql
INSERT INTO user VALUE(#{id},#{name},#{age},#{email})
DELETE FROM user WHERE id = #{id}
UPDATE user SET name = #{name}, age = #{age}, email = #{email} WHERE id = #{id}
单元测试
@Test
public void testSave(){
UserDao userDao = sqlSession.getMapper(UserDao.class);
User newUser = new User(6, "鸡你太美", 25, "[email protected]");
int result = userDao.save(newUser);
System.out.println(result);
}
@Test
public void testRemoveById(){
UserDao userDao = sqlSession.getMapper(UserDao.class);
int result = userDao.removeById(5);
System.out.println(result);
}
@Test
public void testUpdateById(){
UserDao userDao = sqlSession.getMapper(UserDao.class);
User newUser = new User(6, "鸡哥真爱粉", 21, "[email protected]");
int result = userDao.updateById(newUser);
System.out.println(result);
}
@Test
public void testGetById(){
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = userDao.getById(1);
System.out.println(user);
}
配置文件
下面举几个简单的配置来演示一下,更多配置查官方文档:https://mybatis.org/mybatis-3...
properties
可以使用
读取 properties
配置文件,使用其中的 resource
属性来设置配置文件的路径。然后使用 ${key}
来获取配置文件中的值。
在 resources
目录下有 jdbc.properties
文件:
jdbc.url = jdbc:mysql://localhost:3306/demo?useSSL=false
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.username = nhb
jdbc.password = ********
在mybatis-config.xml
中:
settings
可以使用该标签来进行一些设置
environments
配置数据库相关的环境,例如事物管理器,连接池相关参数等。
mappers
将包内的映射器接口实现全部注册为映射器
注意:定义dao接口所在的包,要求xml文件存放的路径和dao接口的包名要对应,不然会报错!!