在自己的代码中使用MyBatis带来的方便有2种,第一种是使用注解,第二者是使用XML配置,个人认为XML是相对比较好的。
使用MyBatis可以在官方下载MyBatis.zip,解压后是需要把MyBatis.jar还有lib里的依赖Jar包拷到工作空间。
根据官方文档介绍,我们需要为MyBatis应用构建一个MyBatis.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>
<properties resource="database.properties"></properties>
<settings>
<setting name="logImpl" value="LOG4J"/>
<setting name="lazyLoadingEnabled" value="true"/><!-- 懒加载 -->
<setting name="useGeneratedKeys" value="true"/><!-- 是否自动生成主键 -->
</settings>
<typeAliases>
<typeAlias type="model.User" alias="user"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="c3p0.c3p0DataSource">
<property name="driverClass" value="${driver}"/>
<property name="jdbcUrl" value="${url}"/>
<property name="user" value="${username}"/>
<property name="password" value="${password}"/>
<property name = "initialPoolSize" value = "3" />
<property name = "maxPoolSize" value = "10" />
<property name = "minPoolSize" value = "3" />
<property name = "acquireIncrement" value = "5" />
</dataSource>
</environment>
</environments>
<mappers>
<package name="mapper"/>
</mappers>
</configuration>
至于每个属性是什么意思就不介绍了,官方文档写得很清楚。
以下是我的目录结构
MyBatis有几个重要的对象SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession,Mapper
第一个是用来加载工厂类的,第二个是工厂类,第三个是会话,第四个是配置映射
他们直接大概联系是这样的,我用草图画了出来,如下:
Mapper大概就是需要我们创建一个XML文件,里面写着SQL语句和一些映射关系,然后有一个接口和它相对应,方法名对应xml文件SQL定义的ID。以下有DEMO代码
还有一个值得一提的是他们的生命周期
说到一个应用则需要了解它的生命周期,才可以更好的使用它。
mybatis里讨论生命周期,无非就是SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession,Mapper
SqlSessionFactoryBuilder就是为了加载SqlSessionFactory,前者加载完配置,发挥它的作用后,即可以直接回收了,因为后面几乎不会使用它了。
SqlSessionFactory,创建SqlSession的工厂,它应该伴随着整个应用的开始和结束,因为我们需要它创建类似于Connection的SqlSession。值得一提的是,SqlSessionFactory最好是单例的,因为如果不断地创建SqlSessionFactory会耗费资源占内存。
SqlSession,相当于Connection,Mapper结合使用可以达到对数据库进行操作的目的,但是最好让其二者成为“一次性”,用完就关掉(也可以说是被连接池收回)。
package Util;
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;
//设置单例模式
public class Util {
private static SqlSessionFactory sqlSessionFactory= null;
private static Class clazz = Util.class;
//私有化构造器防止创建多个对象
private Util(){}
private static void init(){
//开启同步防止多线程多次创建
synchronized (clazz) {
if(sqlSessionFactory==null){
String resource = "myBatis.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
}
}
public static SqlSessionFactory getSqlSessionFactory(){
if(sqlSessionFactory==null) init();
return sqlSessionFactory;
}
}
package model;
public class User {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
}
}
package mapper;
import org.apache.ibatis.annotations.Param;
import model.User;
public interface userMapper {
//从数据库获取一个User
User selectOne(@Param("id") int id);
}
package test;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import Util.Util;
import mapper.userMapper;
import model.User;
public class Main {
public static void main(String[] args) {
SqlSessionFactory sqlSessionFactory = Util.getSqlSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
try {
userMapper usermapper = session.getMapper(userMapper.class);
User user = usermapper.selectOne(1);
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}finally{
if(session!=null)
session.close();
}
}
}
<?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="mapper.userMapper">
<select id="selectOne" resultType="user">
select id,user_user as username,user_password as password
from user
where id = #{id}
</select>
</mapper>