MyBatis
是支持定制SQL
,存储过程以及高级映射优秀的持久层框架。
查询user
表中所有数据
- 创建
user
表,添加数据 - 导入依赖,创建模块
- 编写
MyBatis
核心配置文件 - 编写
SQL
映射文件 - 编写代码
- 定义
P0J0
类 - 加载核心配置文件,获取
SqlSessionFactory
对象 - 获取
SqlSession
对象,执行SQL
语句 - 释放资源
- 定义
一、创建user
表
use mybatis;
drop table if exists tb_user;
create table tb_user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
gender char(1),
addr varchar(30)
);
insert into tb_user values (1, '张三', '123', '男', '北京');
insert into tb_user values (2, '李四', '234', '女', '天津');
insert into tb_user values (3, '王五', '11', '男', '西安');
创建实体类
public class User {
private Integer id;
private String name;
private String password;
private char sex;
private String addr;
}
二、导入依赖
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.16</version>
</dependency>
三、编写MyBatis
配置
<!-- 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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库连接信息-->
<property name="driver" value="org.mariadb.jdbc.Driver"/>
<property name="url" value="jdbc:mariadb://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="20040927"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载SQL映射文件-->
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
四、编写SQL映射文件
<!--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名称空间-->
<mapper namespace="test">
<select id="selectAll" resultType="cn.cangli.todo.pojo.User">
select * from tb_user;
</select>
</mapper>
五、编写代码
public class TestUser {
@Test
public void testUser() throws IOException {
//1.加载mybatis的核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
//2.获取SqlSession对象,用他来执行Sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行Sql
List<User> users = sqlSession.selectList("test.selectAll");
System.out.println(users);
//4.释放资源
sqlSession.close();
inputStream.close();
}
}
SqlSessionFactoryBuilder
用于构建SqlSessionFactory
对象,每个基于MyBatis
的应用都是以SqlSessionFactory
为核心的。- 有了
SqlSessionFactory
,我们就可以从中获得SqlSession
实例,每一个SqlSession
都代表一个会话,每个会话相互隔离,互不影响。 SqlSession
使用完毕要释放资源,使用try(SqlSession session = factory.openSession(true)){}
SqlSessionFactory
用完就扔,但是SqlSessionFactory
可以留着
传入参数
类似于JDBC
中的PreparedStatement
,预编译和防止SQL注入
resultTypes属性
传入一个参数,为了防止SQL注入,我们使用#
而不是$
<!--namespace名称空间-->
<mapper namespace="test">
<select id="selectUserById" resultType="cn.cangli.todo.pojo.User" parameterType="_int">
select * from tb_user where id = #{id};
</select>
</mapper>
不过,MyBatis
会做类型推断,因此这里parameterType
可以省略
<!--namespace名称空间-->
<mapper namespace="test">
<select id="selectUserById" resultType="cn.cangli.todo.pojo.User">
select * from tb_user where id = #{id};
</select>
</mapper>
代码
User user=session.selectOne("selectUserById", 3);
传入两个参数
<select id="selectUserByIdAndAge" resultType="User">
select * from user where id = #{id} and age = # {age}
</select>
代码
User user = session.selectOne("selectUserByIdAndAge",
Map.of("id",1,"age",18));
或者
User user = session.selectOne("selectUserByIdAndAge",new Param(1,18));
class Param {
int id;
int age;
}
resultMaps属性
假设实体类
class Param {
int id;
String userName;
int age;
}
而数据库中的属性是id、name、age
可能返回结果
User(id=1, username=null, age=18)
为解决这个问题,xml改写
<select id="selectUserByIdAndAge" resultMap="test">
select * from user where id = #{id} and age = # {age}
</select>
<resultMap id="test" type="User">
<result column="id" property="id"><!--可省略-->
<result column="name" property="username">
<result column="age" property="age"><!--可省略-->
</resultMap>
官方提供了自动映射功能,数据库中的蛇形命名会自动转换为驼峰形式,我们只需要在顶部开启设置
<settings>
<setting name="nameUnderscoreToCamelCase" value="ture"/>
</settings>
<select id="selectUsersByAge" resultType="User">
select * from user where age >= #{age}
</select>