• 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文件中加一个空格或者空行然后保存

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

  • 相关阅读:
    seata 1.3.0 seata Global lock wait timeout
    Tika解析word文件
    我的第一款微信小程序:iteye附件下载器,希望大家好好爱惜
    读书《尸检报告》 [英]卡拉·瓦伦丁 / 中信出版集团2019-08
    读书《另一种选择》 [美] 谢丽尔·桑德伯格 / 中信出版集团2017-08
    读书《不朽的失眠》 张晓风 / 四川人民出版社2018-09
    Uniapp 修改内置组件样式无效解决方法
    Android studio中.9图片的含义及制作教程
    Diff算法
    js new一个对象的过程,实现一个简单的new方法
  • 原文地址:https://www.cnblogs.com/lgg20/p/11234273.html
Copyright © 2020-2023  润新知