Mybatis

馬克-to-win:為什么現在大量的公司傾向于用Mabatis,而不用hibernate?我認為很重要一點的原因是Mabatis能自動生成類文件和配置文件,節省了大量的工作量。當然還有很多其他原因。
但底下援引網上一些意見關于mybatis的缺點,技術總監選型做項目時一定要慎重。mybatis緩存使用不當,容易產生臟數據。mybatis的sql寫在xml里,可讀性很低,調試也非常困難,也非常受限,無法像jdbc那樣在代碼里根據邏輯實現復雜動態sql拼接。mybatis不如直接用spring提供的jdbc簡單框架(Template),同樣支持對象映射。

Mybatis中helloworld例子

helloworld例子:
馬克- to-win:馬克 java社區:防盜版實名手機尾號: 73203
(目錄結構和需要導的包都見圖)















做一個普通的java project:




例 1.1

package com;
public class Register  {
    public String toString() {
        return "id:"+id+"\nname:"+name+"\nage:"+age;
    }
    private Integer id;
    private String name;
    private Integer age;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name ;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}






package com.mapper;
import com.Register;
public interface RegisterMapper {
    Register selectByPrimaryKey(Integer id);
}



RegisterMapper.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="com.mapper.RegisterMapper">
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultType="com.Register">
    select Id, Name, Age from register
    where Id = #{id}
  </select>
</mapper>




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>
    <environments default="myEnv"> 
       <environment id="myEnv"> 
           <transactionManager type="jdbc"/> 
           <dataSource type="POOLED"> 
              <property name="driver" value="com.mysql.jdbc.Driver"/> 
              <property name="url" value="jdbc:mysql://localhost:3306/test"/> 
              <property name="username" value="root"/> 
              <property name="password" value="1234"/> 
           </dataSource> 
       </environment> 
    </environments>
    <mappers>
        <mapper resource="com/mapper/RegisterMapper.xml" />
    </mappers>
</configuration>




Mybatis可以配置適應多種環境。例如:開發,測試和生產環境需要不同的配置;隨你怎么命名,只要保證默認環境ID要匹配其中一個環境ID。
<transactionManager type="JDBC"/>中可設兩值:JDBC或MANAFED來說明事務模型。二者的不同之處在于:前者是直接使用JDK提供的JDBC來管理事務的各個環節:提交、回滾、關閉等操作,而后者交由容器來管理事務的整個生命周期(比如 Spring 或 JEE 應用服務器的上下文),當有事務的實驗時,同學們可看到他們的區別。本例看不出二者的區別。


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;
import com.Register;
import com.mapper.RegisterMapper;
public class TestMark_to_win {
    private SqlSession sqlSession = null;
    private RegisterMapper registerMapper = null;

    public static void main(String[] args) {
        TestMark_to_win tmw = new TestMark_to_win();
        tmw.processData();
    }

    public void processData() {
        sqlSession = getSession();
        registerMapper = sqlSession.getMapper(RegisterMapper.class);
        dataSelect();
        if (null != sqlSession) {
            sqlSession.commit();
            sqlSession.close();
        }
    }

    private void dataSelect() {
        Register register = registerMapper.selectByPrimaryKey(1);
        System.out.println(register.toString());
    }

    private SqlSession getSession() {
        try {
            InputStream is = Resources
                    .getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                    .build(is);
            return sqlSessionFactory.openSession();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}


運行結果是:

id:1
name:張三
age:13