mybatis入门

Mybatis

mybatis基础

依赖

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.13</version>
</dependency>

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.0</version>
</dependency>

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 /> <!-- 属性 -->
    <settings /> <!-- 设置 -->
    <typeAliases /> <!-- 类型命名 -->
    <typeHandlers /> <!-- 类型处理器 -->
    <objectFactory /> <!-- 对象工厂 -->
    <plugins /> <!-- 插件 -->
    <environments> <!-- 配置环境 -->
        <environment> <!-- 环境变量 -->
            <transactionManager /> <!-- 事务管理器 -->
            <dataSource /> <!-- 数据源 -->
        </environment>
    </environments>
    <databaseIdProvider /> <!-- 数据库厂商标识 -->
    <mappers /> <!-- 映射器 -->
</configuration>

配置文件中的每一个标签有有它的位置,不能随意的改变。

获取SqlSession对象

//mybatis配置文件位置
String resource = "Mybatis.xml";
//mybatis配置文件输入流
InputStream in = Resources.getResourceAsStream(resource);
//以mybatis配置文件的内容获取sqlSessionFactory对象
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
//获得SQLSession对象,操作数据库
SqlSession sqlSession = sessionFactory.openSession();

执行SQL语句

编写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">
<mapper namespace="com.offcn.mapper.UserMapper">
	<insert id="insert" >
        insert into users VALUES (#{id},#{name},#{password})
    </insert>
</mapper>

根据mapper文件中的SQL语句

sqlSession.insert("com.offcn.mapper.UserMapper.insert",user);

sqlSession对象根据namespace+id找到SQL语句,将数据传入SQL语句,在执行SQL。

mapper接口方法

利用sqlSession.getMapper(Mapper.class)获取mapper对象,调用mapper接口的方法。

SqlSession session = MybatisUtil.getSession();
DepartmentMapper mapper = session.getMapper(DepartmentMapper.class);

Department department = mapper.selectByDid(1);

需要有一个接口,和一个namespace与接口路径完全相同,接口中的方法和mapper文件中的sql语句的id要一一对应。

本质上是根据路径名获取namespace,方法名获取id,传参相同。执行sqlSession的方法。

mapper文件与接口必须有以下要求

1、mapper文件中的namespace必须等于接口的全限定名

2、sql语句的id必须与方法名一致

3、sql中的paramterType属性必须与方法名中的相同

4、方法的返回值类型必须与resultType或者resultMap相同

mybatis.xml主要配置

environments

<environments default="environmentc3p0">
    //jdbc基本连接配置
    <environment id="environment">
        <transactionManager type="JDBC"></transactionManager>
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>

    //c3p0连接池配置
    <environment id="environmentc3p0">
        <transactionManager type="JDBC"></transactionManager>
        <dataSource type="com.offcn.util.C3P0DataSourceFactory">
            <property name="driverClass" value="${jdbc.driver}"/>
            <property name="jdbcUrl" value="${jdbc.url}"/>
            <property name="user" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
</environments>

别名配置

<typeAliases>
//单个别名配置
    <typeAlias type="com.offcn.bean.User" alias="myUser"/>
//多个别名配置,所有当前包下的类的别名配置成类名
    <package name="com.offcn.bean"/>
</typeAliases>

关联属性文件

<properties resource="jdbc.properties"/>

将数据库连接的信息放入一个专门的文件中,便于后期修改(配置文件不会被编译,修改时不需要进行反编译)

mapper映射文件

保存自动生成的主键

一般来说,在进行数据库创建时会将主键设为自增,在程序运行时不会设置主键的内容,而是交给数据库添加,这就造成了当前对象信息的缺失。

<insert id="insert1"  useGeneratedKeys="true" keyProperty="id" keyColumn="id">
    insert into users(name,password) VALUES (#{name},#{password})
</insert>

useGeneratedKeys:是否获取自动生成的主键

keyProperty:JavaBean中的那一条属性

keyColumn:数据库表中的那一列

设置后,在insert语句执行后,会自动对当前插入的类对象进行补全

ResultMap配置

用于解决数据库中列的名称与javabean的属性名不相同,当相同时,在select语句查询返回是回调用set方法,根据列名进行赋值,不同时,就需要通过resultMap告诉程序,哪个列与哪一条属性相对应。

<resultMap id="myEp" type="employee">
    <id property="eid" column="eid"/>
    <result property="ename" column="ename"/>
    <association property="department" column="dept_id" javaType="Department"
                 select="com.offcn.mapper.DepartmentMapper.selectByDid"/>
</resultMap>

在一对多、多对多关系中,可使用association和collection标签是的获取的对象放入对应的属性中。

association单个对象

以Employee为例

public class Employee {
    private int eid;
    private String ename;
    private Department department;
}

适用多对一

将从数据库查询到的数据放到当前对象中的引用对象中

1、

<association property="department" column="dept_id" javaType="Department"
             select="com.offcn.mapper.DepartmentMapper.selectByDid"/>

select后跟引用类的查询SQL的namespace+id,传入参数,java类型,在当前对象中的属性,数据库中的列。

2、

<association property="department" column="dept_id" javaType="Department">
    <result property="" column=""/>
</association>

property="department"代表是Employee中的哪一个属性,column="dept_id" 数据中的哪一列,javaType="Department"查询结果类型

result中的property对应Department的属性,column对应数据库表的列

collection 单或多个对象

适用一对多,多对多

多参数

单参数的情况下,在SQL语句中用#{任意字符串}即可表示

多参数时有三种解决方法:

1、封装javabean,将数据放在Javabean的属性中,在mapper中用get方法获取。

2、map集合,将数据放到map集合中,根据key获取value

3、@param注解,在接口的方法参数列表中加上注解

如(@param(“name”)String name)

#{}与${}

'#'{}可以看成?占位符

'$'{}会把他的所有内容都加载SQL语句中,会出现SQL注入的情况,表名需要输入数据时,使用‘$’{}

动态sql

1、if

格式:

<if test="name != null">
            字符串
  </if>

作用:若test成立,将字符串拼接到之前的SQL语句后面。

2、choice、when、otherwise

相当于switch、case、default

格式:

<choice>
    <when test="">
        字符串
    </when>
    <when test="">
        字符串
    </when>
    <otherwose>
        字符串
    </otherwise>
</choice>

作用:依次检查when中的test,若成立,拼接字符串,若所有when都不成立,将otherwise中的字符串拼接。

3、where、set、trim

where:

​ 作用:被where标签包裹的内容,在拼接时会在前面加上where,若第一个的拼接的字符串以and或者or为首,则会忽略第一个。

set:

​ 作用:与where类似,拼接时加上set,若标签中的字符串拼接后以‘,’结尾,则去除‘,’

trim:

<trim prefix="" suffix="" prefixOverrides="" suffixOverrides="">
    
</trim>
prefix:前缀,在trim返回的字符串前添加
suffix:后缀,在trim返回的字符串后添加
prefixOverrides:当trim返回的字符串以特定开头返回时,覆盖该开头
suffixOverrides:当trim返回的字符串以特定结尾返回时,覆盖该结尾

4、foreach

delete from user where id in
<foreach collection="ids" open="(" close=")" item="item" separator=",">
    #{item}
</foreach>
collection:集合名称
open:传过来的数据开头
close:传过来的数据结尾
item:当前对象
separator:数据之间的间隔

通用mapper

作用:用于单表操作,不用创建mapper.xml文件,提供诸多方法

使用:

1、导入依赖

<dependency>
  <groupId>tk.mybatis</groupId>
  <artifactId>mapper</artifactId>
  <version>4.1.5</version>
</dependency>

2、创建接口

以类Score为例

@Table(name = "score")
public class Score {
    @Id
    private Integer id;

    private String name;
}

接口:

import tk.mybatis.mapper.common.Mapper;
public interface ScoreMapper extends Mapper<Score>{
}

3、在mybatis.xml文件中关联

<mapper class="com.offcn.mapper.ScoreMapper"/>

4、执行sql

@Test
public void selectMapper(){
    SqlSession session = MybatisUtil.getSession();

    MapperHelper mapperHelper = new MapperHelper();
    mapperHelper.processConfiguration(session.getConfiguration());

    ScoreMapper mapper = session.getMapper(ScoreMapper.class);
    //调用自带方法
    //通用mapper会为我们提供各种方法,并自动生成数据库操作sql语句,
    List<Score> scores = mapper.selectAll();

    for(Score score:scores){
        System.out.println(score);
    }
}

分页插件

1、导入依赖

<dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper</artifactId>
  <version>5.1.11</version>
</dependency>

2、分页操作,页面数据都会放在PageInfo中(页数,当前页,每页数据,每页数据数目等等)

@Test
public void selectMapperPage(){
    SqlSession session = MybatisUtil.getSession();

    MapperHelper mapperHelper = new MapperHelper();
    mapperHelper.processConfiguration(session.getConfiguration());

    ScoreMapper mapper = session.getMapper(ScoreMapper.class);

    //开启分页
    PageHelper.startPage(1,2);
    List<Score> scores = mapper.selectAll();

    //分页
    PageInfo<Score> info = new PageInfo<>(scores);
    System.out.println(info);
}
posted @ 2020-07-24 20:38  ygfcoder  阅读(151)  评论(0)    收藏  举报