DW-CHEN的Java点滴记录之MyBatis

MyBatis框架

MyBatis需要导入mybatis-3.2.8.jar包,下载地址:https://download.csdn.net/download/qq_42795277/12838279

  • 框架它是一款半成品软件,我们可以基于这个半成品软件继续开发来完成我们个性化的需求

  • MyBatis是一个非常好的基于Java持久层框架,它内部封装了JDBC,所有开发者只需要关注SQL语句本身,而不需要花费精力去处理加载驱动,创建连接,创建执行者等复杂的操纵

ORM思想

  • ORM(Object Relational Mapping):对象关系映射,指的是持久化数据和实体对象映射模式,为了解决面向对象与关系型数据库存在的互补匹配的现象技术。
映射规则
  • 数据库:类
  • 表字段:类属性
  • 表数据:对象

MyBatis相关API

Resources
  • org.apache.ibatis.io.Resources:加载资源的工具类
  • 核心方法
方法名说明
inputStream getResourceAsStrea(String fileName)通过类加载器返回指定资源的字节输入流
SqlSessionFactoryBuilder
  • org.apache.ibatis.session.SqlSessionFactoryBuilder:获取SqlSessionFactory工厂对象的功能类
  • 核心方法
方法名说明
SqlSessionFactory build(InputStream is)通过指定资源字节输入流获取SqlSession工厂对象
SqlSessionFactory
  • org.apache.ibatis.session.SqlSessionFactory:获取SqlSession构建者对象的工厂接口
  • 核心方法
方法名说明
SqlSession openSession()获取SqlSession构建者对象,并开启手动提交事务
SqlSession openSession(boolean autoCommit)获取SqlSession构建者对象,如果参数为true,则开启自动提交事务
SqlSession
  • org.apache.ibatis.session.SqlSession:构建者对象接口,由于执行SQL,管理事务,接口代理
方法名说明
List<E> selectList(String statement,Object paramter)执行查询语句,返回List集合
T selectOne(String statement,Object paramter)执行查询语句,返回结果对象
int insert(String statement,Object paramter)执行新增语句,返回影响行数
int update(String statement,Object paramter)执行修改语句,返回影响行数
int delete(String statement,Object paramter)执行删除语句,返回影响行数
void commit()提交事务
void rollback()回滚事务
T getMapper(Class<T> cls)获取指定接口的代理实现类对象
void close()释放资源

MyBatis映射配置文件

映射配置文件包含了数据和对象之间的映射关系以及要执行的SQL语句

  • <mapper>:核心根标签,namespace属性:名称空间
  • <select>:查询功能标签
  • <insert>:新增功能标签
  • <update>:修改功能标签
  • <delete>:删除功能标签,id属性:唯一标识,paramterType属性:指定参数映射的对象类型,resultType属性:指定结果映射的对象类型
  • SQL获取参数:#{属性名}

MyBatis核心配置文件

MyBatis核心配置文件包含了MyBatis最核心的设置和属性信息,如数据库连接,事务,连接池信息等

<configuration>:核心根标签
<properties>:引入数据库连接信息配置文件标签
<typeAliases>:起别名的标签
<environments>:配置数据库环境标签
<environment>:配置数据库信息标签
<transactionManager>:事务管理标签
<dataSource>:数据源标签
<property>:数据库连接信息标签
<mappers>:引入映射文件标签

LOG4J

在日常开发中,排查问题是难免需要输出MyBatis真正执行的SQL语句,参数,结果等信息,我们可以借助LOG4J的功能来实现执行信息的输出

代码

使用的数据
/*
SQLyog Ultimate v12.09 (64 bit)
MySQL - 5.5.40 : Database - test
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`test` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `test`;

/*Table structure for table `user` */

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

/*Data for the table `user` */

insert  into `user`(`id`,`name`,`age`) values (3,'小李',22),(11,'小莉',12),(12,'小李利',12),(13,'小行星',12),(14,'夏利',12);

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
实体类
package cn.cdw.example;

/**
 * @author DW-CHEN
 * 定义实体类,对应数据库表中的字段
 */
public class User {
    private Integer id;
    private String name;
    private Integer age;

    public User() {
    }

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

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
MyBatis映射文件
<?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="UserMapper">
    <select id="findAll" resultType="user">
        select * from user;
    </select>

    <select id="findById" resultType="user" parameterType="int">
        select * from user  where id = #{id};
    </select>

