mybatis3 简单入门

来源:互联网 发布:数据粒度举例 编辑:程序博客网 时间:2024/04/29 16:15

官网文档: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.Driverurl=jdbc:mysql://127.0.0.1:3306/test?autoReconnect=trueusername=rootpassword=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操作也已经介绍完毕,更多的注解方案请参看官方文档,实例代码请点击这里












0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 DNF账号给找回了怎么办 转转上被骗了200怎么办 7彩账号被锁定怎么办 猪不吃食没精神怎么办 cf手游签到没给怎么办 cf说停止运行了怎么办 cf端游永久禁赛怎么办 cf端游爆破怕死怎么办 王者荣耀累计扣分12分怎么办 去医院看病没带身份证怎么办 ps4星战2鬼服怎么办 冒险岛英雄五转怎么办 6儿童视力低常怎么办 腰干活累的酸痛怎么办 狗狗体力很差怎么办啊 脉差总是五十多怎么办 吃过敏药嗜睡乏力怎么办 写字紧张心跳的快手抖怎么办 怀孕食欲差没精神怎么办 爬个三楼就喘了怎么办 头被篮球砸了怎么办 打球手指肿了很久怎么办 客人吃饭跑单了怎么办 脑子总是记不住东西怎么办 穿的鞋有味道怎么办 生完孩子血糖高怎么办 生了孩子子宫大怎么办 生完孩子阴吹怎么办 怀孕初期感冒嗓子发炎怎么办 脑子转不过来弯怎么办 他说我道行不深怎么办 鞋子内测磨破了怎么办 老公拉肚子拉的很厉害怎么办 老公拉肚子拉得很厉害怎么办 和老公吵架很厉害怎么办 新鞋鞋底吱吱响怎么办 新鞋鞋底滑了怎么办 工作中同事不配合怎么办 做体力活一身疼怎么办 大脑左则中动脉血管狭窄?怎么办 儿童体质差免疫力差怎么办