Mybatis的使用及案例

环境说明:
JDK 8+
MySQL 5.7.19
Maven-3.6.1
IDEA

学习前需要掌握:
Jdbc
Mysql
Java基础
Maven
Junit
Java web分层概念

一、什么是Mybatis?

Mybatis官方文档 : http://www.mybatis.org/mybatis-3/zh/index.html

GitHub : https://github.com/mybatis/mybatis-3

以下内容参考的官方文档总结和完成,如有不懂建议直接去到官方。(直接访问官方,容易访问失败,建议多试几次,或在网上找Mybatis官方文档文件)

Mybatis是一款优秀的持久层架构
Mybatis避免了几乎所有的jdbc代码和手动设置参数以及获取结果集的过程
Mybatis可以使用简单的XML或者注解来配置和映射原生信息,将接口和实体类映射成数据库中的记录

历史:
Mybatis本是Apache的一个开源项目ibatis,2010年迁移到Googlecode,并改名为Mybatis

持久化: 数据在持久状态和瞬时状态间转化的机制 持久状态–>把数据(内存中的对象)存储到永久保存的存储设备中,或数据库中。 瞬时状态–>用到数据时,立即能从存储中调用到 例:生活中冷藏食物

目的–>1.数据存储在内存,维护成本高,内存昂贵,所以数据存储在外存中更好
2.数据存储在内存中,可能造成数据丢失,如断电后数据丢失的情况。

二、为什么使用Mybatis?

Mybatis帮助程序猿将数据存入数据库中,和从数据库中取数据。
传统的jdbc操作,代码量大,mybatis框架大大减少代码,提高开发效率。

Mybatis的优点
简单易学
灵活
降低sql与代码的耦合
支持动态sql
使用的人多

简单案例一:Mybatis实现数据库连接,表中数据的显示

