您的位置:首页 > 其它

mybatis3 简单入门

2014-07-07 17:12 253 查看
官网文档:http://mybatis.github.io/mybatis-3/zh/index.html

源码:https://github.com/mybatis/mybatis-3

maven依赖:

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.6</version>
</dependency>


不管使用哪种持久层框架都先得有POJO和DAO

package me.poplaris.mybatis.bean;

/**
* User: poplar
* Date: 14-7-4 下午5:56
*/
public class User {
private int id;
private String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}


package me.poplaris.mybatis.dao;

import me.poplaris.mybatis.bean.User;

/**
* User: poplar
* Date: 14-7-4 下午5:59
*/
public interface UserDao {
public User getUserId(int id);
}


建立好POJO和DAO后我们开始使用MyBatis

每 一 个 MyBatis 的 应 用 程 序 都 以 一 个 SqlSessionFactory 对 象 的 实 例 为 核 心 。 SqlSessionFactory 对 象 的 实 例 可 以 通 过 SqlSessionFactoryBuilder 对 象 来 获 得,我们先介绍使用XML来构建

@Test
public void buildUseXml() throws IOException {
//    String resource = "org/mybatis/example/mybatis-config.xml";
String resource = "mybatis-config.xml";
//从 XML 中构建 SqlSessionFactory
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//从 SqlSessionFactory 中获取 SqlSession
SqlSession session = sqlSessionFactory.openSession();
try {
User user = session.selectOne("me.poplaris.mybatis.dao.UserDao.getUserId",1);
} finally {
session.close();
}
}
一个简单的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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>

有时候你可能想从properties来读取数据源配置,而不是写死在XML中。在mybatis-config中添加properties配置

<properties resource="config.properties"></properties>
config.properties文件如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true
username=root
password=root


修改过后的mybatis-config:

<?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="config.properties"></properties>

<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>

</configuration>


执行buildUseXml测试,出现异常

java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for me.poplaris.mybatis.dao.UserDao.getUserId
这是因为Mapped中没有实现UserDao,在mybatis-config.xml中添加POJO别名和mappers配置

<?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="config.properties"></properties>

    <typeAliases>
        <typeAlias alias="User" type="me.poplaris.mybatis.bean.User"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mybatis/User.xml"/>
    </mappers>
</configuration>
并实现UserDao,新增XML配置文件User.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="me.poplaris.mybatis.dao.UserDao">
<select id="getUserId" parameterType="int" resultType="User">
select
*
from
`user`
where
id = #{id}
</select>
</mapper>
User.xml中mapper的namespace对应我们定义的DAO接口类UserDao,id为getUserId的select操作对应UserDao里的getUserId(int id)方法

再次执行buildUseXml测试,打印出了正常数据,一个简单的使用XML配置来读取数据成功实现。

在buildUseXml中

session.selectOne("me.poplaris.mybatis.dao.UserDao.getUserId",1);
因为我们在mapper中已经配置了这个namespace,所以这行代码有更简单安全的方式来代替

UserDao userDao = session.getMapper(UserDao.class);
User user = userDao.getUserId(1);
所以整个buildUseXml测试变成了这样:

  @Test
public void buildUseXml() throws IOException {
// String resource = "org/mybatis/example/mybatis-config.xml";
String resource = "mybatis-config.xml";
//从 XML 中构建 SqlSessionFactory
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//从 SqlSessionFactory 中获取 SqlSession
SqlSession session = sqlSessionFactory.openSession();
try {
// User user = session.selectOne("me.poplaris.mybatis.dao.UserDao.getUserId",1);
UserDao userDao = session.getMapper(UserDao.class); User user = userDao.getUserId(1);
System.out.println(user);
} finally {
session.close();
}
}


使用XML配置实现mybatis操作已经简单的介绍完毕,更多详细的XML配置,动态SQL等可以参看官方文档

下面介绍不依赖XML配置来实现mybatis操作,下面的测试方法是使用JAVA程序来创建一个简单的配置实例

  @Test
  public void buildUseAnno(){
    String url = "jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true";
    String userName = "root";
    String password = "root";
    //数据源
    DataSource dataSource = new MyDefaultDataSource(url,userName,password);
    //事务工厂
    TransactionFactory transactionFactory = new JdbcTransactionFactory();
    Environment environment = new Environment("development", transactionFactory, dataSource);
    Configuration configuration = new Configuration(environment);
    //绑定DAO mapper
    configuration.addMapper(UserDaoWithAnno.class);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
    SqlSession session = sqlSessionFactory.openSession();
    try {
      UserDaoWithAnno userDao = session.getMapper(UserDaoWithAnno.class);
      User user = userDao.getUserId(1);
      System.out.println(user);
      List<User> userList = userDao.getUsers();
      System.out.println(userList);
    } finally {
      session.close();
    }
  }
首先需要自己实现DataSource,MyDefaultDataSource核心的代码片段如下:

@Override
public Connection getConnection(String username, String password) throws SQLException {
return DriverManager.getConnection(url,username,password);
}


运行buildUseAnno测试,出现异常

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): me.poplaris.mybatis.dao.UserDaoWithAnno.getUserId
这是因为mapper绑定未完成,我们需要对具体的SQL操作做绑定

使用这种方式配置主要是添加映射类。

configuration.addMapper(UserDaoWithAnno.class);


映射类是
Java 类,这些类包含 SQL 映射语句的注解从而避免了XML文件的依赖

package me.poplaris.mybatis.dao;

import me.poplaris.mybatis.bean.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * User: poplar
 * Date: 14-7-4 下午5:59
 */
public interface UserDaoWithAnno {

  @Select("select * from user where id= #{id}")
  public User getUserId(int id);

  @Select("select * from user")
  public List<User> getUsers();
}
使用Select注解完成注册mapper,再次执行buildUseAnno测试,成功。

OK,简单的使用注解方式来完成mybatis操作也已经介绍完毕,更多的注解方案请参看官方文档,实例代码请点击这里
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: