Mybatis入门

Posted JunMain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis入门相关的知识,希望对你有一定的参考价值。

Mybatis入门

先创建空的Maven项目

Maven仓库中找依赖包

先Maven的pom.xml中添加Mybatis的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>


    <build>
        <resources>
            <resource>
                <directory>scr/main/resource</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>

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

    <dependencies>

    <!--    mybatis的依赖  -->

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

    <!--    mysql连接依赖 6以下的  -->

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

    <!--    Junit单元测试依赖     -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    <!--    mybatis分页依赖      -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.10</version>
        </dependency>

    <!-- log4j日志       -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>

    </dependencies>
    
    
    <!-- 
	原因:中文操作系统编码为GBK,MAVEN安装后默认使用系统编码GBK,导致在编译UTF-8格式的源代码文件时出现编码不匹配的问题。
	-->   
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
</project>

在src/main/resource/下面创建mybatis-config.xml配置文件

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">

<!--cofiguration核心配置文件 -->
<configuration>
  
    
    <environments default="development">		<!-- 环境配置-->
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>	<!--事务管理默认JDBC -->
            <dataSource type="POOLED">
                
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                
                <!-- 如果是驱动6以上url还要加一个时区-->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?			   useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>	
                
                <property name="username" value="${database.username}"/>
                
                <property name="password" value="${database.password}"/>
                
            </dataSource>
        </environment>
    </environments>

    <!-- 每一个Mapper.xml文件都要在configuration核心配置文件中配置-->
    <mappers>
        <mapper resource="com/lzj/dao/xxxMapper.xml"></mapper>
    </mappers>

</configuration>

编写Mybatis的工具类

package com.lzj.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 {
            //获取SqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    //有了SqlSessionFactory工厂对象,就能获取SqlSession实例了
    //SqlSession包含了面向数据库执行sql命令所需要的方法
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }

}

dao接口

package com.lzj.dao;

import com.lzj.entity.User;

import java.util.List;

public interface UserDao {
    //获取所有用户对象
    List<User> getUserList();
}

接口实现类.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绑定后面接口   的实现类-->
<mapper namespace="com.lzj.dao.UserDao">
<!--    id是实现的方法名字-->
<!--    resultType返回的是一个对象全类名-->
    
    <!-- 
		resultType 将查询的结果返回User对象
		由于是select * from user
		返回的是User对象的集合
		所以自动创建了一个User的 线性表
		所以接口是List<User>
		
	-->
    <select id="getUserList" resultType="com.lzj.entity.User">
        select * from mybatis.user
    </select>
</mapper>

Junit单元测试

package com.lzj.dao;

import com.lzj.entity.User;
import com.lzj.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserMapperTest {
    @Test
    public void test(){

        //1. 获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        //2. 执行sql
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> users= userDao.getUserList();

        for (User user : users){
            System.out.println(user);
        }

        //3. 关闭SqlSession
        sqlSession.close();

    }
}

注意点:org.apache.ibatis.binding.BindingException: Type interface com.lzj.dao.UserDao is not known to the MapperRegistry.

Mapper.xml没有在Mybatis核心配置文件中注册

/*
报错:绑定异常
	org.apache.ibatis.binding.BindingException: Type interface com.lzj.dao.UserDao is not known to the MapperRegistry.
*/
<!-- 配置-->
    <mappers>
    	<mapper  resource="com/lzj/dao/UserMapper"></mapper>    
    </mappers>

还是报错

Could not find resource com/lzj/dao/UserMapper
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)

没有找到资源路径

由于Maven约定大于配置,我们写的配置文件可能到处失败,因为默认的资源目录是在resource目录下

资源过滤问题




我们发现target下面没有UserMapper.xml文件除非自己拷贝,但是每一次自己拷贝太麻烦了

解决办法,手动导入pom.xml之中

<!-- 在build中配置resource, 防止我们导出资源失效-->
<build>
	<resources>
    	<resource>
        	<directory>scr/main/resource</directory>
            <includes>
            	<include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        
        <resource>
        	<directory>src/main/java</directory>
            <includes>
            	<include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
             <filtering>true</filtering>
        </resource>
    </resources>
</build>

但是又报错了

因为我们数据库里面有中文

在pom.xml里面加上

