结构:

image.png
dao类:底层接口定义方法
entity类:实体类对应数据库表
test类:测试类
resources:配置文件
UserMapper.xml:配置数据源和xml映射文件等
db.properties:配置数据库的驱动,url,账号,密码等
mybatis.xml:映射实体类和数据表,定义查询语句

架包:

  1. <dependencies>
  2. <!--mybatis架包-->
  3. <dependency>
  4. <groupId>org.mybatis</groupId>
  5. <artifactId>mybatis</artifactId>
  6. <version>3.5.2</version>
  7. </dependency>
  8. <!--MySQL架包-->
  9. <dependency>
  10. <groupId>mysql</groupId>
  11. <artifactId>mysql-connector-java</artifactId>
  12. <version>8.0.25</version>
  13. </dependency>
  14. <!--该架包能将任何键值对转换为JSON-->
  15. <dependency>
  16. <groupId>com.alibaba</groupId>
  17. <artifactId>fastjson</artifactId>
  18. <version>1.2.75</version>
  19. </dependency>
  20. <!--引用该架包能使用注解-->
  21. <dependency>
  22. <groupId>junit</groupId>
  23. <artifactId>junit</artifactId>
  24. <version>4.13.2</version>
  25. </dependency>
  26. <!--分页插件-->
  27. <dependency>
  28. <groupId>com.github.pagehelper</groupId>
  29. <artifactId>pagehelper</artifactId>
  30. <version>5.1.8</version>
  31. </dependency>

mybatis.xml

  1. <!--头部写死-->
  2. <?xml version="1.0" encoding="UTF-8" ?>
  3. <!DOCTYPE configuration
  4. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  5. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  6. <configuration>
  7. <!--引入数据库配置文件-->
  8. <properties resource="db.properties"/>
  9. <!--配置输出日志-->
  10. <settings>
  11. <setting name="logImpl" value="STDOUT_LOGGING"/>
  12. </settings>
  13. <!--配置数据源-->
  14. <environments default="dev">
  15. <!--default:指定生效的数据源-->
  16. <environment id="dev">
  17. <transactionManager type="JDBC"></transactionManager>
  18. <dataSource type="POOLED">
  19. <property name="driver" value="${deiverClass}"/>
  20. <property name="url" value="${url}"/>
  21. <property name="username" value="${user}"/>
  22. <property name="password" value="${password}"/>
  23. </dataSource>
  24. </environment>
  25. </environments>
  26. <!--xml映射文件-->
  27. <mappers>
  28. <mapper resource="mapper/UserMapper.xml"></mapper>
  29. </mappers>
  30. </configuration>

