前言

工作这么多年,ORM框架一直选择Mybatis框架。 Mybatis的使用方式也一直在变,总体来说是越来越简单。写篇文章对各使用方式做个总结...

正文

一、Mybatis典型用法

1. 正常执行流程

♦  配置文件 - 全局配置信息和映射文件信息。全局配置信息包括:数据库配置和事务配置。映射文件就是SQL相关的

♦  Mybatis读取配置文件生成SqlSessionFactory,即回话工厂

♦  获取SqlSession, 做CRUD操作。但真正做这个事情的是底层的executor。

♦  Executor执行器把SQL分装到MappedStatement对象中。该对象包括:SQL, 输入参数映射信息和输出结果映射信息。

2. 案例

2.1 建表

CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) ,
`password` varchar(20) ,
`age` int(11) ,
PRIMARY KEY (`id`)
)

2.2 全局配置文件

<?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://localhost:3307/book"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/User.xml"/>
</mappers>
</configuration>

2.3 mapper.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="user">
<select id="findUserById" parameterType="int" resultType="com.mybatis.User">
select * from user where id = #{id}
</select>
<select id="findUserAll" resultType="com.mybatis.User">
select * from user
</select>
<insert id="insertUser" parameterType="com.mybatis.User">
insert into user(username,password,age) values(#{username},#{password},#{age})
</insert>
<delete id="deleteUserById" parameterType="int">
delete from user where id=#{id}
</delete>
<update id="updateUserPassword" parameterType="com.mybatis.User">
update user set password=#{password} where id=#{id}
</update>
</mapper>

2.4 Dao 接口

package com.mybatis.dao;

import com.mybatis.User;

import java.util.List;

public interface UserDao {
public User findUserById(int id) throws Exception ;
public List<User> findAllUsers() throws Exception;
public void insertUser(User user) throws Exception;
public void deleteUserById(int id) throws Exception;
public void updateUserPassword(User user) throws Exception;
}

2.5 DaoImpl

package com.mybatis.dao.impl;

import com.mybatis.User;
import com.mybatis.dao.UserDao; 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 java.io.IOException;
import java.io.InputStream;
import java.util.List; public class UserDaoImpl implements UserDao {
private static SqlSessionFactory factory = null;
static {
String resource = "mybatis/SqlMapConfig.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
factory = new SqlSessionFactoryBuilder().build(inputStream);
} public static SqlSession getSession(){
return factory.openSession();
} @Override
public User findUserById(final int id) throws Exception {
return getSession().selectOne("user.findUserById",id);
} @Override
public List<User> findAllUsers() throws Exception {
return null;
} @Override
public void insertUser(final User user) throws Exception { } @Override
public void deleteUserById(final int id) throws Exception { } @Override
public void updateUserPassword(final User user) throws Exception { }
}

2.6 User类

package com.mybatis;

import lombok.Data;

@Data
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
}

2.7 测试类

package com.mybatis.dao;

import com.mybatis.User;
import com.mybatis.dao.impl.UserDaoImpl; import org.junit.Test; public class UserDaoTest {
@Test
public void testFindUserById() throws Exception{
UserDao userDao = new UserDaoImpl();
User user = userDao.findUserById(7);
System.out.println(user);
}
}

二、Mapper代理开发方式

Mapper代理的开发方式,我们只需要编写mapper接口,不需要再Dao类,MyBatis会为我们生成代理类。代理开发方式应当遵循以下条件:

♦  mapper接口的全限定名要和mapper映射文件的namespace的值相同。

♦  mapper接口的方法名称要和mapper映射文件中的statement的id相同。

♦  mapper接口的方法参数只能有一个,且类型要和mapper映射文件中statement的parameterType的值保持一致。

♦  mapper接口的返回值类型要和mapper映射文件中statement的resultType值或resultMap中的type值保持一致。

案例:

1. 建表 同2.1

2. 全局配置 同2.2

