Mybatis详解1

  • Mybatis下载
  • 准备工作
  • Mybatis原理
    • Mybatis的架构
    • Mybatis架构图
    • Mybatis执行流程
  • Mybatis开发
    • 传统模式
      • Mybatis主配置文件
      • mapper映射文件
      • 测试类
      • Dao接口
      • Dao实现类
      • Dao测试类
    • Mybatis代理模式
      • Mapper接口
      • mapper.xml配置文件
      • mapper测试类
    • Mybatis开发的两种模式
  • 注意事项
    • 关于“#”和“$”
      • “#”
      • “$”
    • parameterType和resultType
      • parameterType
      • resultType
    • selectOne和selectList
      • selectOne
      • selectList
    • Mybatis返回自增主键
    • mapper代理方式开发
    • SqlMapConfig.xml配置文件
      • SqlMapConfig.xml配置文件中标签顺序
      • SqlMapConfig.xml中properties标签
      • typeAliases
        • 自定义别名
        • mybatis默认支持的别名
      • SqlMapConfig.xml加载mapper.xml的方式

Mybatis下载

mybatis下载地址:https://github.com/mybatis/mybatis-3/releases

准备工作

下载mybatis的压缩包,解压,根目录有mybatis的jar包,根目录下有一个lib文件,是mybatis运行所需要的jar包

  1. 添加根目录下mybatis的jar包到项目
  2. 添加lib目录下mybatis运行所需要的jar包到项目
  3. 添加连接mysql的驱动包mysql-connnector-java.jar

Mybatis原理

Mybatis的架构

Mybatis分为两类配置文件,主配置文件和Mapper配置文件
主配置文件:SqlMapConfig.xml
Mapper配置文件:Mapper1.xml、Mapper2.xml等

Mybatis架构图

Mybatis详解1_第1张图片

Mybatis执行流程

  1. mybatis配置
    SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
    mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
  2. 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
  3. 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行
  4. mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器
  5. Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id
  6. Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数
  7. Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程,相当于jdbc编程中对结果的解析处理过程。

Mybatis开发

传统模式

Mybatis主配置文件

SqlMapConfig.xml



<configuration>
    
    <properties resource="db.properties">
        <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <property name="jdbc.url" value="jdbc:mysql://192.168.13.3:3306/mybatis?characterEncoding=utf-8"/>
        <property name="jdbc.username" value="yhl"/>
    properties>
    
    <typeAliases>
        
        
        <package name="com.mydeertrip.mybatis.po"/>
    typeAliases>
    
    <environments default="development">
        <environment id="development">
        
            <transactionManager type="JDBC" />
        
            <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>
        
        <mapper resource="sqlmap/user.xml"/>
        
        
        
        
        <package name="com.mydeertrip.mybatis.mapper"/>
    mappers>
configuration>

mapper映射文件

user.xml




<mapper namespace="test">
    <select id="getUserById" parameterType="int" resultType="com.mydeertrip.mybatis.po.User">
        SELECT * FROM `user` WHERE id=#{id};
    select>

    
    <select id="getUserByName" parameterType="string" resultType="com.mydeertrip.mybatis.po.User">
        SELECT * FROM `user` WHERE username LIKE '%${value}%'
    select>
    
    <insert id="insertUser" parameterType="com.mydeertrip.mybatis.po.User">
        
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            SELECT LAST_INSERT_ID()
        selectKey>
        INSERT into user (username,birthday,sex,address) 
        values (#{username}, #{birthday}, #{sex}, #{address})
    insert>

    
    <delete id="deleteUser" parameterType="int">
        DELETE from user WHERE id=#{id1}
    delete>
    
    <update id="updateUser" parameterType="com.mydeertrip.mybatis.po.User">
        update user set username=#{username} WHERE id=#{id}
    update>
mapper>

测试类

package com.mydeertrip.mybatis.test;

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

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 com.mydeertrip.mybatis.po.User;

public class MybatisTest {

    private SqlSessionFactory sqlSessionFactory = null;

    @Before
    public void init() throws Exception {
        //第一步:创建一个SQLSessionFactoryBuilder对象。
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //第二步:加载配置文件。
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //第三步:创建SQLSessionFactory对象
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }

    @Test
    public void getUserById() throws Exception {

        //第四步:创建SQLSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //第五步:使用SqlSession对象执行查询,得到User对象。
        //第一个参数:执行查询的statementId
        User user = sqlSession.selectOne("getUserById", 10);
        //第六步:打印结果
        System.out.println(user);
        //第七步:释放资源
        sqlSession.close();
    }
    @Test
    public void getUserByName() throws Exception {
        //创建一个SQLSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行查询
        List list = sqlSession.selectList("getUserByName", "张");
        for (User user : list) {
            System.out.println(user);
        }
        //释放资源
        sqlSession.close();
    }

    @Test
    public void addUser() throws Exception {
        //创建一个SQLSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //创建User对象
        User user = new User();
        user.setUsername("小乔");
        user.setBirthday(new Date());
        user.setSex("2");
        user.setAddress("上海");
        //插入用户
        sqlSession.insert("insertUser", user);
        System.out.println(user.getId());
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

    @Test
    public void deleteUser() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //删除用户
        sqlSession.delete("deleteUser",2);
        //提交事务
        sqlSession.commit();
        sqlSession.close();

    }

    @Test
    public void updateUser() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //创建一个User对象
        User user = new User() ;
        user.setUsername("张角1");
        user.setId(27);
        //更新用户
        sqlSession.update("updateUser", user);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }
}

