概述
mybatis 是持久层框架,支持自定义 SQL、存储过程以及高级映射
通过 XML 或注解来配置和映射原始类型、接口和 Java POJO(实体类)为数据库中的记录
官网:https://mybatis.net.cn/
思想
采用 ORM 思想解决实体和数据库映射的问题
ORM: 对象关系映射。数据库的一条数据对应java中的一个对象
环境搭建
普通Java项目
- 需要导入
mybatis-x.x.x.jar
包
maven项目
- 导入依赖
- 创建实体类,dao接口(名称建议改为mapper)
- 创建mybatis主配置文件SqlMapConfig.xml
- 创建映射的配置文件UserDao.xml
maven项目目录结构
- 项目名称
- src 源代码
- main 主代码
- java Java代码
- cn
- dy
- pojo 实体类
- mapper 持久层接口
- dy
- cn
- resources 资源目录
- SqlMapConfig.xml Mybatis核心配置文件
- log4j.properties log4j日志配置文件
- cn
- dy
- mapper 持久层映射目录(此目录结构必须和Java中的结构保持一致)
- dy
- java Java代码
- test 测试代码
- main 主代码
- target 构建目录
- src 源代码
注意
在mybatis中持久层操作接口名称和映射文件名称也叫做Mappermybatis的映射文件位置必须和mapper(dao)接口的包位置相同
maven编译时会将映射文件和编译后的mapper(dao)接口放在同一目录下
SqlMapConfig.xml核心文件
<!-- mybatis配置的dtd约束 -->
<?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>
<!--配置mybatis环境 这里默认使用MySQL配置-->
<environments default="mysql">
<!--配置MySQL环境-->
<environment id="mysql">
<!-- MySQL事务 -->
<transactionManager type="JDBC"></transactionManager>
<!--数据源(连接池) POOLED为mybatis的数据源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--配置映射文件-->
<mappers>
<!-- resource指向mapper的xml映射文件 -->
<mapper resource="cn/dy/mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
mapper的xml映射文件
<!-- mybatis中mapper的dtd约束 -->
<?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="cn.dy.mapper.UserMapper">
<!-- id属性值必须和接口中的方法名相同 -->
<!-- resultType属性值必须是pojo的全限定接口名 -->
<!-- parameterType属性值必须是方法参数的全限定接口名 -->
<!-- sql中的参数以 #{pojo中的属性名} 的形式传递-->
<select id="findUserById" resultType="cn.dy.pojo.User" parameterType="java.lang.Integer">
SELECT username,birthday,sex,address FROM user WHERE id = #{id}
</select>
<!-- 这里在添加后返回主键id -->
<!-- keyColumn为数据库中的列名 -->
<!-- keyProperty为pojo中的属性名 -->
<!-- order 取值:AFTER,BEFORE;AFTER:添加后返回,BEFORE:添加前返回(有可能导致id错误) -->
<insert id="addUser" parameterType="cn.dy.pojo.User">
INSERT INTO user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
<selectKey resultType="java.lang.Integer" keyColumn="id" keyProperty="id" order="AFTER">
select last_insert_id()
</selectKey>
</insert>
</mapper>
mybatis构建流程
使用mybatis提供的Resources工具类读取 核心配置文件(SqlMapConfig.xml)
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
创建SqlSessionFactoryBuilder构建者对象(SqlSessionFactoryBuilder采用构建者模式)
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
使用SqlSessionFactoryBuilder对象去构建SqlSessionFactory工厂对象(SqlSessionFactory采用工厂模式)
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
使用SqlSessionFactory工厂对象去创建SqlSession对象 (openSession默认不开启事务)
SqlSession sqlSession = sqlSessionFactory.openSession();
使用SqlSession对象去创建代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
使用代理对象去调用方法
User user = new User(null, "张三", Date.valueOf("2012-12-11"), "男", "南京"); userMapper.addUser(user);
释放资源
// 这里提交事务 sqlSession.commit(); try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } sqlSession.close();
#{}与${value}的区别
#{}使用…对象,使用占位符的方式,可以避免sql注入问题
${}使用…对象,会引发sql注入问题