Mybatis

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

Mybatis中helloworld例子

helloworld例子:
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號(hào): 73203
(目錄結(jié)構(gòu)和需要導(dǎo)的包都見(jiàn)圖)















做一個(gè)普通的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可以配置適應(yīng)多種環(huán)境。例如:開(kāi)發(fā),測(cè)試和生產(chǎn)環(huán)境需要不同的配置;隨你怎么命名,只要保證默認(rèn)環(huán)境ID要匹配其中一個(gè)環(huán)境ID。
<transactionManager type="JDBC"/>中可設(shè)兩值:JDBC或MANAFED來(lái)說(shuō)明事務(wù)模型。二者的不同之處在于:前者是直接使用JDK提供的JDBC來(lái)管理事務(wù)的各個(gè)環(huán)節(jié):提交、回滾、關(guān)閉等操作,而后者交由容器來(lái)管理事務(wù)的整個(gè)生命周期(比如 Spring 或 JEE 應(yīng)用服務(wù)器的上下文),當(dāng)有事務(wù)的實(shí)驗(yàn)時(shí),同學(xué)們可看到他們的區(qū)別。本例看不出二者的區(qū)別。


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;
    }
}


運(yùn)行結(jié)果是:

id:1
name:張三
age:13