天天看点

Mybatis学习(一)Mybatis学习一、简介二、第一个Mybatis程序三、增删改查(CRUD)

Mybatis学习

环境:

  • JDK1.8
  • MySQL8.0
  • Maven3.6.3
  • IDEA

回顾:

  • JDBC
  • MySQL
  • Java基础
  • Maven
  • JUnit(单元测试)

SSM框架:包含配置文件的。最好的方式:看官网文档 M:Mbatis

一、简介

1.1什么是Mybatis

  • MyBatis 是一款优秀的持久层框架
  • 它支持自定义 SQL、存储过程以及高级映射。
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

如何获取Mybatis?

  • Maven仓库
Mybatis的jar包依赖
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>

           
  • Github:https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.6
  • 中文文档:https://mybatis.org/mybatis-3/zh/getting-started.html

1.2什么是持久化

数据持久化

  • 将程序的数据在存储状态和瞬时状态(存储在内存中 )转化的过程
  • 内存:断电即失
  • 数据库持久化(jdbc),io文件持久化

为什么需要持久化?

由于内存的断电即失特性,有些数据必须进行持久化。

1.3持久层

DAO层,Service层,Controller层

  • 完成数据持久化的代码块
  • 层界限分明

1.4为什么需要Mybatis?

  • 方便
  • 传统的JDBC代码太复杂。简化。框架。自动化
  • 帮助客户端程序员将数据持久化入数据库

特点:

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
  • 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的ORM字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态sql

二、第一个Mybatis程序

思路:搭建环境–>导入Mybatis–>编写需求代码–>测试需求代码

2.1搭建环境

1.搭建数据库

CREATE DATABASE mybatis
USE mybatis
CREATE TABLE `user`(
	`id` INT NOT NULL,
	`name` VARCHAR(30) DEFAULT NULL,
	`pwd` VARCHAR(30) DEFAULT NULL,
	PRIMARY KEY (`id`)

)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

INSERT INTO `user` (`id`,`name`,`pwd`) VALUES
(1,'zhangsan','123456'),
(2,'wangwu','654321'),
(3,'zhaoliu','112233');
           

2.创建maven父子项目工程,导入需要使用的依赖

  • mysql驱动
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.22</version>
    <scope>runtime</scope>
</dependency>
           
  • mybatis依赖
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>
           
  • junit依赖
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
           

2.2创建一个模块

1.编写mybatis核心配置文件

<?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.cj.jdbc.Driver"/>	/*MySQL8.0版本使用该驱动*/
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=UTC"/>	/*MySQL8.0版本需要设置时区,并且useSSL=false*/
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>
           

2.编写mybatis工具类

  • 编写pojo实体类
public class User {
    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    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;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
           
  • 编写DAO接口(也即Mapper)接口
public interface UserDao {
    List<User> getUserList();
}
           

此DAO接口通过namespace去绑定对应的DAO接口,使用全限定名去绑定

接口实现类由原来的UserDaoImp转变为一个Mapper配置文件

<?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">
<!--namespace这个命名空间写需要映射的接口类的全限定名-->
<mapper namespace="com.amazing.dao.UserDao">
<!--resultType(或resultMap)写DAO接口中的某个方法返回的泛型的全限定名-->
    <select id="getUserList" resultType="com.amazing.pojo.User">
    select * from mybatis.user
  </select>
</mapper>
           

注意在Maven中的约定大于配置,避免资源无法导出

<build>
    <!--在build中配置resources,来防止我们资源导出失败的问题-->
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>
           

可能遇到的问题:

  • 配置文件没有注册
  • 绑定接口错误
  • 方法名不对
  • 返回类型不对
  • Maven导出资源问题
  • 在xml中不要有中文注释

注意点:

namespace:绑定接口,使用完全限定名

标签中的id:绑定接口中的方法

resultType:绑定实体类,使用完全限定名

标签内容:写具体的语句

一定要关闭连接。

测试:

public void test(){
    //1.获得SqlSession对象
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    try{
        //2.通过getMapper()方法获得user数据
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> userList = mapper.getUserList();
        for (User u :userList) {
            System.out.println(u);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    finally {
        sqlSession.close();
    }

}
           

三、增删改查(CRUD)

3.1namespace

namespace中的包名要和Dao/Mapper接口保持一致

3.2select

选择,查询语句

  • id:对应namespace中的方法名
  • resultType:sql语句执行的返回值
  • parameterType:参数的类型

3.3select

<select id="getUserId" resultType="com.amazing.pojo.User" parameterType="int">
    select * from mybatis.user where id = #{id}
</select>
           
@Test
public void Test1(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.getUserId(1);
    System.out.println(user);
    sqlSession.close();
}
           

3.4insert

<insert id="addUser" parameterType="com.amazing.pojo.User">
    insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd})
</insert>
           
@Test
public void Test2(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int i = mapper.addUser(new User(4, "wangwu", "123654"));
    if (i>0){
        System.out.println("插入成功!");
    }
    sqlSession.commit();
    sqlSession.close();
}
           

3.5Update

<update id="updateUser" parameterType="com.amazing.pojo.User">
    update mybatis.user set name(数据库中的字段名) = #{name},pwd = #{pwd} where id = #{id};
</update>
           
@Test
public void Test3(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int i = mapper.updateUser(new User(4, "lisi", "456852"));
    sqlSession.commit();
    sqlSession.close();
}
           

3.6Delete

<delete id="deleteUser" parameterType="int">
    delete from mybatis.user where id=#{id}
</delete>
           
@Test
public void Test4(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int i = mapper.deleteUser(4);
    sqlSession.commit();
    sqlSession.close();
}
           

3.7Map

如果实体类或数据库中的表,字段或者参数过多,可以考虑使用Map!

<update id="updateUser2" parameterType="map">
    update mybatis.user set name=#{userName},pwd=#{userPassword} where id=#{userId}
</update>
           
@Test
public void Test5(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("userId",4);
    map.put("userName","zhaoliu");
    map.put("userPassword","125463");
    int i = mapper.updateUser2(map);
    sqlSession.commit();
    sqlSession.close();
}
           

通过map传递参数,直接在sql中取出key值 parameterType=“map”

对象传递参数时,直接在sql中取出对象的属性 parameterType=“Object”

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

多个参数用map或者注解

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

3.8模糊查询

1.java代码执行模糊查询的时候,传递参数需要使用通配符(%),防止SQL注入

2.在SQL拼接的过程中,使用通配符

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

每个Mapper.xml文件都必须在mybatis-config.xml文件中注册