1、简介

1.1、什么是Mybatis

  • MyBatis 是一款优秀的持久层框架
  • 它支持自定义 SQL、存储过程以及高级映射。
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
  • MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。
  • 2013年11月迁移到Github。

如何获得Mybatis?

1.2、持久化

数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
  • 内存:断点即失
  • 数据库(Jdbc),io文件持久化
  • 生活:冷藏,罐头。

为什么需要持久化?

  • 有一些对象,不能让他丢弃。
  • 内存太贵

1.3、持久层

Dao层,Service层,Controller层….

  • 完成持久化工作的代码块
  • 层界限十分明显

1.4、为什么需要Mybatis?

  • 帮助程序员将数据存入到数据库中
  • 方便
  • 传统的JDBC代码太复杂了。简化。框架。自动化。
  • 不用Mybatis也可以,更容易上手。技术没有高低之分
  • 优点:
    • 简单易学
    • 灵活
    • 解除sql与程序代码的耦合
    • 提供映射标签,支持对象与数据库的orm字段关系映射。
    • 提供对象关系映射标签,支持对象关系组建维护。
    • 提供xml标签,支持编写动态sql。

最重要的一点:使用的人多!

2、第一个Mybatis程序

2.1、搭建环境

  1. <!--依赖-->
  2. <dependencies>
  3. <!--mysql驱动-->
  4. <dependency>
  5. <groupId>mysql</groupId>
  6. <artifactId>mysql-connector-java</artifactId>
  7. <version>5.1.47</version>
  8. </dependency>
  9. <!--mybatis-->
  10. <dependency>
  11. <groupId>org.mybatis</groupId>
  12. <artifactId>mybatis</artifactId>
  13. <version>3.5.2</version>
  14. </dependency>
  15. <!--junit-->
  16. <dependency>
  17. <groupId>junit</groupId>
  18. <artifactId>junit</artifactId>
  19. <version>4.11</version>
  20. <scope>test</scope>
  21. </dependency>
  22. </dependencies>

2.2、创建一个工具模板

  1. public class MybatisUtils {
  2. private static SqlSessionFactory sqlSessionFactory;
  3. static {
  4. try {
  5. // 使用Mybatis第一步:获取sqlSessionFactory对象
  6. String resource = "mybatis-config.xml";
  7. InputStream inputStream = Resources.getResourceAsStream(resource);
  8. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  9. } catch (IOException e) {
  10. e.printStackTrace();
  11. }
  12. }
  13. // 既然有了sqlSessionFactory,顾名思义,我们就可以从中获得SqlSession的实例了
  14. // SqlSession 完全包含了面向数据库执行SQL 命令所需要的所有方法。
  15. public static SqlSession getSqlSession(){
  16. return sqlSessionFactory.openSession();
  17. }
  18. }

2.3、编写代码

  • 实体类
    • 必须要有一个无参构造
    • 属性必须私有化
    • 必须有对应的get/set方法
  • Dao接口
  1. public interface UserMapper {
  2. // 查询所有用户
  3. List<User> getUserList();
  4. // 根据ID查询用户
  5. User getUserBtId(int id);
  6. // insert一个用户
  7. int addUser(User user);
  8. // 修改用户
  9. int updateUser(User user);
  10. // 修改用户
  11. int deleteUser(int id);
  12. }
  • 接口实现类由原来的UserDaoImpl转变为一个Mapper配置文件
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!--namespace=绑定一个对应的Dao/Mapper接口-->
  6. <mapper namespace="com.shuai.dao.UserMapper">
  7. <!--select查询语句-->
  8. <select id="getUserList" resultType="com.shuai.pojo.User">
  9. select * from mybatis.user
  10. </select>
  11. <select id="getUserBtId" parameterType="int" resultType="com.shuai.pojo.User">
  12. select * from mybatis.user where id = #{id}
  13. </select>
  14. <!--对象中的属性,可以直接取出来-->
  15. <insert id="addUser" parameterType="com.shuai.pojo.User">
  16. insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd});
  17. </insert>
  18. <update id="updateUser" parameterType="com.shuai.pojo.User">
  19. update mybatis.user set name=#{name},pwd=#{pwd} where id = #{id};
  20. </update>
  21. <delete id="deleteUser" parameterType="int">
  22. delete from mybatis.user where id = #{id};
  23. </delete>
  24. </mapper>

3、CRUD

1、namespace

namespace中的包名要和 Dao/mapper 接口的包名一致!

2、select

选择,查询语句;

  • id: 就是对应的namespace中的方法名
  • resultType: Sql语句执行的返回值!
  • parameterType: 参数类型!
  1. <!--select查询语句-->
  2. <select id="getUserList" resultType="com.shuai.pojo.User">
  3. select * from mybatis.user
  4. </select>
  5. <select id="getUserBtId" parameterType="int" resultType="com.shuai.pojo.User">
  6. select * from mybatis.user where id = #{id}
  7. </select>
  1. 编写接口
  2. 编写对应的mapper中的sql语句
  3. 测试

3、Insert

  1. <!--对象中的属性,可以直接取出来-->
  2. <insert id="addUser" parameterType="com.shuai.pojo.User">
  3. insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd});
  4. </insert>

4、update

  1. <update id="updateUser" parameterType="com.shuai.pojo.User">
  2. update mybatis.user set name=#{name},pwd=#{pwd} where id = #{id};
  3. </update>

5、Delete

  1. <delete id="deleteUser" parameterType="int">
  2. delete from mybatis.user where id = #{id};
  3. </delete>

6、万能Map

假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map!

  1. // 万能的Map
  2. int addUser2(Map<String,Object> map);
  1. <!--对象中的属性,可以直接取出来 , 传递map的key-->
  2. <insert id="addUser2" parameterType="map">
  3. insert into mybatis.user (id ,name,pwd) values (#{userid},#{username},#{passWord});
  4. </insert>

测试

  1. @Test
  2. public void addUser2(){
  3. SqlSession sqlSession = MybatisUtils.getSqlSession();
  4. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  5. Map<String, Object> map = new HashMap<String, Object>();
  6. map.put("userid",4);
  7. map.put("username","李帅");
  8. map.put("passWord","123456");
  9. mapper.addUser2(map);
  10. sqlSession.commit();
  11. sqlSession.close();
  12. }

Map传递参数,直接在sql中取出key即可! 【parameterType=”map”】

对象传递参数,直接在sql中取对象的属性即可! 【parameterType=”Object”】

只有一个基本类型的情况下,可直接在sql中取到!

多参数用Map,或者注解!

7、模糊查询

  1. Java代码执行的时候,传递通配符 % %
  1. List<User> userLike = mapper.getUserLike("%李%");

2.在sql拼接中使用通配符

  1. select * from user where name like "%"#{value}"%";