案例整体框架
![
在这里插入图片描述

从这个简单的案例框架可以看出,运用mybatis–>将原dao层下的UserDaoIpml(即接口实现类,换成了userMapper.XML文件),原jdbcutils,改成mybatis和mybatis.Config.xml文件。
在后期的维护中,我们只需改.xml文件,大大降低了维护成本。(我们做一些小项目感觉良好,其实改类源代码的成本是很高的)

第一步:完成数据库,表的建立
比较简单
在这里插入图片描述

第二步:导入mybatis相关的jar包(直接导入到父maven,以便所有的子maven项目都能使用到(不懂的去学习maven))
在这里插入图片描述

第三步:编写mybatis核心配置文件

<?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">
<!--mybatis核心配置文件-->
<configuration>
<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mytext?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="zll"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
<!--    每一个mapper.xml都需要在这个配置-->
    <mappers>
        <mapper resource="com/lei/dao/UserMapper.xml"/>
    </mappers>
</configuration>

第四步:编写mybatis工具类

package com.lei.utils;

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;

public class MybatisUtils{

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
//            使用mybatis,获取SqlSessionFactory,找到核心配置文件
            String resource = "mybatls.config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //有了SqlSessionFactory -->去获取SqlSession连接
    public static SqlSession getSession(){
        return sqlSessionFactory.openSession();
    }

}

第五步:创建实体类
在这里插入图片描述

第六步:编写Mapper接口类()

在这里插入图片描述

第七步:编写Mapper.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-绑定一个对应dao/mapper接口-->
<mapper namespace="com.lei.dao.UserDao">
<!--    select查询语句,id对应接口中的方法;resultType返回结果-->
    <select id="getUserList" resultType="com.lei.pojo.User">
  select * from user1
 </select>
</mapper>

第八步:编写测试类

package com.lei.dao;

import com.lei.pojo.User;
import com.lei.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserDaoTest {
        @Test
        public void getUserList() {
//            1.获取sqlsession对象
            SqlSession session = MybatisUtils.getSession();
            //方法一:
            //List<User> users = session.selectList("com.kuang.mapper.UserMapper.selectUser");
            //方法二:
//            2.getmapper
            UserDao userDao = session.getMapper(UserDao.class) ;
            List<User> users = userDao.getUserList();
            for (User user: users){
                System.out.println(user);
            }
            session.close();
        }
    }

九,运行测试,成功的查询出来数据,ok!!!
在这里插入图片描述

在这里插入图片描述
坑一:SSL安全套接层协议,

1识别认证用户和服务器
2.保证数据能够正确发送到客户和服务器
3.对数据进行加密
4.防止数据在传输过程被窃取
5.维护数据的完整性,确保数据在传输过程中不能改变
按理说Userssl=True是好的,但偏偏提示SSL…communication link 失败,,改成=false

在这里插入图片描述
坑二maven静态资源过滤失败

(如报错找不到xx.xml,检查代码无错,但到target下确实找不到,方法一,复制src下的.xml到target相应位置。
方法二在父maven里,添加如下代码)

在这里插入图片描述

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

练习强化二:Mybatis实现CRUD操作及配置解析

需求1,根据id查询用户

—>一般在mybatis中使用select标签处理查询操作

1.在UserDao中添加对应方法

User selectUserById(int id);

2.在UserMapper.xml中添加select语句

<select id="selectUserById" resultType="com.lei.pojo.User">
select * from user1 where id=#{id}</select>

3.在测试类中生成测试方法

        @Test
    public void selectUserById(){
//            获取sqlsession对象
            SqlSession session = MybatisUtils.getSession();
            UserDao userDao=session.getMapper(UserDao.class);
            User user=userDao.selectUserById(1);
            System.out.println(user);
            session.close();
        }
    

4结果
在这里插入图片描述
需求2:,根据密码和名字查询用户
1.在UserDao中添加方法
①在参数前@param
在这里插入图片描述

User selectUserByNP(@Param("username")String username,@Param("password")String password);

②运用万能的Map,参数直接传递map

User selectUserByNP(Map<String,Object> map);

2.在UserMapper.xml中添加select语句

<select id="selectUserByNP"  resultType="com.lei.pojo.User">
    select * from user1 where username=#{username} and password=#{password}
</select>

<select id="selectUserByNP" parameterType="map" resultType="com.lei.pojo.User">
    select * from user1 where username=#{username} and password=#{password}
</select>

3.测试类

   @Test
public void selectUserByNP(){
        //            获取sqlsession对象
        SqlSession session = MybatisUtils.getSession();
        UserDao userDao=session.getMapper(UserDao.class);

        User user =userDao.selectUserByNP("小芳","123456");
        System.out.println(user);
        session.close();
    }

@Test
public void selectUserByNP(){
        //            获取sqlsession对象
        SqlSession session = MybatisUtils.getSession();
        UserDao userDao=session.getMapper(UserDao.class);

        Map<String,Object> map=new HashMap<String, Object>();
        map.put("username","小芳");
        map.put("password","123456");
        User user =userDao.selectUserByNP(map);
        System.out.println(user);
        session.close();
    }

4,结果
在这里插入图片描述

总结:上面的两种方法都可以输出我们的结果,
对比,参数很多时,使用Map,我们在接口类UserDao中,不用一直往下写。参数少时,可以直接@Param

需求3,给数据库增加一个用户

—>使用insert标签

1.在接口类UserDao添加对应方法

User addUser(User user);

2.在UserMapper.xml中添加insert语句

<insert id="addUser" parameterType="com.lei.pojo.User">
    insert into user1(id,username,password,email) values (#{id},#{username},#{password},#{email})
</insert>

3.测试

  @Test
    public void testaddUser(){
            //            获取sqlsession对象
            SqlSession session = MybatisUtils.getSession();
            UserDao userDao=session.getMapper(UserDao.class);

            User user=new User(4,"小雷","4444444","lei@123");
           userDao.addUser(user);

            session.commit();
//            注意,增,删,改操作需要提交事务,不写的话不会提交到数据库
            session.close();
        }

结果
在这里插入图片描述
需求4,修改用户的信息

—>update标签

1.在接口类UserDao添加对应方法

int updateUser(User user);

2.在UserMapper.xml中添加insert语句

<update id="updateUser" parameterType="com.lei.pojo.User">
    update user1 set username=#{username},password=#{password} where id=#{id}
</update>

3.测试

 @Test
public void testupdateUser(){
        //            获取sqlsession对象
        SqlSession session = MybatisUtils.getSession();
        UserDao userDao=session.getMapper(UserDao.class);

        User user=userDao.selectUserById(1);
        user.setUsername("xiao");
        userDao.updateUser(user);
        session.commit();
        session.close();
    }

4.结果
在这里插入图片描述
需求5,删除一个用户

–>delete标签

1.在接口类UserDao添加对应方法

int deleteUser(int id);

2.在UserMapper.xml中添加insert语句

<delete id="deleteUser" parameterType="com.lei.pojo.User">
    delete from user1 where id=#{id}
</delete>

3.测试

    @Test
public void testdeleteUser(){
        //            获取sqlsession对象
        SqlSession session = MybatisUtils.getSession();
        UserDao userDao=session.getMapper(UserDao.class);

        userDao.deleteUser(1);
        session.commit();
        session.close();
    }

4.结果
在这里插入图片描述

Mybatis小结与延伸

1.所有的增删改操作都要提交事务,确保数据库相应改变,(例:test里,session.commit)

2.在mybatis核心配置文件中

configuration(配置) properties(属性) settings(设置) typeAliases(类型别名)
typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境配置)
environment(环境变量) transactionManager(事务管理器) dataSource(数据源)
databaseIdProvider(数据库厂商标识) mappers(映射器)
注意元素节点的顺序!顺序不对会报错 ①mybatis可以有多个运行环境,default指定 在这里插入图片描述
②dataSource数据源,有三种内建的数据源类型(UNPOOL\POOLED\JNDI)
也可以有很多第三方的实现:dbcp,c3po,druid等
在这里插入图片描述
③mappers映射器
在这里插入图片描述
mapper resource :相对类路径资源引用 mapper url: 绝对路径 mapper class:
要求接口名和.xml名一致 package name : 包下全部的.xml映射。要求接口名和.xml名一致
在这里插入图片描述

在这里插入图片描述

3.Mapper文件
在这里插入图片描述
在这里插入图片描述

Mybatis的强大在于它的映射语句,通过上面的操作,很清楚的得到,与jdbc代码相比,的确的减少了90%的代码量。Mybatis为聚焦SQL而构建,尽可能减少麻烦

4.properties优化数据库连接
通过properties文件的子元素来连接数据库
1.在resource下新建.properties文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf8
username=root
password=123456

2.在mybatis核心配置文件做更改
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
测试,操作,查看配置是否成功

5.生命周期和作用域
1.Mybatis执行过程图
在这里插入图片描述
2.回顾整体梳理
在maven中导入Mabatis
–>编写mybatis核心文件–>编写mybatisUtils工具类
在这里插入图片描述
—>编写实体类,接口—>测试类
在这里插入图片描述

从我们的编写案例中看出,Mybatis的执行所需域自然而然的使用着。

3.作用域理解

SqlSessionFactoryBuilder 的作用在于创建
SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建
SqlSessionFactory 的方法中,而不要让其长期存在。因此 SqlSessionFactoryBuilder
实例的最佳作用域是方法作用域(也就是局部方法变量)。

SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象。因为 MyBatis
的本质就是 Java 对数据库的操作,所以 SqlSessionFactory 的生命周期存在于整个 MyBatis
的应用之中,所以一旦创建了 SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用,所以可以认为
SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。

SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的
commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给
SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally…
语句来保证其正确关闭。 所以 SqlSession 的最佳的作用域是请求或方法作用域。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值