MyBatis从浅入深

MyBatis简介

Mybatis用于简化Java当中对于JDBC的操作,它将连接数据库,执行SQL命令自动化实现

框架创建

创建Maven工程

引入三个依赖

  1. Mybatis核心
  2. junit测试
  3. MySQL驱动
<dependencies>
	
	<dependency>
		<groupId>org.mybatisgroupId>
		<artifactId>mybatisartifactId>
		<version>3.5.7version>
	dependency>
	
	<dependency>
		<groupId>junitgroupId>
		<artifactId>junitartifactId>
		<version>4.12version>
		<scope>testscope>
	dependency>
	
	<dependency>
		<groupId>mysqlgroupId>
		<artifactId>mysql-connector-javaartifactId>
		<version>5.1.3version>
		dependency>
dependencies>

根据需要可以更改版本之类的东西

创建Mybatis核心文件

习惯上命名为mybatis-config.xml 存放的位置在src/main/resources目录下

  
DOCTYPE configuration  
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-config.dtd">  
<configuration>  
	  
	<environments default="development">  
		<environment id="development">  
			<transactionManager type="JDBC"/>  
			<dataSource type="POOLED">  
				<property name="driver" value="com.mysql.cj.jdbc.Driver"/>  
				<property name="url" value="jdbc:mysql://localhost:3306/MyBatis"/>  
				<property name="username" value="root"/>  
				<property name="password" value="123456"/>  
			dataSource>  
		environment>  
	environments>  
	  
	<mappers>  
		<mapper resource="mappers/UserMapper.xml"/>  
	mappers>  
configuration>

有几个标签,其中environments是用于配置数据库的环境,这块的type是JDBC,所有的事务是手动提交的。

mappers是用于引入映射文件。

创建mapper接口

Mybatis当中存在面向接口编程

使用JDBC的时候需要将MySQL中的数据转换为Java数据,是使用了反射,所以需要一个实体类对象对应着MySQL当中的表,创建一个User类

创建一个Mapper接口,Mybatis中的Mapper接口相当于以前的dao,

public interface UserMapper{
    int insertUser();
}

类似与上面的接口。

创建映射文件

ORM (Object Relationship Mapping) 对象关系映射

映射文件的命名规则:

  1. 表所对应的实体类名+Mapper.xml
  
DOCTYPE mapper  
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
<mapper namespace="com.atguigu.mybatis.mapper.UserMapper">  
	  
	<insert id="insertUser">  
		insert into t_user values(null,'张三','123',23,'女')  
	insert>  
mapper>

例如上面的,因为我实现了一个insert方法,所以这里的标签就是 然后后面的id是SQL语句的唯一标识,指向你要实现的接口方法。。

MyBatis面向接口编程的两个一致

  1. 映射文件的namespace是要和mapper接口的全类名保持一致
  2. mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致
测试功能(通过junit)
public class UserMapperTest {
    @Test
    public void testInsertUser() throws IOException {
        //读取MyBatis的核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        //获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
        //SqlSession sqlSession = sqlSessionFactory.openSession();
	    //创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交  
		SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //通过代理模式创建UserMapper接口的代理实现类对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句
        int result = userMapper.insertUser();
        //提交事务
        //sqlSession.commit();
        System.out.println("result:" + result);
    }
}

MyBatis提供了一个操作数据库的对象叫SqlSession,所以我们要获取SqlSession。

  1. 加载核心配置文件
  2. 获取SqlSessionFactoryBuilder
  3. 获取SqlSessionFactory
  4. 获取Sqlsession

Sqlsession代表java程序与数据库的会话

一个接口要想实现实例对象,得要有一个实例类,但是Mapper只有接口没有实例类,有一个方法为SqlSession.getMapper(Class)

传入一个T.class的时候会返回一个T的实例对象,这步代码使用的是代理模式

最后直接指向Sql语句即可。

但是要注意的是因为是要手动提交事务,所以得写一个commit方法,才能在数据库当中看到变化。

优化处理

优化Commit

因为是手动的commit,为了不那么麻烦我们可以在创建usermapper对象的时候将自动提交打开

SqlSession sqlSession = sqlSessionFactory.openSession(true);

这样就不用写commit,也可以提交

优化增加日志功能

  1. 添加log4j依赖

    
    <dependency>
    <groupId>log4jgroupId>
    <artifactId>log4jartifactId>
    <version>1.2.17version>
    dependency>
    
    
  2. 加入配置文件

    
    DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
            <param name="Encoding" value="UTF-8" />
            <layout class="org.apache.log4j.PatternLayout">
    			<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
            layout>
        appender>
        <logger name="java.sql">
            <level value="debug" />
        logger>
        <logger name="org.apache.ibatis">
            <level value="info" />
        logger>
        <root>
            <level value="debug" />
            <appender-ref ref="STDOUT" />
        root>
    log4j:configuration>
    

    其中配置文件当中的level value代表日志输出的级别

    其中的优先度为FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试) 从左到右打印的内容越来越详细。

核心配置文件详细说明


DOCTYPE configuration
        PUBLIC "-//MyBatis.org//DTD Config 3.0//EN"
        "http://MyBatis.org/dtd/MyBatis-3-config.dtd">
<configuration>
    
    <properties resource="jdbc.properties">properties>
    <settings>
        
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        
        <setting name="lazyLoadingEnabled" value="true"/>
    settings>
    <typeAliases>
        
        
        
        
        <package name="com.atguigu.mybatis.bean"/>
    typeAliases>
    
    <environments default="mysql_test">
        
        <environment id="mysql_test">
            
            <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>
        
        
        <package name="com.atguigu.mybatis.mapper"/>
    mappers>
configuration>

其中往里面加标签的时候,必须严格遵守(有的标签可以不写,但顺序一定不能乱):properties、settings、typeAliases、typeHandlers、objectFactory、objectWrapperFactory、reflectorFactory、plugins、environments、databaseIdProvider、mapper。

创建包的时候使用\\来写,因为包是标签存在的,在这个地方要是使用.来创建包,会显示一个文件名称为XXX.XXX.XXX,不能体现到标签的用处,这是要注意的。

Mybatis的增删改查

其中Mybatis的增删改都是返回一个整数,为被影响的行数,这和上文的insert插入操作大同小异,这里不做过多赘述。

下面主要要看查的操作:

  
<select id="getUserById" resultType="com.atguigu.mybatis.bean.User">  
	select * from t_user where id = 2  
select>


<select id="getUserList" resultType="com.atguigu.mybatis.bean.User">
	select * from t_user
select>

其中第一个是查一个实体类,第二个是查集合

查询标签当中多了一个叫做resulType的东西,这是因为在MySQL查找到东西返回类型的时候,需要去指定类型返回,resultType是自动映射,属于属性名称和字段名称一致的情况。会直接生成User类对象返回。

还有一种情况是不对应的,这个时候就需要另外一种叫做自定义映射resultMap,用于一对多,或者多对一的情况。

注意:当查询的数据为多条时,不能使用实体类作为返回值,只能使用集合,否则会抛出异常TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合作为返回值。

你可能感兴趣的:(mybatis)