3. mapper.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.mybatis2.dao.UserDao">
<select id="findUserById" parameterType="int" resultType="com.mybatis2.User">
select * from user where id = #{id}
</select> <select id="findUserAll" resultType="com.mybatis2.User"> select * from user
</select>
<insert id="insertUser" parameterType="com.mybatis.User">
insert into user(username,password,age) values(#{username},#{password},#{age})
</insert>
<delete id="deleteUserById" parameterType="int">
delete from user where id=#{id}
</delete>
<update id="updateUserPassword" parameterType="com.mybatis.User">
update user set password=#{password} where id=#{id}
</update>
</mapper>

4.mapper类:类名无所谓,用*Dao或者*Mapper都可以

package com.mybatis2.dao;

import com.mybatis2.User;

import java.util.List;

public interface UserDao {
public User findUserById(int id) throws Exception ;
public List<User> findUserAll() throws Exception;
public void insertUser(User user) throws Exception;
public void deleteUserById(int id) throws Exception;
public void updateUserPassword(User user) throws Exception;
}

5. User类同2.5

6. 测试类

package com.mybatis.dao;

import com.mybatis2.dao.UserDao;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
import org.junit.Test; import java.io.IOException;
import java.io.InputStream; public class UserDaoTest2 {
private static SqlSessionFactory factory = null;
@BeforeClass
public static void init(){
String resource = "mybatis/SqlMapConfig.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception{
UserDao mapp = factory.openSession().getMapper(UserDao.class);
System.out.println(mapp.findUserById(7));
}
}

  

三、与Spring框架的集成

相关背景,使用方式官方文档已经很详细了。参考官方文档 -  http://www.mybatis.org/spring/

Mybatis 不同使用方式的更多相关文章

  1. oracle行转列、列转行、连续日期数字实现方式及mybatis下实现方式

    转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9977591.html 九月份复习,十月份考试,十月底一直没法收心,赶在十一初 由于不可抗拒的原因又不得不重新找 ...

  2. SpringBoot入门教程(四)MyBatis generator 注解方式和xml方式

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

  3. mybatis入参方式和缓冲

    1.mybatis入参方式 @Param注解参数(注解) 封装成对象入参 public int updatePassword(@Param("id")int id,@Param(& ...

  4. MyBatis简单使用方式总结

    MyBatis简单使用方式总结 三个部分来理解: 1.对MyBatis的配置部分 2.实体类与映射文件部分 3.使用部分 对MyBatis的配置部分: 1.配置用log4J显式日志 2.导入包的别名 ...

  5. MyBatis通过注解方式批量添加、修改、删除

    唯能极于情,故能极于剑 注: 本文转载于:CodeCow · 程序牛 的个人博客:http://www.codecow.cn/ 一.数据库实体DO public class User implemen ...

  6. Java Mybatis 传参方式

    一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...

  7. mybatis之注解方式实现

    * 使用mybatis举例,使用注解方式实现* 不需要针对UserMapperI接口去编写具体的实现类代码,这个具体的实现类由MyBatis帮我们动态构建出来,我们只需要直接拿来使用即可.* 1.导入 ...

  8. 关于整合spring+mybatis 第二种方式

    和第一种方式一样的步骤,不过bean.xml中有些许差异 <!-- 配置sqlSessionFactory --> <bean id="sqlSessionFactory& ...

  9. mybatis通过插件方式实现读写分离

    原理:通过自定义mybatis插件,拦截Executor的update和query方法,检查sql中有select就用读的库,其它的用写的库(如果有调用存储过程就另当别论了) @Intercepts( ...

随机推荐

  1. 引导修复软件boot-repair

    因为经常需要安装双系统win10+ubuntu,平时按照先win10,在ubuntu的顺序,是非常顺利的,grub非常智能也非常友好的帮助你双启动这2个系统. 但是,难免会有意外,比如,win10有了 ...

  2. Hexo NexT 博客与Github page 关联指南

    上篇文章 Hexo 博客框架NexT主题搭建指南 我们已经在本地搭建好了Hexo博客框架NexT 主题的博客程序,但是这感觉还是远远不够. 我们还想把它部署到我们的Github上,让其他人可以看到我们 ...

  3. 使用tar解压文件提示gzip: stdin: not in gzip format错误

    使用tar解压文件提示gzip: stdin: not in gzip format错误 1. 问题描述 使用docker save xxxx > xxx.tar导出镜像,由于文件太大,需要sp ...

  4. golang:reflect反射

    因为之前一直以C++为主要开发语言,所以刚接触go语言中的reflect时感觉很懵逼,因此决定找资料彻底学习一下. 到底反射是什么? https://blog.golang.org/laws-of-r ...

  5. 在linux下用命令行编译 java的eclipse项目

    由于jdk的版本问题导致在windows上编译打包好的jar包放在linux服务器上运行的时候出现一点小异常,所以决定在linux上进行一次项目编译,这有两个选择1.在相同的linux环境下安装lin ...

  6. (原)关于i++和++i的小程序测试

    今天看到一个程序,于是用vs运行了一下,结果出乎我的意料: 代码: ; +(i++))+(+(i++)); i=; +(++i))+(+(++i)); i=; printf("x=%d,y= ...

  7. CentOS服务器ntpdate同步

    如有多台CentOS服务器运行相同的服务,且对时间准确性要求较高,那必须保证多台服务器时间统一. 最简单的就是每台服务器都用ntpdate同步同一台网络时间服务器的时间. 1.输入ntpdate ti ...

  8. GoLang之strings、buffers、bytes、binary包

    strings包 strings包的使用举例: package main import s "strings" import "fmt" var p = fmt ...

  9. [Converge] Training Neural Networks

    CS231n Winter 2016: Lecture 5: Neural Networks Part 2 CS231n Winter 2016: Lecture 6: Neural Networks ...

  10. redis最大缓存和回收策略