什么是框架?
框架相当于是一个脚手架,外部曾经封装好了很多代码,只须要在其根底上进行开发就能够进步咱们的开发效率。
什么是 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, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
2. 依赖导入
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
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<User> getAll();
}
5. xml 映射实现接口
在 resources
目录下创立 com/nhb/dao/UserDao.xml
,实现接口并定义 sql,内容如下:
<?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.nhb.dao.UserDao">
<select id="getAll" resultType="com.nhb.entity.User">
SELECT * FROM user
</select>
</mapper>
6. mybatis 配置文件
在 resources
目录下创立 mybatis-config
配置文件,内容如下:
<?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://182.61.21.196:3306/demo?useSSL=false"/>
<property name="username" value="nhb"/>
<property name="password" value="5740339qq"/>
</dataSource>
</environment>
</environments>
<!-- 关联 xml 配置的文件 -->
<mappers>
<mapper resource="com/nhb/dao/UserDao.xml"/>
</mappers>
</configuration>
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<User> 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
<select id="getById" resultType="com.nhb.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
单元测试
@Test
public void testGetById(){UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = userDao.getById(1);
System.out.println(user);
}
对象
应用对象中的属性名来获取对应的值
定义接口办法
User getByBean(User user);
实现接口办法,并定义 sql
<select id="getByBean" resultType="com.nhb.entity.User">
SELECT * FROM user WHERE id = #{id}
AND name = #{name} AND age = #{age} AND email = #{email}
</select>
单元测试
@Test
public void testGetByBean(){UserDao userDao = sqlSession.getMapper(UserDao.class);
User newUser = new User(2, "Jack", 20, "test2@baomidou.com");
User user = userDao.getByBean(newUser);
System.out.println(user);
}
多个参数
MyBatis 会把多个参数放入一个 Map 汇合中,如果只有一个参数的时候不必做什么非凡解决。多个参数的状况下要加上 @Param
来设置参数名。
定义接口办法
User getByMap(@Param("id") Integer id,@Param("name") String name);
实现接口办法,并定义 sql
<select id="getByMap" resultType="com.nhb.entity.User">
SELECT * FROM user WHERE id = #{id} AND name = #{name}
</select>
单元测试
@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> T getMapper(Class<T> 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 id="save">
INSERT INTO user VALUE(#{id},#{name},#{age},#{email})
</insert>
<delete id="removeById">
DELETE FROM user WHERE id = #{id}
</delete>
<update id="updateById">
UPDATE user SET name = #{name}, age = #{age}, email = #{email} WHERE id = #{id}
</update>
<select id="getById" resultType="com.nhb.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
单元测试
@Test
public void testSave(){UserDao userDao = sqlSession.getMapper(UserDao.class);
User newUser = new User(6, "鸡你太美", 25, "jige@baomidou.com");
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, "jige@www.com");
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><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
中:
<?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>
<!-- 设置配置文件所在的门路 -->
<properties resource="jdbc.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 获取配置文件中对应的值来设置连贯相干参数 -->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 关联 xml 配置的文件 -->
<mappers>
<mapper resource="mapper/UserDao.xml"/>
</mappers>
</configuration>
settings
能够应用该标签来进行一些设置
<settings>
<!-- 开启主动驼峰命名映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
environments
配置数据库相干的环境,例如事物管理器,连接池相干参数等。
<!-- 设置默认环境 -->
<environments default="development">
<!-- 设置环境惟一标识符 -->
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 获取配置文件中对应的值来设置连贯相干参数 -->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
mappers
将包内的映射器接口实现全副注册为映射器
留神:定义 dao 接口所在的包,要求 xml 文件寄存的门路和 dao 接口的包名要对应,不然会报错!!
<mappers>
<package name="com.nhb.dao"/>
</mappers>