<!-- 
	原因:中文操作系统编码为GBK,MAVEN安装后默认使用系统编码GBK,导致在编译UTF-8格式的源代码文件时出现编码不匹配的问题。
-->   

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

最后结果

MyBatis如何执行sql语句

SqlSessionFactoryBuilder 获取SqlSessionFactory

SqlSessionFactory 获取SqlSession

SqlSession.getMapper(Dao.class) 获取接口的实现类

调用实现类的函数-----》执行sql

此外,每次执行SqlSession都要关闭


创建一个Mybatis程序的步骤


首先我们先创建一个空的Maven项目
    1.先配置pom.xml文件
    	注意事项:	
    		(1)先导入Mybatis的依赖
    		(2)<build>标签进行resources的配置将java路径下的配置文件相当于放到resources目录下 	
    		(3)	<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    				</properties>
    				解决中文乱码编译不通过的报错
    
    2. 配置Mybatis-config.xml配置文件
    	注意事项:
    		(1) configuration核心配置文件联建数据库
    		(2)	<mappers><mapper resource="com/lzj/dao/xxxMapper.xml"></mapper></mappers>
    				将xxxMapper.xml再核心配置文件中注册绑定,相当于告诉系统xxxMapper.xml是xxx接口的实现类
    				后期系统自动创建
    		

    3. 获取SqlSession
    	自己写一个工具列MyBatis获取SqlSession
    		SqlSessionFactoryBuilder->SqlSessionFactory->SqlSession
    
    4.	编写DAO接口
    
    5. 	编写实现类 xxxMapper.xml
    	 注意事项:
			(1)	<mapper namespace = "com.lzj.dao.xxxDAO">	绑定接口
            (2)	各个查询标签的id对应着接口中的方法
   
     
	 6. 如何执行sql语句
           先调用Mybatis获取SqlSession实现对象 
           sqlSession.getMapper(xxxDAO.class)获取接口的实现类
			调用实现类的的函数,------>调用sql语句












增删改查

1.namespace的绑定的包名,要和接口的包名一致

2.select 选择查询

  • id: 对应namespace的方法名

  • resultType: 返回值得类型

  • parameterType: 传递参数的类型

    举例		通过id查询user
        
        //只要该三个地方, 接口, Mapper添加一个标签, 测试了获取Sqlsession
        
       //测试类
        @Test
        public void test01(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            
            UserDao userDao = sqlSession.getMapper(UserDao.class);
            User user = userDao.getUserById(688);
    
            System.out.println(user);
            
            sqlSession.close();
        }
        
    	//接口
        public interface UserDao {
            //获取所有用户对象
            List<User> getUserList();
    
            //通过id获取对象
            User getUserById(int id);
        }
    
    
    //Mapper.xml添加标签
    	   <select id="getUserById" resultType="com.lzj.entity.User" 	 	parameterType="int">
            select * from user where id = #{id}
        </select>
    
    
        
        
        
        
        
        
        
    

3.insert 插入操作

注意增删改都需要提交事物才能执行 sqlSession.commit()

测试类

  @Test
    public void testAddUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserDao userDao = sqlSession.getMapper(UserDao.class);
        userDao.addUser(new User("沙冕","899","20010118"));

        sqlSession.commit();
        sqlSession.close();
    }

接口类

package com.lzj.dao;

import com.lzj.entity.User;

import java.util.List;

public interface UserDao {
    //获取所有用户对象
    List<User> getUserList();

    //通过id获取对象
    User getUserById(int id);

    //插入一个对象
    void addUser(User user);
}

接口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后面接口 的实现类-->
<mapper namespace="com.lzj.dao.UserDao">
<!--    id是实现的方法名字-->
<!--    resultType返回的是一个对象全类名-->
    <select id="getUserList" resultType="com.lzj.entity.User">
        select * from user
    </select>

    <select id="getUserById" resultType="com.lzj.entity.User" parameterType="int">
        select * from user where id = #{id}
    </select>

    <insert id="addUser" parameterType="com.lzj.entity.User" >
        insert into

以上是关于Mybatis入门的主要内容,如果未能解决你的问题,请参考以下文章

markdown [mybatis参考]关于mybatis #mybatis的一些片段

推荐net开发cad入门阅读代码片段

MyBatis入门详解——附代码

MyBatis从入门到精通—MyBatis基础知识和快速入门

MyBatis从入门到入土——使用详解

myBatis简单入门