Mybatis入门知识

文章目录

    • 一.认识MyBatis
      • 1.1详细
      • 1.2面试题
    • 二.Mybatis的基本配置
      • 1.1核心配置文件
      • 1.2创建映射文件
      • 1.3完成功能
    • 三.MyBatisCRUD
      • 1.2 CRUD的关键代码
    • 四.注意点与细节
      • 4.1 添加时需要id
      • 4.2 别名
      • 4.3 日志管理
      • 4.4 列名与属性名不一致
    • 五,映射Mapper
      • 1.employeeMapper.xml
      • 2.EmployeeMapper
      • 3.调用 Mapper的方法
    • 六,高级查询
    • 七, 批量删除,添加
      • 1 ,批量删除
      • 2,传数组的方法
      • 3, 传集合的方式
      • 4, 批量添加

一.认识MyBatis

MyBatis就是一个ORM持久化框架(操作数据库)

1.1详细

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

1.2面试题

MyBatis与Hibernate的区别
MyBatis自己写SQL,性能更好控制
MyBatis与JDBC的区别
MyBatis只需要关注SQL,其它完成了封装
#与KaTeX parse error: Expected 'EOF', got '#' at position 5: 的区别 #̲(接收普通参数,预编译,性能好…正好相反

二.Mybatis的基本配置

导包(核心,依赖包,数据库驱动包)
有表,有domain
要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。

如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:

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

配置 名称解释:

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

    configuration(配置)
    properties(属性)
    settings(设置)
    typeAliases(类型别名)
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境配置)
     environment(环境变量)
     transactionManager(事务管理器)
    dataSource(数据源)
    databaseIdProvider(数据库厂商标识)
    mappers(映射器)
    XML 映射文件

MyBatis 的真正强大在于它的映射语句,、由于它的异常强大,映射器的 XML 文件就显得相对简单。它跟具有相同功能的 JDBC 代码进行对比,省掉了将近 95% 的代码。MyBatis 为聚焦于 SQL 而构建,为你减少麻烦。

SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):

cache – 对给定命名空间的缓存配置。
cache-ref – 对其他命名空间缓存配置的引用。
resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
parameterMap – 已被废弃!老式风格的参数映射。更好的办法是使用内联参数,此元素可能在将来被移除。文档中不会介绍此元素。
sql – 可被其他语句引用的可重用语句块。
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句

1.1核心配置文件

mybatis-config.xml


```java
<?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:环境()
    -->
    <!--引入 db.properties文件-->
    <properties resource="db.properties" />
    <environments default="development">
        <!-- 真实数据库环境【用户】 -->
        <environment id="development">
            <transactionManager type="JDBC" />
            <!--dataSource:数据源(连接池) -->
            <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>
    </environments>
    <mappers>
        <!-- 读取SQL的映射文件 -->
        <mapper resource="cn/itsource/domain/ProductMapper.xml" />
    </mappers>
</configuration>

1.2创建映射文件

XxxMapper.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">
<!--
    namespace:命名空间(一个domain对应一个这个xml)
 -->
<mapper namespace="cn.itsource.domain.ProductMapper">
    <!--
        如果到时候想找到这条SQL: namespace+id
            等会要找到它:cn.itsource.domain.ProductMapper.findOne
            parameterType:代表传参类型
                long -> Long  _long -> long
            resultType:返回的某一个条数的类型(必需写全限定名)
     -->
    <select id="findOne" parameterType="long" resultType="cn.itsource.domain.Product" >
        select * from product where id = #{id}
    </select>
</mapper>

1.3完成功能

//SqlSessionFactoryBuilder -> SqlSessionFactory -> SqlSession
@Override
	public Product findOne(Long id) {
		try {
			//1.读取核心配置文件
			Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
			//2.创建一个对象:SqlSessionFactory 相当于咱们

```java
JPA:EntityManagerFactory
			//  SqlSessionFactoryBuilder:构造者模式
			SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
			//3.创建一个对象:SqlSession 相当于当前JPA:EntityManager
			SqlSession session = factory.openSession();
			//4.session操作数据库(读取数据)
			/**
			 * 方式中有两个值:
			 *  第一个值(statement):找SQL的字符串
			 */
		   Product product = session.selectOne("cn.itsource.domain.ProductMapper.findOne",id);
		   return product;
		} catch (Exception e) { //注意,不要用IO异常(很多错看不出来)
			e.printStackTrace();
		}

		return null;
	}

三.MyBatisCRUD


## 1.1MyBatisUtil

public class MyBatisUtil {
    private MyBatisUtil(){}

    private static SqlSessionFactory sessionFactory;

