Mybatis

(一)定义

  1. 持久的框架:操作数据库,对数据库的数据进行操作
  2. 用反射+xml解析封装的一个jdbc框架,这个框架也就是orm1映射框架

(二)特点

  1. 动态SQL语句
  2. 缓存技术

(三)执行过程

(1)过程描述

  1. 加载核心xml文件,产生SqlSessionFactroy
  2. 通过这个工厂来产生sqlSession,本身这个对象不能来操作数据库
  3. 这个对象会产生一个解析器(excutor),可以得到一个mappedStatement对象(Statement对象的子类)对象,就可以执行sql
  4. 返回数据(map int list)
  5. 核心jar包核心jar包
  6. 核心文件mybatis-config.xml

(2)最终版的执行过程

  1. 首先加载xml文件
  2. 得到sqlSession
  3. 通过sqlSession 得到接口类
  4. 调用其方法(通过UserMapper.xml)
  5. 然后执行sql语句,返回结果集

(3)代码

  1. 建实体类包pojo/entity
package com.offcn.pojo;

import java.util.Date;

public class User {
   private Integer id; //id 
   private String userCode; //用户编码
   private String userName; //用户名称
   private String userPassword; //用户密码
   private Integer gender;  //性别
   private Date birthday;  //出生日期
   private String phone;   //电话
   private String address; //地址
   private Integer userRole;    //用户角色
   private Integer createdBy;   //创建者
   private Date creationDate; //创建时间
   private Integer modifyBy;     //更新者
   private Date modifyDate;   //更新时间
   
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
   public String getUserCode() {
      return userCode;
   }
   public void setUserCode(String userCode) {
      this.userCode = userCode;
   }
   public String getUserName() {
      return userName;
   }
   public void setUserName(String userName) {
      this.userName = userName;
   }
   public String getUserPassword() {
      return userPassword;
   }
   public void setUserPassword(String userPassword) {
      this.userPassword = userPassword;
   }
   public Integer getGender() {
      return gender;
   }
   public void setGender(Integer gender) {
      this.gender = gender;
   }
   public Date getBirthday() {
      return birthday;
   }
   public void setBirthday(Date birthday) {
      this.birthday = birthday;
   }
   public String getPhone() {
      return phone;
   }
   public void setPhone(String phone) {
      this.phone = phone;
   }
   public String getAddress() {
      return address;
   }
   public void setAddress(String address) {
      this.address = address;
   }
   public Integer getUserRole() {
      return userRole;
   }
   public void setUserRole(Integer userRole) {
      this.userRole = userRole;
   }
   public Integer getCreatedBy() {
      return createdBy;
   }
   public void setCreatedBy(Integer createdBy) {
      this.createdBy = createdBy;
   }
   public Date getCreationDate() {
      return creationDate;
   }
   public void setCreationDate(Date creationDate) {
      this.creationDate = creationDate;
   }
   public Integer getModifyBy() {
      return modifyBy;
   }
   public void setModifyBy(Integer modifyBy) {
      this.modifyBy = modifyBy;
   }
   public Date getModifyDate() {
      return modifyDate;
   }
   public void setModifyDate(Date modifyDate) {
      this.modifyDate = modifyDate;
   }
}
  1. 创建映射包com.offcn.mapper,其中包含:
    • 一个接口UserMapper
    • 一个xml文件UserMapper.xml(与接口相对应的xml文件)2
      创建UserMapper接口
package com.offcn.dao;

import com.offcn.pojo.User;
import java.util.List;
public interface UserMapper {
    //查询总记录数
    //这个id必须匹配相对应的方法名
    int selectCount();
    //增加
    int insertUser(User user);
    //模糊查询
    List<User> selectLikeUser(String userName);
    //查询全部
    List<User> selectAllUser();
}
创建对接口所对应的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">

