mybatis学习一

初入简单介绍:

MyBatis框架主要是围绕着SqlSessionFactory这个类进行的:

SqlSessionFactory是一个sql会话工厂,在这个工厂里面取得一个session会话丢给客户端使用。可以理解为,session是由SqlSessionFactory制造的,需要session的时候直接去工厂里面拿一个,用完了还回来。

sqlSessionFactory是ORM框架Hibernate一个数据库session的连接工厂配置,更像一种连接池管理类,每次的数据操作都将由连接池来分配连接后进行。

需要导入hibernater的相关的jiar包: 地址: https://github.com/zjllovecode/SSH-

这个sqlSessionFactory的创建过程如下几种方法:

  1. 定义一个Configuration对象,其中包含数据源、事务、mapper文件资源以及影响数据库行为属性设置settings
  2. 通过配置对象,则可以创建一个SqlSessionFactoryBuilder对象
  3. 通过 SqlSessionFactoryBuilder 获得SqlSessionFactory 的实例。
  4. 通过与Spring集成,由Spring容器管理创建
一、通过Configuration.xml配置文件进行创建
  1.配置文件:
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="ssm/jdbc.properties"></properties>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClassName}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

  <mappers>
    <mapper resource="mapper/User.xml"/>
  </mappers>

</configuration>
2.读取配置文件:
import java.io.IOException;
import java.io.Reader;
 
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 com.sm.model.User;
 
public class GetSqlSessionFactoryFromXML {
 
    public static void main(String[] args) throws IOException {
        //配置文件的名称
        String resource = "ssm/configuration.xml";
        //通过Mybatis包中的Resources对象很轻松的获取到配置文件
        Reader reader = Resources.getResourceAsReader(resource);
        //通过SqlSessionFactoryBuilder创建
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //获得session实例
        SqlSession session =sqlSessionFactory.openSession();
        User user = new User();
        user.setId(8);
        //完成数据库的插入
        session.insert("add", user);
        session.commit();
        session.close();
        System.out.println(sqlSessionFactory);
    }
}
三、通过与Spring集成,由Spring容器管理创建

1. 在spring的配置文件applicationContext.xml中配置

<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
       <property name="dataSource" ref="dataSource" />
       <property name="configLocation" value="classpath*:conf/configuration.xml"/>
     
</bean>

mysql自增主键返回:

查询id的sql:SELECT LAST_INSERT_ID()

通过修改User.xml映射文件,可以将mysql自增主键返回,如下添加selectKey 标签:

修改上面的user.xml如下:

复制代码
 <insert id="addUser" parameterType="com.yyb.pojo.User" >
        <!-- selectKey 标签实现主键返回 -->
        <!-- keyColumn:主键对应的表中的哪一列 -->
        <!-- keyProperty:主键对应的pojo中的哪一个属性 -->
        <!-- order:设置在执行insert语句前执行查询id的sql,该值在执行insert语句之后执行查询id的sql -->
        <!-- resultType:设置返回的id的类型 -->
        <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
            SELECT LAST_INSERT_ID()
        </selectKey>
      INSERT into USER(username,birthday,address,sex) VALUES (#{username},#{birthday},#{address},#{sex})
    </insert>
复制代码

-----------执行完后,取值即可 :  System.out.println(user.getId());

mybatis查询的2方式:

第一种:原始dao开发。存在重复代码。

package cn.itcast.mybatis.po;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址


    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", sex=" + sex
                + ", birthday=" + birthday + ", address=" + address + "]";
    }
}
View Code

4、在resources下加入log4j.properties和SqlMapConfig.xml配置文件

mybatis默认使用log4j作为输出日志信息。log4j.properties配置如下:

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
SqlMapConfig.xml:

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

    <!-- 和spring整合后 environments配置将废除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://192.168.1.20:3306/test?" />
                <property name="username" value="root" />
                <property name="password" value="root123" />
            </dataSource>
        </environment>
    </environments>
    
     <mappers>
        <mapper resource="mapper/User.xml"/>
    </mappers>
    
</configuration>

在resources下创建一个mapper文件夹,添加User.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:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="test">
    <!-- id:statement的id 或者叫做sql的id-->
    <!-- parameterType:声明输入参数的类型 -->
    <!-- resultType:声明输出结果的类型,应该填写pojo的全路径 -->
    <!-- #{}:输入参数的占位符,相当于jdbc的? -->
    <select id="queryUserById" parameterType="int"  resultType="com.yyb.pojo.User">
        SELECT * FROM user WHERE id  = #{id}
    </select>
</mapper>
测试:创建一个sqlsession来执行查询语句:
public class Test {
    @org.junit.Test
    public void func1() {
        String path = "SqlMapConfig.xml";
        InputStream resourceAsStream = null;
        try {
            // 1. 加载SqlMapConfig.xml配置文件
            resourceAsStream = Resources.getResourceAsStream(path);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 2. 创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //3. 创建SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 4. 执行SqlSession对象执行查询,获取结果User
        // 第一个参数是User.xml的statement的id,第二个参数是执行sql需要的参数;
        Object user = sqlSession.selectOne("test.queryUserById", 1);

        // 5. 打印结果
        System.out.println(user);

        // 6. 释放资源
        sqlSession.close();
    }
}
第二种:Mapper动态代理方式:

Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象规则。
比如:
//遵循四个原则
public interface UserMapper { 
    //接口方法名 == User.xml中id名
    //返回值类型 与 Mapper.xml文件中返回值类型要一致
    //入参类型 与 Mapper.xml中入参的类型要一致
    //命名空间 绑定此接口
    public User findUserById(Integer id);
}
mapper文件如下:

<?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"> <!-- 写Sql语句 --> <mapper namespace="com.itheima.mybatis.mapper.UserMapper"> <!-- 通过ID查询一个用户 --> <select id="findUserById" parameterType="Integer" resultType="cn.itcast.mybatis.po.User"> select * from user where id = #{id} </select> </mapper>
resources文件夹下面的SqlMapConfig.xml:

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

