• MyBatis简单实例


    ---直接贴代码

    (1)User.Java

    package me.gacl.domain;    

    /**  

    * @author gacl  

    * users表所对应的实体类  

    */  

    public class User {      

    //实体类的属性和表的字段名称一一对应     

    private int id;     

    private String name;     

    private int age;       

    public int getId() {         

    return id;     

    }       

    public void setId(int id) {         

    this.id = id;     

    }       

    public String getName() {         

    return name;     

    }       

    public void setName(String name) {

             this.name = name;     

    }       

    public int getAge() {

             return age;     

    }       

    public void setAge(int age) {  

            this.age = age;     

    }       

    @Override     

    public String toString() {         

    return "User [id=" + id + ", name=" + name + ", age=" + age + "]";    

      }  }

    (2)UserMapper.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">
     <!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
     例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后缀)
      -->
     <mapper namespace="me.gacl.mapping.userMapper">
         <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
         使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
         resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
         User类就是users表所对应的实体类
         -->
         <!--
             根据id查询得到一个user对象
          -->
         <select id="getUser" parameterType="int"
             resultType="me.gacl.domain.User">
             select * from t_user where id=#{id}
         </select>
     </mapper>

     (3)conf.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>
         <environments default="development">
             <environment id="development">
                 <transactionManager type="JDBC" />
                 <!-- 配置数据库连接信息 -->
                 <dataSource type="POOLED">
                     <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
                     <property name="url" value="jdbc:oracle:thin:@132.224.24.118:1521:jsfx" />
                     <property name="username" value="sett_analyse" />
                     <property name="password" value="g4el_yj_ha" />
                 </dataSource>
             </environment>
         </environments>
         <mappers>
            <!-- 注册userMapper.xml文件,
            userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml-->
                     <mapper resource="me/gacl/mapping/userMapper.xml"/>
                          </mappers>
        
     </configuration>

    (4)Test1.java

    package me.gacl.test;

    import java.io.IOException; import java.io.InputStream; import java.io.Reader; import me.gacl.domain.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder;

    public class Test1 {

        public static void main(String[] args) throws IOException {        

    //mybatis的配置文件        

    String resource = "conf.xml";        

    //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)        

    InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);        

    //构建sqlSession的工厂        

    SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);        

    //使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)        

    //Reader reader = Resources.getResourceAsReader(resource);        

    //构建sqlSession的工厂        

    //SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);        

    //创建能执行映射文件中sql的sqlSession        

    SqlSession session = sessionFactory.openSession();        

    /**          * 映射sql的标识字符串,         

    * me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,         

    * getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL         

    */        

    String statement = "me.gacl.mapping.userMapper.getUser";//映射sql的标识字符串        

    //执行查询返回一个唯一user对象的sql        

    User user = session.selectOne(statement, 1);                

    System.out.println(user);    

    } }

    Mybatis访问数据库的步骤:

    (1)加载配置文件,

    (2)获取SqlSessionFactory工厂

    (3)获取sqlSession

    (4)获取执行器Executor

    (5)Mapper statement对象(包含输入输出)

     ---总结

    (1)映射文件中resultType对应的是单条记录的类型,所以就算返回的是一个对象的集合,这里也和返回一个对象的类型一样

    (2)${}表示拼接 like '%${value}%',但是这种写法会引起sql注入,例如1=1 or

    (3)在配置文件中配置别名typeAlias      mapper.xml中就可以使用别名,批量别名用package

    注意:

    在配置文件中引用映射文件时有3中方法:

    (1)通过Resource加载单个映射文件

    (2)通过mapper接口加载单个文件

    <mapper class=...../>

    (3)批量加载mapper映射文件

    <package name=..../>

    第(2)(3)中方式规定:指定mapper接口类名和mapper.xml映射文件名保持一致,且在同一个目录下,前提是使用mapper代理的方法

    2、mybatis可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发

    默认支持的别名:

    类似String  string

    Integer integer

    单个别名定义:

    <typeAliases>

    <typeAlias tpye="全路径类名"  alias="别名"/>

    </typeAliases>

    批量定义别名

    <package name=""/>//别名就是类名,大小写都可以

    resultMap可以实现延迟加载,resultType无法实现延迟加载。

    一对一关联的时候,如果关联表的字段有一样的情况下,<resultMap>标签的列名column写之前,要在select语句中对相同列名定义别名,这是

    column用别名代替,不能按照数据库表字段映射;

    例如:

     <association property="user" javaType="me.gacl.domain.User">
       <id column="user_id" property="id" />
       <result column="userName" property="userName" />
       </association>
       
     </resultMap>
      
       <select id="findCustomeUser"  resultMap="bbb">
      
       select user.id,user.name as userName, customers.id,customers.name,customers.user_id from
       customers,user where customers.user_id = user.id
      
       </select>

    如果不加别名,会导致user对象的username属性取值不正确

    延迟加载:association、collection自带延迟加载的功能

    setting配置:

     <settings>
         <setting name="lazyLoadingEnabled" value="true"/>
         <setting name="aggressiveLazyLoading" value="false"/>
         </settings>

    java文件中写法:

    @Test
     public void queryCustomerUserLazy(){
      
      SqlSession sqlSession = sessionFactory.openSession();
      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
         Customers customers = userMapper.queryCustomerUserLazy(48);
         //当调用customer.getUser()方法后才可以加载user的值
         User user = customers.getUser();
         System.out.println(user);
      
     }
     Mapper.xml:

    <!-- 实现延迟加载 -->
       <resultMap type="me.gacl.domain.Customers" id="cc">
       <id column="id" property="id"/>
       <result column="name" property="name"/>
       <result column="user_id" property="user_id"/>
       <association property="user" javaType="me.gacl.domain.User"
        select="me.gacl.mapping.UserMapper.queryUser" column="user_id">
        </association>
       </resultMap>
      <select id="queryCustomerUserLazy" parameterType="int" resultMap="cc">
      select * from customers where id=#{id}
      </select>
      <select id="queryUser" parameterType="int"  resultMap="dd">
      select * from user where id = #{value}
      </select>
      <resultMap type="me.gacl.domain.User" id="dd">
      <id column="id" property="id"/>
      <result column="username" property="name"/>
      </resultMap>

    延迟加载的思考:

    不使用mybatis提供的association、collection中延迟加载的功能,如何实现延迟加载呢?

    实现方法如下:

    定义2个mapper方法,分别调用

    什么是查询 缓存:

    mybatis提供查询缓存,用户减轻数据的压力,提供数据库性能

    mybatis提供一级缓存、二级缓存

    修改、添加、删除后commit会清空一级缓存区域

    二级缓存是mapper级别的缓存,除了在conf.xml配置文件中添加配置:

    <setting name="cacheEnabled" value="true"/>

    在映射文件中也要开启:

    <mapper namespace="......">

    <cache/>//开启本mapper的namespace下的 二级缓存

    可能需要对pojo实现序列化 具体不懂

    这样配置后再每一个statement中 useCache默认是true 开启二级缓存

    刷新缓存:flushCache="true"

    总结:一般下执行完commit操作都需要刷新缓存,flushCache=true表示刷新缓存,这样可以避免数据库脏读。

  • 相关阅读:
    StructureMap经典的IoC/DI容器
    移植的7zip到Vxworks 取名vx7zip
    试验Boost在Vxworks上的应用日记 三
    Log4cpp 崩溃
    试验Boost在Vxworks上的应用日记 一
    Vx7zip改进
    GoAhead 2.5 Web Server 网页ROM化的改进
    试验Boost在Vxworks上的应用日记 二
    原来CoreBluetooth 只支持Bluetooth Low Energy
    可变长结构体
  • 原文地址:https://www.cnblogs.com/muliu/p/5653827.html
Copyright © 2020-2023  润新知