一ORM型框架
ORM:Object Relation Mapping:对象关系映射,通俗理解就是将一个对象相关属性和数据库数据进行关联(映射),传统我们对数据库数据 的操作可以通过ORM框架转移到对对象的操作上来,这无疑有利于提高程序的开发效率和项目的可维护性,本质是对传统的JDBC操作高级封装
工作流程:mybatis通过sqlSessionFactory创建sqlSession,
sqlSession表示应用程序与数据库的会话,当用户使用mapper.xml文件中配置的的方法时,mybatis首先会解析sql动态标签为对应数据库sql的形式,并将其封装进MapperStatement对象,然后通过executor将sql注入数据库执行,并返回结果
常见ORM框架:hibernate、mybatis
mybatis主要通过两个配置文件(sqlMapConfig.xml和Mapper.xml),来配置数据库和对象的关系
sqlMapConfig.xml:
Mybatis的全局配置文件,主要配置mybatis的环境参数、映射对象运行参数。
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>
<!-- 加载数据库属性文件:db.properties -->
<properties resource="db.properties"/>
<!--
typeAliases:别名设置
package:mybatis自动扫描polo类,自动创建别名(类型名)
-->
<typeAliases>
<typeAlias type="com.zhiwei.domain.User" alias="user"/>
<package name="com.zhiwei.domain" />
</typeAliases>
<!-- 和spring整合environment配置将抛弃 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC"/>
<!-- 数据连接池 :mybatis管理-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件
resource:每次只能加载一个文件
class:只能mapper代理对象执行(mapper接口名和mapper.xml文件名一致,并且在同一个目录)
package:批量加载:name为mapper文件所在的包名
-->
<mappers>
<mapper resource="com/zhiwei/domain/UserMapper.xml"/>
</mappers>
</configuration>
三mapper.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命令空间:sql访问地址划分 -->
<mapper namespace="test">
<!-- 映射文件配置sql语句 :select执行数据库查询
id:sql语句封装mappedStatement的id
#{id}:占位符,表示接受输入的参数:id,如果输入参数类型为简单类型,
#{}中的参数名可以任意,
resultType:返回结果类型
-->
<select id="findUserById" parameterType="int" resultType="user">
select *from user where id=#{id}
</select>
<delete id="deleteUserById" parameterType="int">
delete from user where id=#{id}
</delete>
<!-- 如果输入的参数为pojo类型,占位符名称使用pojo的属性 -->
<update id="updateUser" parameterType="com.zhiwei.domain.User">
update user set name=#{name},passwd=#{passwd} where id=#{id}
</update>
<insert id="addUser" parameterType="com.zhiwei.domain.User">
insert into user(id,name,passwd) values(#{id},#{name},# {passwd})
</insert>
</mapper>
四 实体类
<?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命令空间:sql访问地址划分 -->
<mapper namespace="test">
<!-- 映射文件配置sql语句 :select执行数据库查询
id:sql语句封装mappedStatement的id
#{id}:占位符,表示接受输入的参数:id,如果输入参数类型为简单 类型,
#{}中的参数名可以任意,
resultType:返回结果类型
-->
<select id="findUserById" parameterType="int" resultType="user">
select *from user where id=#{id}
</select>
<delete id="deleteUserById" parameterType="int">
delete from user where id=#{id}
</delete>
<!-- 如果输入的参数为pojo类型,占位符名称使用pojo的属性 -->
<update id="updateUser" parameterType="com.zhiwei.domain.User">
update user set name=#{name},passwd=#{passwd} where id=#{id}
</update>
<insert id="addUser" parameterType="com.zhiwei.domain.User">
insert into user(id,name,passwd) values(#{id},#{name},#{passwd})
</insert>
</mapper>
五 工具类
package com.zhiwei.tool;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* Mybatis工具类
* @author Yang Zhiwei
*/
public final class MybatisTool {
private static InputStream is=null;
private static SqlSession sqlSession=null;
/**
* 获取Mybstis SqlSession会话
* @return
*/
public static SqlSession getSession(){
try {
is=Resources.getResourceAsStream("SqlMapConfig.xml");
} catch (IOException e) {
e.printStackTrace();
}
/**本质通过调用DefaultSqlSessionFactory创建sqlSession
*DefaultSqlSession:与数据库进行JDBC操作的类
* MappedStatement:与JDBC操作的StateMent类类似,封装sql信息,
* mybatis的动态sql标签在提交给数据库之前会进行sql的规范化,控制台日志显示
* executor:真正和数据库进行交互的执行者
* configuration:mybatis配置文件信息的封装类
*部分源码:
* @Override
public int update(String statement, Object parameter) {
try {
dirty = true;
MappedStatement ms = configuration.getMappedStatement(statement);
return executor.update(ms, wrapCollection(parameter));
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error updating database. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}
*
* */
//通过mybatis的控制文件创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
sqlSession=sqlSessionFactory.openSession();
return sqlSession;
}
/**
* 关闭mybatis SqlSession会话
*/
public static void resourceClosing(){
try{
if(sqlSession!=null){
sqlSession.close();
}
if(is!=null){
is.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
六 对象接口实现的类
package com.zhiwei.service;
import org.apache.ibatis.session.SqlSession;
import com.zhiwei.domain.User;
import com.zhiwei.tool.MybatisTool;
/***
* 基础服务类
* @author Yang Zhiwei
*/
public class BasicServiceImp{
private static SqlSession sqlSession=null;
//SqlSession初始化
static{
sqlSession=MybatisTool.getSession();
}
/**
* 通过Id查询用户信息
* test:表示命名空间
* findUserById:mapper.xml文件的动态sql id
* test.findUserById:指明访问动态sql地址--->对应:<mapper namespace="test">
* @param id
* @return
*/
public static User findUserById(int id) {
return sqlSession.selectOne("test.findUserById", id);
}
/**
* 更新用户信息
* @param user
*/
public static void updateUser(User user) {
sqlSession.update("test.updateUser",user);
sqlSession.commit();
MybatisTool.resourceClosing();
}
/**
* 删除用户信息
* @param id
*/
public static void deleteUserById(int id) {
sqlSession.delete("test.deleteUserById", id);
sqlSession.commit();
MybatisTool.resourceClosing();
}
/**
* 添加用户信息
* @param user
*/
public static void addUser(User user) {
sqlSession.insert("test.addUser",user);
sqlSession.commit();
MybatisTool.resourceClosing();
}
}
七测试执行类
package com.zhiwei.test;
import com.zhiwei.domain.User;
import com.zhiwei.service.BasicServiceImp;
public class BasicTest {
public static void main(String[] args) {
User user=BasicServiceImp.findUserById(1);
System.out.println(user);
}
}
网友评论