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