mybatis入门概述

Mybatis框架

1.入门

1.1简述mybatis

mybatis是一个持久成框架,简化了我们与数据库的交互。使我们只需要关注sql语句本身,而不需要花费精力取处理加载驱动、创建连接、创建statement等繁杂的过程。

1.2了解mybatis

  • mybatis通过xml或注解的方式将要执行的各种statement配置起来.
  • 通过对象和statement中的sql的动态参数进行映射生成最终的sql语句
  • mybatis框架执行sql并将结果映射为java对象并返回。
  • 是通过ORM思想实现了结果集的封装。

1.3回顾JDBC

  • 注册驱动
  • 获取数据库连接对象
  • 定义Mysql语句
  • 获取执行Mysql
  • 执行
  • 处理结果
  • 释放资源
import java.sql.*;

/**
 *添加一条记录
 */
public class JDBCdemo03 {

    public static void main(String[] args) {
        Connection conn =null;
        Statement statement=null;
        try {
            //注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //定义sql
            String sql = "insert into cat(name ,age ,id ) values ('汤姆',18,1003)";
            //获取数据库连接对象
            try {
                 conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/hello?serverTimezone=UTC", "root", "990801lxq");
                //获取sql执行对象
                statement = conn.createStatement();
                //执行sql
                int i = statement.executeUpdate(sql);
                if(i>0){
                    System.out.println("添加成功"+"/t"+"共有"+i+"语句受到影响");
                }else {
                    System.out.println("添加失败");
                }

            } catch (SQLException e) {
                e.printStackTrace();
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(statement !=null){
                try {
                    statement.cancel();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


1.4搭建环境

  • 创建表
CREATE TABLE `user`  (
  `id` int(20) NOT NULL,
  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `pwd` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '汤姆', '12354');
INSERT INTO `user` VALUES (2, '乔恩', '123');
INSERT INTO `user` VALUES (3, '张三', '123');
INSERT INTO `user` VALUES (5, '类鳄类', '12345');

  • 新建maven项目

  • 导入依赖

    • ​ 主要的依赖
    <!--        mysql依赖-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.6</version>
            </depe
    
    • 可以增加的依赖
    <!--        junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
            </dependency>
    
    <!--        log4j-->
            <!-- https://mvnrepository.com/artifact/log4j/log4j -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
    
    
    • 找不到配置文件的依赖
        <build>
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
            </resources>
        </build>
       
    
  • 配置环境mybatis-config.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核心配置文件-->
<configuration>
<!-- 	环境配置 环境可以有多套 default="环境id"-->
    <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:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="990801lxq"/>
            </dataSource>
        </environment>
    </environments>

</configuration>
  • 编写pojo
package cn.guoke.pojo;

import lombok.Data;

@Data
public class User {
    private int id;
    private String name;
    private String pwd;


}

这个是需要get set 方法的 为了省事使用了lombok

lombok的座标

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
            <scope>provided</scope>
        </dependency>

  • 编写UserMapper接口
package cn.guoke.dao;

import cn.guoke.pojo.User;

import java.util.List;

public interface UserMapper {
	
    //获取所有的user
    List<User> getUserList();
}

  • 编写对应的UserMapper.xml

    <?xml version="1.0" encoding="UTF8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.guoke.dao.UserMapper">
        <select id="getUserList" resultType="cn.guoke.pojo.User">
        select * from User where 1=1
      </select>
       
    </mapper>
    
    • namespace 对应UserMapper的接口
    • namespace对应接口中编写的方法、
    • resultType返回值类型
  • 在编写完UserMapper.xml后我们要在mybatis-config.xml对其经行映射

        <mappers>
            <mapper resource="cn/guoke/dao/UserMapper.xml"/>
        </mappers>
    

    有四种映射的方式:

    • resource:使用相对于类路径的资源引用
    • url:使用完全限定资源定位符(URL
    • class:使用映射器接口实现类的完全限定类名
    • name:将包内的映射器接口实现全部注册为映射器

其他用法及注意点

这样我们的环境就搭建完成了

2.CRUD

我们要使用mybatis需要一个SqlSessionFactory 实例。

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。

SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。

而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

2.1直接获取SqlSessionFactory

package cn.guoke.dao;


import cn.guoke.pojo.User;
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 org.junit.Test;

import java.io.InputStream;
import java.util.List;


public class UserMapperTest {

    @Test
    public void test01() throws Exception {
        /**
         * 1.读取配置文件
         * 2.创建SqlSessionFactory 工厂
         * 3.使用工厂产生SqlSession对象
         * 4.使用SqlSession创建Dao接口的代理对象
         * 5.使用代理对象执行方法
         * 6.释放资源
         */

        //1.
        InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
        //2.
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(input);
        //3.
        SqlSession sqlSession = factory.openSession();
        //4
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //5.
        List<User> userList = mapper.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }
        //6.
        sqlSession.close();
        input.close();


    }
}

2.2编写工具类

我们看到每次测试的时候我们都需要获取一个SqlSession

我们可以编写一个工具类,来方便测试

package cn.guoke.utils;

import cn.guoke.dao.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionException;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class SqlSessionUtils {
    private static SqlSessionFactory factory;
    static {

        try {
            InputStream  input = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            factory = builder.build(input);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static SqlSession getSqlSession(){
        return   factory.openSession();
    }

}

测试:

 @Test
    public void test2(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();

        for (User user : userList) {
            System.out.println(user);
        }

        sqlSession.close();

    }

2.3 CRUD使用xml实现

  • 在UserMapper中增加CRUD的方法
package cn.guoke.dao;

import cn.guoke.pojo.User;

import java.util.List;

public interface UserMapper {

    //获取所有的user
    List<User> getUserList();

    //根据ID查询用户
    User getUserID(int id);

    //增加一个用户
    int addUser(User user);

    //修改一个用户
    int intoUser(int id);

    //删除一个用户
    int delUser(int id);
}

  • 编写UserMapper.xml

    <?xml version="1.0" encoding="UTF8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.guoke.dao.UserMapper">
        <select id="getUserList" resultType="cn.guoke.pojo.User">
        select * from User where 1=1
      </select>
    
        <select id="getUserID" resultType="cn.guoke.pojo.User" parameterType="int">
            select  * from USER where id=#{id}
        </select>
    
        <insert id="addUser" parameterType="cn.guoke.pojo.User">
            insert into mybatis.user (id,name,pwd) value (#{id},#{name},#{pwd});
        </insert>
    
        <update id="intoUser" parameterType="cn.guoke.pojo.User">
            update user set name=#{name},pwd=#{pwd} where id=#{id};
        </update>
    
        <delete id="delUser" parameterType="int">
            delete from user where id = #{id}
        </delete>
    
    </mapper>
    
  • parameterType 传递参数的数据类型

    • #{id} 用来传递参数

2.4使用注解看配置

  • 配置mappers
    <mappers>
        <mapper class="guoke.dao.UserMapper"/>
    </mappers>
  • 使用注解
package guoke.dao;


import guoke.pojo.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface UserMapper {

    //获取所有的user
    @Select("select * from User")
    List<User> getUserList();
}

2.5模糊查询

  • 在接口中增加一个发法
    //模糊查询
    List<User> getUserByName(String name);

  • 测试
    public void test4(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userByName = mapper.getUserByName("%张%");
        for (User user : userByName) {
            System.out.println(user);
        }
        sqlSession.close();
    }

除去上述方法,含可以在xml中配置

    <select id="getUserByName" resultType="cn.guoke.pojo.User" parameterType="String">
        select * from USER where name like  '%${value}%'
    </select>

2.6使用聚合函数

和上述一样定义接口返回就可以了

3.mybatis参数

3.1parameterType

  • 传递简单类型
  • 传递pojo对象
  • 传递pojo包装对象

3.2resultType

  • 简单类型
  • pojo对象
  • pojo列表

3.3resultMap

    <resultMap id="UserMap" type="cn.guoke.pojo.User">
<!--        主键使用id-->
        <id property="user" column="id"></id>
<!--        其他字段-->
        <result property="username" column="name"/>
    </resultMap>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章