     <typeAliases>  
        <typeAlias type="cn.itcast.mybatis.po.User" alias="User" />
         <typeAlias type="com.yyb.pojo.QueryVo" alias="QueryVo" />
    </typeAliases>

    <!-- 和spring整合后 environments配置将废除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://192.168.1.20:3306/test?" />
                <property name="username" value="root" />
                <property name="password" value="root123" />
            </dataSource>
        </environment>
    </environments>
    
    <!--resources下面的mapper文件夹下面的,生成一个mapper.xml  -->
     <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
      
    
</configuration>
测试类:
@Test
public void testMapper() throws Exception { //加载核心配置文件 String resource = "sqlMapConfig.xml"; InputStream in = Resources.getResourceAsStream(resource); //创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //创建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //SqlSEssion帮我生成一个实现类 (给接口) UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findUserById(10); System.out.println(user); }

SqlMapConfig.xml配置文件:

SqlMapConfig.xml中配置的内容和顺序如下:

  1. properties(属性)
  2. settings(全局配置参数)
  3. typeAliases(类型别名)
  4. typeHandlers(类型处理器)
  5. objectFactory(对象工厂)
  6. plugins(插件)
  7. environments(环境集合属性对象)
  8. environment(环境子属性对象)
  9. transactionManager(事务管理)
  10. dataSource(数据源)
  11. mappers(映射器)
    例如:
    <typeAliases>
        <!-- 单个别名定义 -->
        <typeAlias alias="user" type="cn.itcast.mybatis.pojo.User" />
        <!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) -->
        <package name="cn.itcast.mybatis.pojo" />
    </typeAliases>
<!-- 1.加载映射文件 -->

 <mappers>
    <!-- 扫描mappers路径下的mapper映射文件 -->
    <mapper resource="mappers/UserMapper.xml"/>
    <!-- 扫描包下的接口文件 -->  <!-- 批量注册mapper: -->
    <package name="edu.zju.bme.data.manage.mapper" />
  </mappers>

  <!-- 2.或者:mapper扫描 -->
  <property name="mapperLocations" value="classpath:mybatis/*/*.xml"></property>

例如:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="cacheEnabled" value="true" /><!-- 全局映射器启用缓存 --> <setting name="useGeneratedKeys" value="true" /> <setting name="defaultExecutorType" value="REUSE" /> <!--设置启用数据库字段下划线映射到java对象的驼峰式命名属性,默认为false--> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <typeAliases> 别名: <typeAlias type="com.fh.entity.system.User" alias="User" /> <typeAlias type="com.fh.entity.system.Role" alias="Role" /> <typeAlias type="com.fh.entity.system.Menu" alias="Menu" /> <typeAlias type="com.fh.entity.system.MenuList" alias="MenuList" /> <typeAlias type="com.fh.entity.system.Operator" alias="Operator" /> <typeAlias type="com.fh.util.PageData" alias="pd" /> <!-- 分页 --> <typeAlias type="com.fh.entity.Page" alias="Page" /> </typeAliases> <plugins> <plugin interceptor="com.fh.plugin.PagePlugin"> <property name="dialect" value="mysql" /> <property name="pageSqlId" value=".*listPage.*" /> </plugin> </plugins> </configuration>

Mapper配置的几种方法:

1、<mapper resource=" " />,使用相对于类路径的资源(现在的使用方式)。如: <mappers> <mapper resource="sqlmap/User.xml" /></mappers>

2、<mapper class=" " />,使用mapper接口类路径。如:<mappers> <mapper class="cn.itcast.mybatis.mapper.UserMapper"/></mappers>。注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中(使用maven的话,要把xml放到resource目录下,路径要和mapper对应)。

3、<package name=""/>,注册指定包下的所有mapper接口。如:<mappers><package name="cn.itcast.mybatis.mapper"/></mappers>。注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中(使用maven的话,要把xml放到resource目录下,路径要和mapper对应)。

4.在spring的applicationContext.xml中配置全局扫描mapper:

<!-- mapper扫描 -->
<property name="mapperLocations" value="classpath:mybatis/*/*.xml"></property>

一般的原因是Mapper 错误检查:

按以下步骤一一执行:

1:检查xml文件所在的package名称是否和interface对应的package名称一一对应

2:检查xml文件的namespace是否和xml文件的package名称一一对应

3:检查函数名称能否对应上

4:去掉xml文件中的中文注释

5:随意在xml文件中加一个空格或者空行然后保存

一般来说到此就可以排除错误了

原文地址:https://www.cnblogs.com/lgg20/p/11234273.html