    <insert id="add" parameterType="cn.cdw.example.User">
        insert into user values (null ,#{name},#{age});
    </insert>

    <update id="update" parameterType="cn.cdw.example.User">
        update user set name = #{name},age = #{age} where id = #{id};
    </update>

    <delete id="delete" parameterType="java.lang.Integer">
        delete from user where id = #{id};
    </delete>
</mapper>
MyBatis核心配置文件
jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root
核心配置文件
<?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="jdbc.properties"/><!--引入jdbc连接数据库核心配置文件-->

    <settings>
        <setting name="logImpl" value="log4j"/><!--在MyBatis中配置核心配置文件-->
    </settings>

    <typeAliases>
        <!--<typeAlias type="cn.cdw.example.User" alias="user"/>--><!--在核心配置文件设置别名,我们就可以咋映射文件中使用别名了-->
        <package name="cn.cdw.example"/><!--如果需要定义包下多个类的别名,那么使用指定包即可,别名为类名的首字母小写-->
    </typeAliases>

    <environments default="environment1">
        <environment id="environment1"><!--配置环境变量-->
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers><!--引入映射文件-->
        <mapper resource="UserMapper.xml"></mapper>
    </mappers>
</configuration>
测试
package cn.cdw.example;

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.InputStream;
import java.util.List;

/**
 * @author DW-CHEN
 * 测试
 */
public class UserTest {
    public static void main(String[] args) throws Exception {
        findAll();//查询全部数据
        //findById();
        //add();
        //update();
        //delete();
    }

    //获取SqlSession对象通用方法
    public static SqlSession getSqlSession() throws Exception {
        InputStream resourceAsStream = Resources.getResourceAsStream("MyBatisConfig.xml");//读取核心配置文件MyBatisConfig.xml
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);//获取SqlSessionFactory工厂
        SqlSession sqlSession = sqlSessionFactory.openSession(true);//通过SqlSessionFactory工厂获取SqlSession对象

        resourceAsStream.close();
        return sqlSession;
    }

    //查询全部
    public static void findAll() throws Exception {
        SqlSession sqlSession = getSqlSession();
        List<User> user = sqlSession.selectList("UserMapper.findAll");

        for (User user1 : user) {
            System.out.println(user1.getId() + " " + user1.getName() + " "+ user1.getAge());
        }
        sqlSession.close();
    }

    //根据id查询
    public static void findById() throws Exception {
        SqlSession sqlSession = getSqlSession();
        User user = sqlSession.selectOne("UserMapper.findById", 2);
        System.out.println(user);
        sqlSession.close();
    }

    //添加
    public static void add() throws Exception{
        SqlSession sqlSession = getSqlSession();
        sqlSession.insert("UserMapper.add",new User(null,"小李利",12));
        sqlSession.close();
    }

    //修改
    public static void update() throws Exception{
        SqlSession sqlSession = getSqlSession();
        sqlSession.update("UserMapper.update",new User(11,"修改小溪",32));
        sqlSession.close();
    }

    //根据id删除
    public static void delete() throws Exception{
        SqlSession sqlSession = getSqlSession();
        sqlSession.delete("UserMapper.delete",1);
        sqlSession.close();
    }
}

MyBatis接口代理方式实现Dao层

接口代理方式可以让我们只编写接口即可,实现类对象由MyBatis生成

实现规则

  • 映射文件中的名称空间必须和Dao层接口的全类名相同
  • 映射文件中的增删改查标签的id必须和Dao层接口的方法名相同
  • 映射文件中的增删改查标签的parameterType属性必须和Dao层接口方法的参数相同
  • 映射文件中的增删改查标签的resultType属性必须和Dao层接口方法的返回值相同
  • 获取动态代理对象:SqlSession功能类的getMapper()方法
代码
使用的数据
/*
SQLyog Ultimate v12.09 (64 bit)
MySQL - 5.5.40 : Database - test
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`test` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `test`;

/*Table structure for table `user` */

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

/*Data for the table `user` */

insert  into `user`(`id`,`name`,`age`) values (3,'小李',22),(11,'小莉',12),(12,'小李利',12),(13,'小行星',12),(14,'夏利',12);

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
实体类
package cn.cdw.demo.pojo;

/**
 * @author DW-CHEN
 */
public class User {
    private Integer id;
    private String name;
    private Integer age;

