MyBatis 是一个半自动化的持久层的框架,能让开发者专注SQL本身
JDBC 连接数据库的硬编码问题,通过config,mapper配置文件解决
Mybatis开发需要关注的文件
l POJO类(DTO、VO、PO等)
l Mapper接口(就是dao接口)
l Mapper映射文件
l 全局配置文件
MyBatis 架构原理
说明:
1、 mybatis配置文件
a) SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
b) Mapper.xml,此文件作为mybatis的sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2、 SqlSessionFactory
通过mybatis环境等配置信息构造SqlSessionFactory,即会话工厂。
3、 sqlSession
通过会话工厂创建sqlSession即会话,程序员通过sqlsession会话接口对数据库进行增删改查操作。
4、 Executor执行器
mybatis底层自定义了Executor执行器接口来具体操作数据库,Executor接口有两个实现,一个是基本执行器(默认)、一个是缓存执行器,sqlsession底层是通过executor接口操作数据库的。
5、 Mapped Statement
它也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个select\insert\update\delete标签对应一个MappedStatement对象,select\insert\update\delete标签的id即是Mapped statement的id。
a) Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
b) Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
Mybatis 程序运行步骤
// 配置文件
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 建造器模式
// 数据库会话实例
sqlSession = sqlSessionFactory.openSession(); //程序员用到的接口
// 查询单个记录,根据用户id查询用户信息
User user = sqlSession.selectOne("test.findUserById", 10);//namespace.id
MyBatis 增删改查
1.根据用户名模糊查询
<select id="findUserByUsername" parameterType="java.lang.String"
resultType="com.kkb.mybatis.po.User">
select * from user where username like ‘%${value}%‘
</select>
测试:List<User> list = sqlSession.selectList("test.findUserByUsername", "小明");
2.插入
<insert id="insertUser" parameterType="com.kkb.mybatis.po.User">
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
sqlSession = sqlSessionFactory.openSession();
// 添加用户信息
User user = new User();
user.setUsername("张小明");
sqlSession.insert("test.insertUser", user);
sqlSession.commit();
3.删除
<delete id="deleteUserById" parameterType="int">
delete from user where id=#{id}
</delete>
执行:
sqlSession.delete("test.deleteUserById",18);
sqlSession.commit();
4.修改
<update id="updateUser" parameterType="com.kkb.mybatis.po.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id}
</update>
User user = new User();
user.setId(16);
sqlSession.update("test.updateUser", user);
sqlSession.commit();
Mapper接口开发需要遵循以下规范:
1、 Mapper接口的类路径与Mapper.xml文件中的namespace相同。
2、 Mapper接口方法名称和Mapper.xml中定义的每个statement的id相同。
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同。
4、 Mapper接口方法的返回值类型和mapper.xml中定义的每个sql的resultType的类型相同。
OGNL对象导航图语言
|---User(参数值对象)
|--username--张三
|--birthday
|--sex--男
|--dept -- Department
|--name
|--no
OGNL表达式去获取Department对象的name属性:dept.name
#{}和${}区别
l 区别1
#{} :相当于JDBC SQL语句中的占位符? (PreparedStatement)
${} : 相当于JDBC SQL语句中的连接符合 + (Statement)
l 区别2
#{} : 进行输入映射的时候,会对参数进行类型解析(如果是String类型,那么SQL语句会自动加上’’)
${} :进行输入映射的时候,将参数原样输出到SQL语句中
l 区别3
#{} : 如果进行简单类型(String、Date、8种基本类型的包装类)的输入映射时,#{}中参数名称可以任意
${} : 如果进行简单类型(String、Date、8种基本类型的包装类)的输入映射时,${}中参数名称必须是value
用到的设计模式
代理模式 : mapper接口,实现类是框架通过JDK动态代理生成的 (实际就是原来的DAO,做了封装)
工厂模式: SqlSessionFactory 工厂模式生成SqlSession对象实例
构造模式 :SqlSessionFactoryBuilder 根据主配置文件生成一个SqlSessionFactory
原文地址:https://www.cnblogs.com/bruce0706/p/11060524.html