<!--namespace:包管理器-->
<!--
<mapper namespace="com.offcn.dao.UserMapper">
 &lt;!&ndash;这个id唯一,访问的标志符&ndash;&gt;&lt;!&ndash;resultType 返回值类型&ndash;&gt;
    &lt;!&ndash;查询总记录
    <select id="selectCount" resultType="int">
        /*语句后面不要加“;”*/
        select count(1) from smbms_user
    </select>
    &lt;!&ndash;全查,resultType可以给别名&ndash;&gt;
    <select id="selectAllUser" resultType="com.offcn.pojo.User">
        select * from smbms_user
    </select>
    &lt;!&ndash;模糊查询&ndash;&gt;
    &lt;!&ndash;parameterType:代表参数的类型;#{}:代表的占位符(?);模糊查询:一定要加concat&ndash;&gt;
    <select id="selectLikeUser" resultType="com.offcn.pojo.User" parameterType="String">
        select * from smbms_user where userName like concat('%',#{userName},'%')
    </select>
    &lt;!&ndash;根据id查&ndash;&gt;
    <select id="selectUserById" resultType="com.offcn.pojo.User" parameterType="String">
        select * from smbms_user where id = #{id}
    </select>
    &lt;!&ndash;根据id修改,返回值可以不需要&ndash;&gt;
    &lt;!&ndash;userName 对应数据库的列 所对应的是Java实体bean&ndash;&gt;
    &lt;!&ndash;建议数据库与实体类一一对应&ndash;&gt;
    <update id="updateUserById"  parameterType="com.offcn.pojo.User">
        update smbms_user set userName = #{userName}, userPassword = #{userPassword} where id = #{id}
    </update>
    &lt;!&ndash;根据id删除&ndash;&gt;
    <delete id="deleteUserById" parameterType="int">
        delete from smbms_user where id = #{id}
    </delete>
    &lt;!&ndash;增加一个对象&ndash;&gt;
    <insert id="insertUser" parameterType="com.offcn.pojo.User">
        insert into smbms_user (userName,userPassword) values (#{userName},#{userPassword})
    </insert>&ndash;&gt;
</mapper>-->
<!--找到关联的接口类:包名+类名-->
<mapper namespace="com.offcn.dao.UserMapper">
    <!--id必须和接口类的方法名一样-->
    <select id="selectAllUser" resultType="user">
        select * from smbms_user
    </select>
</mapper>
  1. 系统核心文件的配置(configuration配置)
    • properties 可以在Java属性配置文件中,只能在configuration配置中的首位,不能放在其它地方,否则会报错。
    • setting 修改MyBatis 在运行时的行为方式(可忽略3
    • typeAliases 为Java类型命名一个别名(简称)
      - typeHandlers 类型处理器
    • objectFactory 对象工厂
    • plugins 插件
    • environments 环境
    • environment 环境变量
      • transactionManager 事务管理器
      • dataSource 数据源
    • mapper 映射器
<?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">

<!-- 通过这个配置文件完成mybatis与数据库的连接 -->
<configuration>
    <!--引入配置文件-->
    <properties resource="database.properties"></properties>
    <typeAliases>
        <!--1.给当前包下面所有类取别名,别名与类名一致-->
        <!--<package name="com.offcn.pojo"></package>-->
        <!--2.给具体的类加别名 type:要加别名的类的包名+类名;alias:别名的名称-->
        <typeAlias type="com.offcn.pojo.User" alias="user"></typeAlias>
    </typeAliases>
    <!--配置环境-->
    <!--environments 可以配置多个环境:mysql、Oracle-->
        <environments default="development">
            <environment id="development">
                <!--事务,用jdbc的事务进行管理-->
                <transactionManager type="JDBC"></transactionManager>
                <!--配置数据源-->
                <!--1.jndi:由tomcat容器分配的数据源
                    2.pooled:mybatis自带的数据源-->
                <dataSource type="POOLED">
                    <!--JDBC的name不能为driverClassName,只能为driver-->
                    <property name="url" value="${url}"></property>
                    <property name="driver" value="${driver}"></property>
                    <property name="username" value="${username}"></property>
                    <property name="password" value="${password}"></property>
                </dataSource>
            </environment>
        </environments>
    <!--关联UserMapper.xml,mappers:可以配置多个;resource:代表路径,这里的.都要换成/-->
    <mappers>
        <mapper resource="com/offcn/dao/UserMapper.xml"></mapper>
        <!--<mapper class="com.offcn.dao.UserMapper"></mapper>-->
        <mapper resource="com/offcn/dao/AddressMapper.xml"></mapper>
    </mappers>

</configuration>
以上为mybatis-config.xml配置
  1. 测试类
    封装前后
public class Text {
    @Test
    public  void test(){
        try {
            //得到核心配置文件
            String path = "mybatis-config.xml";
            //得到一个输入流对象
            InputStream is = Resources.getResourceAsStream(path);
            //得到工厂SqlSessionFactory
            SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
            //通过工厂得到SqlSession
            SqlSession sqlSession = ssf.openSession();
            //返回一列,就用selectOne
            int num = sqlSession.selectOne("com.offcn.dao.UserMapper.selectCount");
            System.out.println(num);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
  1. 创建个工具类SqlSessionUtils
package com.offcn.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

/*
* 得到SqlSession的工具类
* */
public class SqlSessionUtils {
    private static SqlSessionUtils sqlSessionUtils;
    public SqlSession sqlSession;
    //这个构造要读取核心配置文件
    private SqlSessionUtils() {
        try {
            String path = "mybatis-config.xml";
            InputStream is = Resources.getResourceAsStream(path);
            SqlSessionFactory ssf =  new SqlSessionFactoryBuilder().build(is);
            sqlSession = ssf.openSession(true);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //得到一个对外的方法得到这个对象
    /*第一个同步锁,锁方法(可能会出现死锁),保证只有一个线程能进入这个方法*/
    public static synchronized SqlSessionUtils getSqlSessionUtils() {
        if (sqlSessionUtils == null) {
            /*在Java jvm 实例化对象有4个步骤,
            *为了避免这种情况(当走到第一个步骤时,而另外的线程又开始实例化对象)产生,
            * 保证了永远只有一个这样的类*/
            synchronized (SqlSessionUtils.class){
                if (sqlSessionUtils == null) {
                    sqlSessionUtils = new SqlSessionUtils();
                }
            }
        }
        return sqlSessionUtils;
    }
}

  1. orm:把数据库里面的对象转化成一个对象 ↩︎

  2. 每增加一个实体类,若对其进行相应的操作,那么就要创建一个接口,一个与其对应的xml文件 ↩︎

  3. 也就是为了打印并引入log4j,所以导包后完全可忽略 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值