MyBatis框架基础
什么是框架
框架就是骨架,跟建房子的架构一样
其实就是对基础代码的一种封装,并且提供相应的API
框架是一种经过校验(就是经过前人的采坑,已经测试过了),具有一定功能的半成品软件
Mybatis
MyBatis是一款优秀的持久层框架,支持定制SQL,存储过程.高级映射,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
功能架构
- API接口层:开发人员通过本地API操纵数据库 ,接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理 ,思考:对象怎么获取才能去调接口
- 数据处理层:负责具体的SQL查找,解析,执行,执行结果映射处理等.目的是根据调用的请求完成一次数据库操作
- 基础支撑层:负责最基础的功能支撑
Mybatis流程
- resources目录下 配置文件 mybatis-config.xml ,配置四要素,关系映射Xxxmapper文件
- mapper目录下编写映射文件 XxxMapper.xml,书写SQL语句
- 创建Demo ,使用SqlSessionFactoryBuild.build( 传入流 )获取SqlSessionFactory对象
- SqlSessionFactory对象调用openSession() 获取SqlSession对象
- 使用SqlSession执行CRUD
目录结构
操作
- db.properties
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql:///javaweb?serverTimezone=UTC //mysql8加上时区
username=root
password=123
- 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="db.properties"/>
<!--别名-->
<typeAliases>
/* <!--type 表示 类的全限定命名
alias 表示 小名 别名(不区分大小写)
-->
<!-- <typeAlias type=" " alias=""/>--> */
<!--包扫描器 扫描包下面的所有的javabean ,被bean起别名 且别名为类的名称(不区分大小写)
name :包的路径-->
<package name="cn.k.domain"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!-- 事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 连接池(数据源) -->
<dataSource type="POOLED">
<!--连接数据库的四个属性name属性位置 value属性的值-->
<property name="driver" value="${driverClassName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--关联sql的映射文件 -->
<mapper resource="cn/k/mapper/UserMapper.xml"/>
</mappers>
</configuration>
- 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">
<mapper namespace="cn/k/mapper/UserMapper.xml">
//插入
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
insert into t_user (name,age,salary) values(#{name},#{age},#{salary})
</insert>
//查询指定id的数据
<select id="selectById" resultType="user">
select *from t_user where id=#{id}
</select>
</mapper>
- 实体类User
@Data
public class User {
private Long id;
private String name;
private Integer age;
private BigDecimal salary;
}
- 接口IUser
public interface IUserDAO {
void insert(User user);
User selectById(Long id);
}
- 实现类USerDAOImpl
public class UserDAOImpl implements IUserDAO {
@Override
public void insert(User user) {
try {
SqlSession sqlSession = MyBatisUtil.openSqlSession();
//mapper文件的全限定路径+定位到sql语句唯一id
sqlSession.insert("cn/k/mapper/UserMapper.xml.insert",user);
sqlSession.commit();
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public User selectById(Long id) {
try {
SqlSession sqlSession = MyBatisUtil.openSqlSession();
User user = sqlSession.selectOne("cn/k/mapper/UserMapper.xml.selectById", id);
sqlSession.commit();
sqlSession.close();
return user;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
- 工具类MyBatisUtil
public final class MyBatisUtil {
private MyBatisUtil(){} //私有化构造器
private static SqlSessionFactory factory=null;
//静态代码块加载资源
static {
try {
factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession openSqlSession(){
SqlSession sqlSession = factory.openSession();
return sqlSession;
}
}
扩展
sqlSession.insert() ,sqlSession.delete(),sqlSession.update()底层其实都是调用了更新操作
实际上跟JDBC中,PreparedStatement.QueueUpdate()一样
关于mybatis-config.xml中的解读
- 关联数据库 四要素 ,放在xml首位
<properties resource="db.properties"/> driverClassName,url,username,password 四要素
- 别名标签与包扫描器
<typeAliases>
type 表示 类的全限定命名 ,alias 表示 别名(不区分大小写)
<typeAlias type=" " alias=""/>
//不用typeAlias可以使用包扫描器
包扫描器:扫描包下面所有javabean,为其别名,并且名字就是类的名字(不区分大小写)
<package name="cn.k.domain"/>
</typeAliases>
- 事务管理器
<transactionManager type="JDBC"/>
- 连接池
<dataSource type="POOLED">
- 关联sql的映射文件,放在xml最后
<mappers>
<mapper resource="cn/k/mapper/UserMapper.xml"/>
</mappers>
关于sql的映射文件解读XxxMapper
- namespace 命名空间
<mapper namespace="cn/k/mapper/UserMapper.xml">
书写规范 xml文件所在的包路径+"."+xml文件名称(一般是个接口)
作用:用来唯一标识该文件
- 插入操作insert标签(用来封装insert 的sql语句)
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
insert into t_user (name,age,salary) values(#{name},#{age},#{salary})
</insert>
1.id表示:该标签在该文件的唯一标识
2.sql语句 变量使用 #{} ,相当于PreparedStatement中的占位符?
3.parameterType="参数类型(传入类(user)类的全限定名)" 可以省略
4.useGeneratedKeys 设置成true 表示 插入完数据以后,获取新增数据的id 值,默认是false,表示不获取
5.keyProperty 表示接收id值的属性名称(类中对应数据库中主键的属性的名称)
6.keyColumn ="id" 数据库中主键的字段名称
- #{变量}
变量:如果传入的参数是简单类型(包括String),这个变量可以随便写
如果传入的数据是引用类型(对象,map等),变量必须要用类中的属性名字
日志管理
在resources目录下创建log4j.properties
# 全局日志配置
log4j.rootLogger=ERROR, stdout
# MyBatis 日志配置 org.mybatis.example.BlogMappe 换成自己的mapper目录全路径
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n