    public User() {

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

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
接口
package cn.cdw.demo.mapper;

import cn.cdw.demo.pojo.User;

import java.util.ArrayList;
import java.util.List;

/**
 * @author DW-CHEN
 * MyBatis接口代理方式实现dao层
 */
public interface UserMapper {

    public User findById(Integer id);
}
映射文件
<?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="cn.cdw.demo.mapper.UserMapper">
    <select id="findById" resultType="user" parameterType="int">
        select * from user where  id = #{id};
    </select>

</mapper>
jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root
核心配置文件
<?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="jdbc.properties"/><!--读取配置文件-->

    <settings>
        <setting name="logImpl" value="log4j"/>
    </settings>

    <typeAliases><!--配置别名-->
        <package name="cn.cdw.demo.pojo"/>
    </typeAliases>

    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin><!--分页插件助手-->
    </plugins>

    <environments default="mysql">
        <environment id="mysql"><!--配置环境变量-->
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="UserMapper.xml"/><!--引入映射文件-->
    </mappers>
</configuration>
测试
package cn.cdw.demo.mapper;

import cn.cdw.demo.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 java.io.IOException;
import java.io.InputStream;

/**
 * @author DW-CHEN
 * 测试MyBatis接口代理方式实现dao层,不需要实现类了
 */
public class TestUserMapper {
    public static void main(String[] args) throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("MyBatisConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取动态代理对象
        User user = mapper.findById(2);

        System.out.println(user);
        sqlSession.close();
        resourceAsStream.close();

    }
}

MyBatis映射配置文件-动态SQL

动态SQL标签

sql语句可以根据条件或者参数的不同进行动态的变化

  • <where>:条件标签
  • <if>:条件判断标签
  • <foreach>:循环遍历标签
代码
接口
package cn.cdw.demo.mapper;

import cn.cdw.demo.pojo.User;

import java.util.ArrayList;
import java.util.List;

/**
 * @author DW-CHEN
 * MyBatis接口代理方式实现dao层
 */
public interface UserMapper {

    public User findById(Integer id);

    public User findByCondition(User user);

    public List<User> findByIds(ArrayList<Integer> ids);
}
映射文件
<?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="cn.cdw.demo.mapper.UserMapper">
    <select id="findById" resultType="user" parameterType="int">
        select * from user where  id = #{id};
    </select>

    <select id="findByCondition" resultType="user" parameterType="user">
        select * from user
        <where>
            <if test="id != null">
                id = #{id}
            </if>
            <if test="name != null">
                and name = #{name}
            </if>
            <if test="age != null">
                and age = #{age}
            </if>
        </where>
    </select>

    <select id="findByIds" parameterType="list" resultType="user">
        select * from user
        <where>
            <foreach collection="list" open="id in (" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </where>
    </select>

</mapper>
测试
package cn.cdw.demo.mapper;

import cn.cdw.demo.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 java.io.IOException;
import java.io.InputStream;

/**
 * @author DW-CHEN
 * MyBatis动态sql
 * 根据不同条件进行查询
 */
public class TestUserMapper1 {
    public static void main(String[] args) throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("MyBatisConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取动态代理对象

        User u1 = mapper.findByCondition(new User(2, null, null));
        User u2 = mapper.findByCondition(new User(null, "小小", 12));
        User u3 = mapper.findByCondition(new User(null, null, 23));

        System.out.println(u1);
        System.out.println(u2);
        System.out.println(u3);

        sqlSession.close();
        resourceAsStream.close();
    }
}
package cn.cdw.demo.mapper;

import cn.cdw.demo.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 java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * @author DW-CHEN
 * 根据多个id进行查询
 */
public class TestUserMapper2 {
    public static void main(String[] args) throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("MyBatisConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取动态代理对象

        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(2);
        arrayList.add(4);
        arrayList.add(3);

        List<User> arrayListUser = (List<User>) mapper.findByIds(arrayList);

        System.out.println(arrayListUser);

        sqlSession.close();
        resourceAsStream.close();
    }
}

SQL片段抽取

  • 我们可以将一些重复性的SQL语句进行抽取,以达到复用的效果
  • <sql>:抽取sql语句标签
  • <include>:引入sql片段标签
映射文件
<?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="cn.cdw.demo.mapper.UserMapper">
    <sql id="query">
        select * from user
    </sql>

    <select id="findAllByPage" resultType="user">
        <include refid="query"/>
    </select>

MyBatis核心配置文件-分页插件PageHelper

PageHelper需要导入的pagehelper-5.1.2.jar,jsqlparser-1.0.jar包,下载地址:https://download.csdn.net/download/qq_42795277/12838332

  • PageHelper:第三方分页助手,将复杂的分页操作进行封装

分页插件的相关参数

  • PageInfo:封装分页相关参数的功能类
  • 核心方法
方法名说明
long getTotal()获取总条数
int getPages()获取总页数
int getPageNum()获取当前页
int getPageSize()获取每页显示的条数
int getPrePage()获取上一页
int getNextPage()获取下一页
boolean islsFirstPage()获取是否是第一页
boolean islsLastPage()获取是否是最后一页
代码
接口
package cn.cdw.demo.mapper;

import cn.cdw.demo.pojo.User;

import java.util.ArrayList;
import java.util.List;

/**
 * @author DW-CHEN
 * MyBatis接口代理方式实现dao层
 */
public interface UserMapper {

    public List<User> findAllByPage();

}
映射文件
<?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="cn.cdw.demo.mapper.UserMapper">
    <sql id="query">
        select * from user
    </sql>

    <select id="findAllByPage" resultType="user">
        <include refid="query"/>
    </select>
核心配置文件
<?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="jdbc.properties"/><!--读取配置文件-->

    <settings>
        <setting name="logImpl" value="log4j"/>
    </settings>

    <typeAliases><!--配置别名-->
        <package name="cn.cdw.demo.pojo"/>
    </typeAliases>

    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin><!--分页插件助手-->
    </plugins>

    <environments default="mysql">
        <environment id="mysql"><!--配置环境变量-->
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="UserMapper.xml"/><!--引入映射文件-->
    </mappers>
</configuration>
分页信息
package cn.cdw.demo.mapper;

import cn.cdw.demo.pojo.User;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
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;

/**
 * @author DW-CHEN
 * PageHelper分页助手
 */
public class TestUserMapper3 {
    public static void main(String[] args) throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("MyBatisConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取动态代理对象

        // PageHelper.startPage(1, 2);//从第一页开始,每页显示2条数据
       PageHelper.startPage(2, 2);//从第二页开始,每页显示2条数据

        List<User> all = mapper.findAllByPage();
        for (User user : all) {
            System.out.println(user);
        }

        PageInfo<User> pageInfo = new PageInfo<>(all);
        System.out.println("总数据:" + pageInfo.getTotal());
        System.out.println("总页数:" + pageInfo.getPages());
        System.out.println("当前页:" + pageInfo.getPageNum());
        System.out.println("每页显示的数据:" + pageInfo.getPageSize());
        System.out.println("上一页:" + pageInfo.getPrePage());
        System.out.println("下一页:" + pageInfo.getNextPage());
        System.out.println("是否时第一页:" + pageInfo.isIsFirstPage());
        System.out.println("是否是最后一页:" + pageInfo.isIsLastPage());

        sqlSession.close();
        resourceAsStream.close();
    }
}

MyBatis多表查询

代码参考: git@github.com:chendingwu/MyBatisExample.git

映射配置文件方式

  • 多表模型分类:一对一,一对多,多对多
  • <resultMap>:配置字段和对象属性的映射关系标签,id属性:唯一标识,type属性:实体对象类型
  • <id>:配置主键映射关系标签
  • <result>:配置非主键映射关系标签,column属性:标中字段名称,property属性:实体对象变量名称
  • <association>:配置被包含对象的映射关系标签,property属性:被包含对象的数据类型,javaType属性:被包含对象的数据类型
  • <collection>:配置被包含集合对象的映射关系标签,property属性:被包含集合对象的变量名,ofType属性:集合中保存的对象数据类型

注解方式

注意:需要在核心配置文件中配置映射关系

  • @Results:封装映射关系的父注解,Result[] value():定义了Result数组
  • @Result:封装了映射关的子注解,column属性:查询出表中字段名称,property属性:实体类对象中的属性名称,javaType属性:被包含对象的数据类型,one属性:一对一查询固定属性,many属性:一对多查询固定属性
  • @One:一对一查询的注解,select属性:指定调用某个接口中的方法
  • @Many:一对多查询的注解,select属性:指定调用某个接口中的方法

MyBatis构造SQL语句

MyBatis给我们提供了org.apache.ibatis.jdbc.SQL功能类,专门用于构建SQL语句的功能类,通过一些方法来替代SQL语句的关键字

方法名说明
SELECT(String… column)根据字段拼接查询语句
FROM(Sting… table)根据表名拼接语句
WHERE(String… condition)根据条件拼接语句
INSERT_INTO(String table)根据表名拼接新增语句
VALUES(String column,String values)根据字段和值拼接插入数据语句
UPDATE(String table)根据表名拼接修改语句
DELETE_FROM(String table)根据表名拼接删除语句
代码
数据库
/*
SQLyog Ultimate v12.09 (64 bit)
MySQL - 5.5.40 : Database - test
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`test` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `test`;

/*Table structure for table `user` */

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

/*Data for the table `user` */

insert  into `user`(`id`,`name`,`age`) values (3,'小李',22),(11,'小莉',12),(12,'小李利',12),(13,'小行星',12),(14,'夏利',12);

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
实体类
package cn.cdw.demo.pojo;

/**
 * @author DW-CHEN
 */
public class User {
    private Integer id;
    private String name;
    private Integer age;

    public User() {

    }

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

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

构建SQL语句
package cn.cdw.demo.sql;

import org.apache.ibatis.jdbc.SQL;

/**
 * @author DW-CHEN
 * 构建SQL语句
 */
public class Demo1 {

    public String select() { //构建查询SQL语句
        SQL sql = new SQL(){
            {
                SELECT("*");
                FROM("user");
            }
        };
        return sql.toString();
    }

    public String insert() {//构建添加sql语句
       SQL sql = new SQL(){
            {
                INSERT_INTO("user");
                VALUES("id,name,age", "#{id},#{name},#{age}");
            }
        };

       return sql.toString();
    }

    public String update() {//构建更新sql语句
        SQL sql = new SQL() {
            {
                UPDATE("user");
                SET("name = #{name},age = #{age}");
                WHERE("id = #{id}");
            }
        };

        return sql.toString();
    }

    public String delete() {//构建删除sql语句
        SQL sql = new SQL() {
            {
                DELETE_FROM("user");
                WHERE("id=#{id}");
            }
        };
        return sql.toString();
    }
}
接口
package cn.cdw.demo.mapper;

import cn.cdw.demo.sql.Demo1;
import cn.cdw.demo.pojo.User;
import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;

import java.util.List;

/**
 * @author DW-CHEN
 * 使用构建SQL语句
 */
public interface UserMapper {

    @SelectProvider(type = Demo1.class,method = "select")
    public List<User> findAll();

    @InsertProvider(type = Demo1.class,method = "insert")
    public void inset(User user);

    @UpdateProvider(type = Demo1.class, method = "update")
    public void update(User user);

    @DeleteProvider(type = Demo1.class, method = "delete")
    public void delete(Integer id);
}

jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root
核心配置文件
<?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="jdbc.properties"/>

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

    <mappers>
        <package name="cn.cdw.demo.mapper"/>
    </mappers>
</configuration>
测试
package cn.cdw.demo.mapper;

import cn.cdw.demo.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 java.io.IOException;
import java.util.List;

/**
 * @author DW-CHEN
 * 测试
 */
public class TestUserMapper {
    public static void main(String[] args) throws IOException {
        findAll();
       // insert();
       // update();
       // delete();

    }

    public static SqlSession getSqlSession(){
         SqlSession sqlSession = null;
        try {
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("MyBatisConfig.xml"));
             sqlSession = sqlSessionFactory.openSession(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sqlSession;
    }

    public static void findAll() {//查询
        SqlSession sqlSession = getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> all = mapper.findAll();

        for (User user : all) {
            System.out.println(user);
        }
        sqlSession.close();
    }

    public static void insert() {//添加
        SqlSession sqlSession = getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.inset(new User(null,"夏利",12));
        System.out.println("添加成功....");
        sqlSession.close();
    }

    public static void update() {//更新
        SqlSession sqlSession = getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        mapper.update(new User(11, "小莉",12));
        System.out.println("更新成功");
        sqlSession.close();
    }

    public static void delete() {//删除
        SqlSession sqlSession = getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        mapper.delete(2);
        System.out.println("删除成功");
        sqlSession.close();
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值