UserMapper.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="dao.UserDao">
    <!--手动映射实体类和数据库表-->
    <resultMap id="resultmap" type="entity.User">
        <result property="name" column="username"></result>
    </resultMap>
    <!--id:接口里面定义的方法 resultType:结果的类型-->
    <!--resultMap:自定义 resultType:默认-->
    <!--全查询-->
    <select id="findAll" resultMap="resultmap">
        select * from users
    </select>
    <!--根据id查询-->
    <select id="findByid" resultMap="resultmap">
        select * from users where id=#{一个参数随便写}
    </select>
    <!--添加-->
    <insert id="add">
        insert  into users values (#{id},#{name},#{age},#{address})
    </insert>
    <!--修改-->
    <update id="update">
        update users set username=#{name} where id=#{id}
    </update>
    <!--删除-->
    <delete id="delete">
        delete from users where id=#{一个参数随便写}
    </delete>
</mapper>

db.properties

deiverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
user=root
password=root

UserDao接口

public interface UserDao {
     List<User> findAll();
     User findByid (Integer id );
     void add (User user);
     void delete(Integer id);
     void update(User user);
}

测试类

package test;

import com.alibaba.fastjson.JSON;
import dao.UserDao;
import entity.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.Before;
import org.junit.Test;

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

public class MyTest {
    SqlSessionFactory factory=null;
    //使用注解前必须先引入架包
    @Before
    public void init(){
        try {
            InputStream is= Resources.getResourceAsStream("mybatis.xml");
            //创建SqlSessionFactory
            factory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Test
    public  void test1() {
            //获取sqlsession
            SqlSession session=factory.openSession();
            //获取接口实例
            UserDao userDao=session.getMapper(UserDao.class);
            List<User> all = userDao.findAll();
            System.out.println(JSON.toJSONString(all));
    }
    @Test
    public  void test2() {
        //获取sqlsession
        SqlSession session=factory.openSession();
        //获取接口实例
        UserDao userDao=session.getMapper(UserDao.class);
        User byid = userDao.findByid(4);
        System.out.println(JSON.toJSONString(byid));
    }
    @Test
    public  void test3() {
        //获取sqlsession
        SqlSession session=factory.openSession(true);
        //获取接口实例
        UserDao userDao=session.getMapper(UserDao.class);
        User user=new User(4,"小名",23,"北京");
        userDao.add(user);
        //手动提交事务,如果factory.openSession(true)则不用手动提交
        /*session.commit();*/
    }
    @Test
    public  void test4() {
        //获取sqlsession
        SqlSession session=factory.openSession(true);
        //获取接口实例
        UserDao userDao=session.getMapper(UserDao.class);
        User user=new User();
        user.setName("lis");
        user.setId(1);
        userDao.update(user);
        //手动提交事务,如果factory.openSession(true)则不用手动提交
        /*session.commit();*/
    }
    @Test
    public  void test5() {
        //获取sqlsession
        SqlSession session=factory.openSession(true);
        //获取接口实例
        UserDao userDao=session.getMapper(UserDao.class);

        userDao.delete(3);
        //手动提交事务,如果factory.openSession(true)则不用手动提交
        /*session.commit();*/
    }
}

user实体类

package entity;
public class User {
    private Integer id;
    private String name;
    private  Integer age;
    private  String address;

    public User() {
    }

    public User(Integer id, String name, Integer age, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

自定义工厂对象

如果项目中有属性在数据库中没有对应的实体,则需要手动映射
1.新建自定义工厂对象
2.配置自定义工厂对象mybatis.xml

factory.MyFactory

package factory;

import entity.User;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;

/**
 * @author Huang_X 2021/10/29 10:02
 * @version v1.0
 * 自定义工厂对象
 */
public class MyFactory extends DefaultObjectFactory {
    @Override
    public <T> T create(Class<T> type) {
        System.out.println("进入了自定义的工厂对象");
        if (type.equals(User.class)){
            //super.cerate(type):表示调用User类的无参构造创建对象
            User user= (User) super.create(type);
            user.setPassword("1234");
            return (T) user;
        }
        return super.create(type);
    }
}

mybatis.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>
    <!--引入数据库配置文件-->
    <properties resource="db.properties"/>

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <typeAliases >
        <typeAlias type="entity.User" alias="user"/>
    </typeAliases>

 <!--=========================================================-->   
    <!--配置自定义工厂对象-->
    <objectFactory type="factory.MyFactory"></objectFactory>
  <!--=========================================================-->  
    <!--拦截器插件-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <property name="page" value="mysql"/>
        </plugin>
    </plugins>
    <!--配置数据源-->
    <environments default="dev">

        <!--default:指定生效的数据源-->

        <environment id="dev">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${deiverClass}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${user}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--xml映射文件-->
<mappers>
    <mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>

分页插件

1.导入架包
2.配置拦截器插件
3.设置分页的页数和每页条数

拦截器插件mybatis.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>
    <!--引入数据库配置文件-->
    <properties resource="db.properties"/>

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <typeAliases >
        <typeAlias type="entity.User" alias="user"/>
    </typeAliases>
    <!--配置自定义工厂对象-->
    <objectFactory type="factory.MyFactory"></objectFactory>
    <!--========================================================================================-->
    <!--拦截器插件-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <property name="page" value="mysql"/>
        </plugin>
    </plugins>
    <!--========================================================================================-->
    <!--配置数据源-->
    <environments default="dev">

        <!--default:指定生效的数据源-->

        <environment id="dev">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${deiverClass}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${user}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--xml映射文件-->
<mappers>
    <mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>

test测试类

 @Test
    public  void test1() {
            //获取sqlsession
            SqlSession session=factory.openSession();
            //获取接口实例
            UserDao userDao=session.getMapper(UserDao.class);
             PageHelper.startPage(1,3);//设置查看页数和每页记录条数
            Page<User> all = userDao.findAll();
            System.out.println(JSON.toJSONString(all));
    }

带条件分页

修改SQL语句

 <!--全查询-->
    <select id="findAll" resultMap="resultmap">
        select * from users where username like concat("%",#{name},"%")
    </select>

传值

 @Test
    public  void test1() {
            //获取sqlsession
            SqlSession session=factory.openSession();
            //获取接口实例
            UserDao userDao=session.getMapper(UserDao.class);
             PageHelper.startPage(1,2);
            Page<User> all = userDao.findAll("小名");
            System.out.println(JSON.toJSONString(all));
    }