    //在静态代码块中创建SqlSessionFactory对象
    static {
        try {
            sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //返回SqlSession对象
    public static SqlSession openSession(){
        return sessionFactory.openSession();
    }

}

1.2 CRUD的关键代码

增删改需要提交事务

session.insert("cn.itsource.domain.ProductMapper.save", product);

session.update("cn.itsource.domain.ProductMapper.update", product);

session.delete("cn.itsource.domain.ProductMapper.delete",id);

Product product = session.selectOne("cn.itsource.domain.ProductMapper.findOne",id);

List<Product> products = session.selectList("cn.itsource.domain.ProductMapper.findAll");

四.注意点与细节

4.1 添加时需要id

useGeneratedKeys:是否要返回id
keyColumn:数据库中的主键对应的列
keyProperty:domain中对应的主键属性
id返回到传过来的对象中

4.2 别名

内置别名(文档中有)
自定义别名 mybatis-config.xml
别名不区别大小写
注意它的配置顺序(如果配置错误会有提示)

<!-- 配置别名 -->
<typeAliases>
    <!-- 配置一个别名(不区分大小写) -->
    <!--<typeAlias type="cn.itsource.domain.Product" alias="product" />-->
    <package name="cn.itsource.domain" />
</typeAliases>

4.3 日志管理

在资源根目录创建:log4j.properties

#log4j.properties(日志文件:)
 ERROR错误的日志 WARN:警告 INFO:普通信息  DEBUG:调试日志  TRACE:日志
log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
#把左边包名改成你自己的包名
log4j.logger.cn.itsource=TRACE

#日志打印到控制台中
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#日志打印的一种格式(可以灵活地指定布局模式)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#日志打印的格式是什么样子的  %d:日期 %p:优先级 %c:类的全名  %m:输出的结果 %n:换行
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

4.4 列名与属性名不一致

添加与修改在相应位置修改名称即可
查询需要创建一个resultMap
使用的时候返回结果必需是resultMap

<!--
    准备一个映射(ORM)配置
    resultMap:结果映射
 -->
<resultMap id="productMapper" type="product">
    <!--如果是主键不一致,使用id这个标签-->
    <id column="id" property="id" />
    <!--
        result:某一个属性的映射
            column:列名(表中) property:属性名(对象中)
    -->
    <result column="dir_id" property="dirId" />
</resultMap>

<!-- 查询所有数据 -->
<select id="findAll" resultMap="productMapper" >
    select * from product
</select>

五,映射Mapper

接口方法映射到对应的SQL
Mapper.xml的命名空间名称就是Maper接口的全限定名
Mapper接口上也可以写SQL(不建议这么做)

1.employeeMapper.xml

<!--这个命名空间的名称就是咱们Mapper接口的全限定名-->
<mapper namespace="cn.itsource._02_mapper.mapper.EmployeeMapper">
    <!--这个id的名称必需和映射的EmployeeMapper的方法名一致-->
    <insert id="save" parameterType="employee">
      ...
    </insert>

    <select id="findAll" resultType="employee">
      ...
    </select>
</mapper>

2.EmployeeMapper

package cn.itsource._02_mapper.mapper;
public interface EmployeeMapper {

    void save(Employee employee);
//    @Select("select * from employee")
    List<Employee> findAll();
}

3.调用 Mapper的方法

SqlSession session = MyBatisUtil.openSession();
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);

mapper.findAll().forEach(e -> System.out.println(e));

六,高级查询

准备一个Query对象(封装所有条件)
模糊查询 concat("%",#{name},"%")
遇到特殊符号 1.转义 < 2.CDATA段
使用where标签(第一个and变成where)
if中有多个条件使用 and/or 进行关联
如果出现相同的代码,可以单独抽取sql标签,引用include即可

<select id="findByQuery" parameterType="employeeQuery" resultType="employee">
        select * from employee <include refid="whereSql" />
</select>

<!--准备代码片断-->
<sql id="whereSql">
    <where>
        <if test="name!=null and name!=''">
            and name like concat("%",#{name},"%")
        </if>
        <if test="minAge!=null">
            and age >= #{minAge}
        </if>
        <if test="maxAge!=null">
            <![CDATA[ and age<=#{maxAge} ]]>
        </if>
    </where>
</sql>

七, 批量删除,添加

1 ,批量删除

首先知道sql delete from 表名 where id in (?,?,…)
collection="":代表你要循环的是什么? array/list
如果传过来的是数据,写array(集合就写list)
item:循环的每一个数据
open:拼接字符串以什么开始
close:拼接字符串以什么结尾
separator:拼接的时候每个值使用,隔开
index:遍历的下标

2,传数组的方法

 <delete id="batchDelete" parameterType="long[]">
        delete from employee where id in
        <foreach collection="array" item="v" open="(" close=")" separator=",">
            #{v}
        </foreach>
</delete>

3, 传集合的方式

 <delete id="batchDelete" parameterType="list">
        delete from employee where id in
        <foreach collection="list" item="v" open="(" close=")" separator=",">
            #{v}
        </foreach>
    </delete>

4, 批量添加

首先知道sql `insert into 表名 (p1,p2,…) values (#{p1},#{p2}),(#{p1},#{p2}),…

<insert id="batchSave" parameterType="list">
    insert into employee (name,age,sex) values
    <foreach collection="list" item="emp" separator=",">
        (#{emp.name},#{emp.age},#{emp.sex})
    </foreach>
</insert>

你可能感兴趣的:(Mybatis,java,mybatis)