JAVAWEB(四)mybatis规范化的结构目录

2018-07-06  本文已影响20人  文子轩

一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);
}
}
上一篇 下一篇

猜你喜欢

热点阅读