Dao接口

package com.mydeertrip.mybatis.dao;

import java.util.List;

import com.mydeertrip.mybatis.po.User;

public interface UserDao {

    User getUserById(int id);
    List getUserByName(String username);
    void insertUser(User user);
}

Dao实现类

package com.mydeertrip.mybatis.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import com.mydeertrip.mybatis.dao.UserDao;
import com.mydeertrip.mybatis.po.User;

public class UserDaoImpl implements UserDao {

    private SqlSessionFactory sqlSessionFactory;

    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public User getUserById(int id) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 根据id查询用户信息
        User user = sqlSession.selectOne("getUserById", id);
        // 关闭SQLSession
        sqlSession.close();
        return user;
    }

    @Override
    public List getUserByName(String username) {
        // 创建一个SQLSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 执行查询
        List list = sqlSession.selectList("getUserByName", username);
        // 释放资源
        sqlSession.close();
        return list;
    }

    @Override
    public void insertUser(User user) {
        // 创建一个SQLSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 插入用户
        sqlSession.insert("insertUser", user);
        // 提交事务
        sqlSession.commit();
        // 释放资源
        sqlSession.close();

    }
}

Dao测试类

package com.mydeertrip.mybatis.dao;

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

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import com.mydeertrip.mybatis.dao.impl.UserDaoImpl;
import com.mydeertrip.mybatis.po.User;

public class UserDaoTest {

    private SqlSessionFactory sqlSessionFactory = null;

    @Before
    public void init() throws Exception {
        // 第一步:创建一个SQLSessionFactoryBuilder对象。
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 第二步:加载配置文件。
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 第三步:创建SQLSessionFactory对象
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }

    @Test
    public void testGetUserById() {
        UserDao userDao = new UserDaoImpl(sqlSessionFactory);
        User user = userDao.getUserById(10);
        System.out.println(user);
    }

    @Test
    public void testGetUserByName() {
        UserDao userDao = new UserDaoImpl(sqlSessionFactory);
        List list = userDao.getUserByName("张");
        for (User user : list) {
            System.out.println(user);
        }
    }

    @Test
    public void testInsertUser() {
        UserDao userDao = new UserDaoImpl(sqlSessionFactory);
        User user = new User();
        user.setUsername("赵云");
        user.setAddress("正定");
        user.setBirthday(new Date());
        user.setSex("1");
        userDao.insertUser(user);

    }
}

Mybatis代理模式

Mapper接口

package com.mydeertrip.mybatis.mapper;

import java.util.List;

import com.mydeertrip.mybatis.po.User;

public interface UserMapper {

    User getUserById(int id);
    List getUserByName(String username);
    void insertUser(User user);
}

mapper.xml配置文件





