Mybatis学习记录一

20200313
MyBatis就是对JDBC的封装,用来作为java程序和数据库的映射。

ORMapping:Object Relationship Mapping 对象关系映射
对象指的是面向对象
关系指的是关系型数据库
Java 到 MySQL 的映射,开发者可以以⾯向对象的思想来管理数据库。

MyBatis的优点:
与JDBC相比,减少了50%的代码量。
MyBatis是最简单的持久化框架,相当灵活,不会对现有数据库的设计强加任何影响,SQL写在XML里面,从程序代码中,彻底分离,降低耦合度,便于统一管理和优化。
提供XML标签,支出编写动态SQL语句
提供映射标签,支持对象与数据库的ORM关系映射。

MyBatis的缺点:
SQL语句的编写工作量较大,对开发人员编写SQL语句的功底有要求。
SQL语句依赖数据库,只要换了数据库,就要换SQL语句。

如何使用

使用MyBatis有两种方法,第一种是使用原生接口的方式;第二种使用自定义接口的方法。推荐使用第二种,增加repository让代码层次更加清晰。

(1)新建Maven工程 ,pom.xml

<dependencies>	
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.5</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.6</version>
    <scope>provided</scope>
</dependency>
</dependencies>

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
</build>

(2)新建数据表


use mybatis;
create table t_account(
 id int primary key auto_increment,
 username varchar(11),
 password varchar(11),
 age int
)

(3)新建数据表对应的实体类

import lombok.Data;

@Data
public class Account {
    private long id;
    private String username;
    private String password;
    private int age;
}
**4)在resource中创建配置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>

    <!--配置MyBatis的运行环境-->
    <environments default="development">
        <environment id="development">
            <!--配置JDBC事务管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--POOLED配置JDBC数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"></property>
                <property name="username" value="root"></property>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!--注册*.xml-->
    <mappers>
        <!--注册AccountMapper.xml-->
        <mapper resource="com/southwind/mapper/AccountMapper.xml"></mapper>
        <!--注册AccountRepository.xml-->
        <mapper resource="com/southwind/repository/AccountRepository.xml"></mapper>
    </mappers>

</configuration>

方法一:使用原生接口的方式
1、MyBatis框架需要开发者自定义SQL语句,写在Mapper.xml文件中,实际开发中,会为每一个实体类创建对应的Mapper.xml,定义管理该对象数据的SQL。
本例中创建AccountMapper.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="com.southwind.mapper.AccountMapper">
    <insert id="save" parameterType="com.southwind.entity.Account">
        insert into t_account(username,password,age) values(#{username},#{password},#{age})
    </insert>
</mapper>

namespace标签 :通常设置为文件所在包+文件名的形式。
insert标签: 表示执行添加操作
select标签:表示执行查询操作
update标签:表示执行更新操作
delete标签:表示执行删除操作
id:是实际调用MyBatis方法时需要用到的参数
parameterType:是调用对应方法时参数的数据类型

2、在全局配置文件config.xml中注册AccountMapper.xml

<!--注册*.xml-->
<mappers>
    <!--注册AccountMapper.xml-->
    <mapper resource="com/southwind/mapper/AccountMapper.xml"></mapper>
</mappers>

3、调用MyBatis的原生接口执行添加操作

import com.southwind.entity.Account;
import org.apache.ibatis.io.ResolverUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

/**
 * 使用原生接口(AccountMapper.xml)
 */
public class Test1 {
    public static void main(String[] args) {
        //加载Mybatis的配置文件
        InputStream inputStream = ResolverUtil.Test.class.getClassLoader().getResourceAsStream("config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        String statement = "com.southwind.mapper.AccountMapper.save";

        Account account = new Account(1L,"张三","123123",22);
        sqlSession.insert(statement,account);
        sqlSession.commit();
    }
}

方法二:通过Mapper代理实现自定义接口
自定义接口,定义相关的业务方法
编写与方法相关的Mapper.xml
1、自定义接口

package com.southwind.repository;
import com.southwind.entity.Account;
import java.util.List;

public interface AccountRepository {
    public int save(Account account);
    public int update(Account account);
    public int deleteById(long id);
    public List<Account> findAll();
}

2、创建接口对应的Mapper.xml,定义接口方法对应的SQL语句。
statement标签可以根据SQL执行的业务选择insert、delete、update、selete
Mybatis框架会根据规则创建接口实现类得=的代理对象
本例:AccountRepository.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="com.southwind.repository.AccountRepository">
    <insert id="save" parameterType="com.southwind.entity.Account">
        insert into t_account(username,password,age) values (#{username},#{password},#{age})
        
insert into t_account(username,password,age) values(#{username},#
{password},#{age})
    </insert>
    <update id="update" parameterType="com.southwind.entity.Account">
        update t_account set username = #{username},password = #{password},age= #{age} where id = #{id}
    </update>
    <delete id="deleteById" parameterType="long">
        delete from t_account where id = #{id};
    </delete>
    <select id="findAll" resultType="com.southwind.entity.Account">
        select * from t_account
    </select>
    <select id="findById" parameterType="long" resultType="com.southwind.entity.Account">
    	select * from t_account where id = #{id} 
    </select>
</mapper>

Mapper.xml 中 namespace 为接⼝的全类名。
Mapper.xml 中 statement 的 id 为接⼝中对应的⽅法名。
Mapper.xml 中 statement 的 parameterType 和接⼝中对应⽅法的参数类型⼀致。
Mapper.xml 中 statement 的 resultType 和接⼝中对应⽅法的返回值类型⼀致。

3、在全局配置文件config.xml中注册AccountRepository.xml

<!--注册*.xml-->
<mappers>
    <!--注册AccountMapper.xml-->
    <mapper resource="com/southwind/mapper/AccountMapper.xml"></mapper>
    <!--注册AccountRepository.xml-->
    <mapper resource="com/southwind/repository/AccountRepository.xml"></mapper>
</mappers>

4、调用接口的代理对象实现相关的业务操作

package com.southwind.test;

import com.southwind.entity.Account;
import com.southwind.repository.AccountRepository;
import org.apache.ibatis.io.ResolverUtil;
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;

/**
 * 通过Mapper代理来实现自定义接口
 * 步骤:1、自定义接口(AccountRepository.java),定义相关业务方法
 *      2、编写与方法相对应的Mapper.xml(AccountRepository.xml)
 */
public class Test2 {
    public static void main(String[] args) {
        InputStream inputStream = ResolverUtil.Test.class.getClassLoader().getResourceAsStream("config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取实现接口的代理对象
        AccountRepository accountRepository = sqlSession.getMapper(AccountRepository.class);

        //添加对象
//        Account account = new Account(3L,"王五","121212",26);
//        accountRepository.save(account);
//        sqlSession.commit();


        //查询全部对象
//        List<Account> list = accountRepository.findAll();
//        for(Account account:list){
//            System.out.println(account);
//        }
//        sqlSession.close();

        //通过id查询对象
        Account account = accountRepository.findById(4L);
        System.out.println(account);
        account.setUsername("小张");
        int result = accountRepository.update(account);
        sqlSession.commit();
        System.out.println(result);
        sqlSession.close();

        //通过id删除对象
//        int result = accountRepository.deleteById(3);
//        System.out.println(result);
//        sqlSession.commit();
//        sqlSession.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值