day052_mybatis

Mybatis框架

mybatis是一个半ORM框架,它可以让程序员只关注sql语句,其他jdbc步骤不用关心.

Mybatis框架: 是方便开发==Dao层(持久层)==代码.

注意:官网: mybatis – MyBatis 3 | 简介

完全的ORM框架,可以实现"全自动",即只要根据ORM要求,将数据表和实体类设计的完全对应,那么在项目中就可以不用写SQL,由框架自动生成.

例如: Hibernate , Jpa , MybatisPlus , tk-mapper

使用流程

1.创建maven-java项目

2.加入对应依赖

<dependencies>
        <!--   mybatis的依赖     -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <!-- jdbc驱动包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
    </dependencies>

mybatis全局配置文件

名称:常用mybatis-config.xml或者sqlconfing.xml等

格式:xml格式

位置:mian 的resource下

内容

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 根标签 固定的 -->
<configuration>
    <!--  jdbc环境  -->
    <environments default="development">
        <environment id="development">
            <!-- 事务管理:jdbc管理 -->
            <transactionManager type="JDBC"/>
            <!-- 数据源配置:
                type:POOLED,池化技术,使用数据库连接池
            -->
            <!--
                jdbc连接属性
            -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/java2212"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- 加载映射文件 -->
        <!--加载接口文件 加载sql语句以及接口方法 -->
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

mybatis框架简化dao层,并改名为mapper

package com.qf.mapper;

import com.qf.model.User;

/**
 * 现在使用了Mybatis后,统一将包名替换成mapper,接口名替换成XxxMapper.java
 */
public interface UserMapper {
   

    User findUserById(int id);

}

mybatis 的映射文件

<!-- 
	以前,是写完Dao层接口,需要写Dao层实现类,在实现类中写JDBC
 	现在,是写完Mapper层接口,需要写Mapper接口的xml映射文件,其中写sql语句
-->
<!--
 映射文件名称: 模块名Mapper.xml
 映射文件格式: xml
 映射文件位置: 放在resources下,(后续也可以放在mapper包下...)
-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
    mapper跟标签
      namespace="该映射文件对应的接口文件的全限定名"
 -->
<!--namespace选择进行下部操作的接口 -- >
<mapper namespace="com.qf.mapper.UserMapper">
    <!--mysql的增删改查均在mappper标签内进行  -->
    <!--
      select 标签用于查询(后续还有其他标签)
        id: 接口中的方法名
        resultType: 结果类型,是查询返回的结果集要封装的那个类(这一步就是自动ORM)
        parameterType: 接口中方法的参数类型
    -->
    <select id="findUserById" resultType="com.qf.model.User" parameterType="int">
        <!--
            以前此处写的 where id = ?
            现在此处写 where id = #{},当接口的参数是简单类型时,此处任意,
            但是接口的参数是复杂类型是就有限制,后续再说
            此时,{}内的与方法参数名一致即可
         --> 
        select * from  user where id = #{id}
    </select>
</mapper>

测试

1.加入测试依赖

2 在方法上加上@Test注解

3 单元测试的方法,一定要是无返回值,void

 <!--  单元测试  -->
     <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.13.2</version>
         <scope>test</scope>
     </dependency>

执行流程

  1. 通过配置文件逻辑,获得文件流
  2. 通过流获得SqlSessionFactory
  3. 通过工厂获得SqlSession
  4. 通过SqlSession获得接口的代理对象
  5. 通过接口对象调用方法执行
  6. 其实执行的是接口方法对应的xml中的标签内的sql语句

1.查询

接口方法的参数是单个

UserMapper

UserMapper.xml

TestMybitis

 Users findUserById(int id);
<select id="findUserById"  resultType="com.qf.model.Users" parameterType="int">
        <!--
            以前此处写的 where id = ?
            现在此处写 where id = #{},当接口的参数是简单类型
时,此处任意,
            但是接口的参数是复杂类型是就有限制,后续再说
            此时,{}内的与方法参数名一致即可
         -->
        select * from users where id = #{id}
    </select>
@Test
    public void hello() throws Exception {
   
        // 配置文件路径
        String resource = "mybatis-config.xml";
        // 通过配置文件,获得输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 通过流获得SqlSession工厂
        // SqlSession就是一次与SQL的交互
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 动态代理的模式
        // 可以通过接口得到对应的映射文件,从而让映射文件执行
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Users users = mapper.findUserById(1);
        System.out.println(users);
    }

接口方法的参数是多个

Users findUserByLogin(@Param("name") String name ,@Param("password") String password);
<select id="findUserByLogin" resultType="com.qf.model.Users">
        select * from users where name = #{name} and password = #{password}
    </select>
    @Test
    public void find() throws IOException {
   
        // 配置文件路径
        String resource = "mybatis-config.xml";
        // 通过配置文件,获得输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 通过流获得SqlSession工厂
        // SqlSession就是一次与SQL的交互
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 动态代理的模式
        // 可以通过接口得到对应的映射文件,从而让映射文件执行
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Users userByLogin = mapper.findUserByLogin("李四", "123");
        System.out.println(userByLogin);
    }

接口方法的参数是对象类型

Users findUserByUsers(Users users);
<select id="findUserByUsers" resultType="com.qf.model.Users" parameterType="com.qf.model.Users">
        select * from users where name = #{name} and password = #{password}
    </select>
 @Test
    public void user() throws IOException {
   
        // 配置文件路径
        String resource = "mybatis-config.xml";
        // 通过配置文件,获得输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 通过流获得SqlSession工厂
        // SqlSession就是一次与SQL的交互
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 动态代理的模式
        // 可以通过接口得到对应的映射文件,从而让映射文件执行
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Users userByUsers = mapper.findUserByUsers(new Users(1,"李四","123"));
        System.out.println(userByUsers);
    }

接口方法的参数是Map

Users findUserByLoginMap(Map<String,String> map);
<select id="findUserByLoginMap" resultType="com.qf.model.Users" parameterType="Map">
        select * from users where name = #{name} and password = #{password}
    </select>
 @Test
    public void mapUsers() throws IOException {
   
        // 配置文件路径
        String resource = "mybatis-config.xml";
        // 通过配置文件,获得输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 通过流获得SqlSession工厂
        // SqlSession就是一次与SQL的交互
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 动态代理的模式
        // 可以通过接口得到对应的映射文件,从而让映射文件执行
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap<String, String> map = new HashMap<>();
        map.put("name","李四");
        map.put("password","123");
        Users userByLoginMap = mapper.findUserByLoginMap(map);
        System.out.println(userByLoginMap);
    }

接口方法的参数是List

 List<User> findAllUser();
<!--
        查询返回一个对象,还是List集合,resultType指定的都是要封装的实体类类型
        特别注意:不是List
      -->
    <select id="findAllUser" resultType="com.qf.model.User">
        select * from user
    </select>

删除【重要】

 int deleteUserById(int id);
<delete id="deleteUserById" parameterType="int">
     <!-- 删除使用<delete>标签
        没有resultType属性,默认返回int类型数据-->
        delete from users where id = #{id}
    </delete
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值