<mapper namespace="com.mydeertrip.mybatis.mapper.UserMapper">
    
    <select id="getUserById" parameterType="int" resultType="USer">
        SELECT * FROM `user` WHERE id=#{id};
    select>

    
    <select id="getUserByName" parameterType="string" resultType="com.mydeertrip.mybatis.po.User">
        SELECT * FROM `user` WHERE username LIKE '%${value}%'
    select>
    
    <insert id="insertUser" parameterType="com.mydeertrip.mybatis.po.User">
        
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            SELECT LAST_INSERT_ID()
        selectKey>
        INSERT into user (username,birthday,sex,address) 
        values (#{username}, #{birthday}, #{sex}, #{address})
    insert>
mapper>

mapper测试类

package com.mydeertrip.mybatis.mapper;

import static org.junit.Assert.fail;

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

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 com.mydeertrip.mybatis.po.User;

public class UserMapperTest {

    private SqlSessionFactory sqlSessionFactory = null;

    @Before
    public void init() throws Exception {
        // 第一步:创建一个SQLSessionFactoryBuilder对象。
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 第二步:加载配置文件。
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 第三步:创建SQLSessionFactory对象
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }

    @Test
    public void testGetUserById() {
        //和spring整合后省略
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //获得代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.getUserById(10);
        System.out.println(user);

        //和spring整合后省略
        sqlSession.close();
    }

    @Test
    public void testGetUserByName() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List list = userMapper.getUserByName("张");
        for (User user : list) {
            System.out.println(user);
        }
        sqlSession.close();
    }

    @Test
    public void testInsertUser() {
        fail("Not yet implemented");
    }
}

Mybatis开发的两种模式

  1. 编写Dao接口和Dao实现类的传统开发,实现类中注入SessionFactory,每个方法内部创建SqlSession,调用SqlSession的API,由于SqlSession是线程不安全的,所以SqlSession需要在每个方法内部创建,用完立即关闭,释放资源
  2. mapper代理方式,只编写Dao接口,不编写Dao实现类,具体实现类写在mapper.xml映射文件里面。

注意事项

关于“#”和“$”

“#”

#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它任意名称(即括号中可以不是输入参数的名称),如果时pojo,则括号中必须是pojo属性名。

“$”

${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,不能防止sql注入,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value,如果是pojo,则括号中必须是属性值。

parameterType和resultType

parameterType

parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中

resultType

resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象

selectOne和selectList

selectOne

selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常

selectList

selectList可以查询一条或多条记录

Mybatis返回自增主键

<insert id="insertUser" parameterType="com.mydeertrip.mybatis.po.User">
        
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select LAST_INSERT_ID()
        selectKey>
       insert into user(username,birthday,sex,address)
        values(#{username},#{birthday},#{sex},#{address});
    insert>

mapper代理方式开发

  1. mapper.xml配置文件中的明明空间必须是接口的全限定名
  2. mapper.xml配置文件中select标签的id属性值,必须和接口中的方法名一样
  3. 接口方法的参数类型必须和parameterType类型一样
  4. 接口方法的返回值类型必须和resultType类型一样

SqlMapConfig.xml配置文件

SqlMapConfig.xml配置文件中标签顺序

properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
    environment(环境子属性对象)
        transactionManager(事务管理)
        dataSource(数据源)
mappers(映射器)

SqlMapConfig.xml中properties标签

    "db.properties">
        <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <property name="jdbc.url" value="jdbc:mysql://192.168.13.3:3306/mybatis?characterEncoding=utf-8"/>
        <property name="jdbc.username" value="yhl"/>
    
  1. properties标签用于配置属性,该配置文件其他标签可以通过“${}”的方式引用properties中定义的值
  2. 通过在properties上添加resource属性来加载外部定义的properties文件,如:db.properties
  3. 内部定义properties和外部加载的properties的加载顺序是:先加载内部properties再加载外部properties,因此外部properties文件中定义的属性会覆盖内部定义的同名属性

typeAliases

自定义别名

    
    <typeAliases>
        
        
        <package name="com.mydeertrip.mybatis.po"/>
    typeAliases>
  1. 给每个类定义别名
  2. 扫描包形式,别名为类名,不区分大小写

mybatis默认支持的别名

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
map Map

SqlMapConfig.xml加载mapper.xml的方式

    <mappers>
        
        <mapper resource="sqlmap/user.xml"/>
        
        
        
        
        <package name="com.mydeertrip.mybatis.mapper"/>
    mappers>
  1. resource属性

    在mapper标签上使用resource属性加载mapper.xml文件,基于classpath路径查找

  2. class属性

    在mapper标签上使用class属性加载mapper.xml文件

    1. mapper.xml映射文件必须和mapper.java接口在同一目录下,即同一包下
    2. mapper.xml映射文件的文件名必须和mapper.java的文件名一样,比如:UserMapper.xml和UserMapper.java
    3. class的值为mapper接口的全限定名
  3. package标签

    通过package标签扫描包加载mapper.xml文件

    1. mapper.xml映射文件必须和mapper.java接口在同一目录下,即同一包下
    2. mapper.xml映射文件的文件名必须和mapper.java的文件名一样,比如:UserMapper.xml和UserMapper.java
    3. class的值为mapper接口的全限定名

你可能感兴趣的:(应用)