• MyBatis起步


    作用:封装了JDBC操作,简化数据库访问代码。
    封装的功能:
    1.获取连接,执行SQL,释放连接
    2.SQL参数设置(可以直接传入对象,Mybtis会将对象的属性传入SQL语句)
      #{属性值}取代JDBC的?占位符
    3.执行结果映射成实体对象。JDBC中需要开发者自己转换。
    实体类的属性名与查询结果集ResultSet的列名保持一致,结果集有别名的话以别名为属性名。
    开发者工作:写SQL语句和实体类,然后使用SqlSession对象执行SQL操作。

    Mybatis结构

    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>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC" />
                <!-- 配置数据库连接信息 -->
                <dataSource type="POOLED">
                  <property name="driver" value="com.mysql.jdbc.Driver" />
             <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
             <property name="username" value="root" />
             <property name="password" value="XDP" />
           </dataSource>
        </environment>
      </environments>
      <mappers>
        <!--注册uerMapper.xml文件,resource是其路径,通常和实体类在一个目录中,也可单独建一个文件专门放Mapper.xml-->
        <mapper resource="org/tarena/entity/userMapper.xml"/>
      </mappers>
    </configuration>            

    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,通常设置成包名+sql映射的文件名-->
    <mapper namespace="myBatis.test.Demo.userMapper">
    <!-- 在select/insert/delete标签中编写SQL语句;
    设置唯一的id属性,将来SqlSession通过id调用sql语句;
    parameterType指明查询时使用的参数类型。如果参数只有1个则用简单类型,参数为多个时可用Map集合或实体对象,占位符用对象的属性名;
    resultType表示查询结果将要封装成的实体类,也可以为Map类型或基本类型-->
      <select id="getUserByID" parameterType="int" resultType="myBatis.test.User">
        select * from users where id=#{propertyName}
      </select>
      <insert id="save" parameterType="myBatis.test.User">
        insert into user(name,salary,age) values (#{name},#{salary},#{age})
      </insert>
    </mapper>

    获取SqlSession操作sql语句:

    //工具类
    public class MyBatisUtil {
      public static SqlSession getSqlSession {
        //mybatis的配置文件
        String conf = "SqlMapConfig.xml";
        //使用类加载器加载mybatis的配置文件
        InputStream is = MyBatisUtil.class.getClassLoader().getResourceAsStream(conf);
        //构建sqlSession的工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(is);
        SqlSession session = sessionFactory.openSession();
      return session;
      }
    }
    //执行SQL语句 public class TestEMP {   public static void main(String[] args) throws IOException {     SqlSession session=MyBatisUtil.getSqlSession();     //直接返回封装好的对象     User user=session.selectOne("getUserByID",10);     //other word     session.commit(); //增删改必须提交事务     session.close(); //释放session   } }

    返回Map类型的结果集

    如果需要全部字段时可以和实体类映射。如果仅查询部分字段,没必要用实体类封装,可以用Map进行封装,key为列名,value为对应的字段值。
    resultType =”java.util.HashMap”
    当封装的实体对象的属性和查询结果的字段名不一致时,可以将结果集的别名改为和实体对象的属性一致。
    或者使用resultMap属性代替resultType属性,显式指定映射关系。如下所示:

    <!-- type为返回的封装对象,property为实体类属性名,column为表的列名-->
    <!-- 主键用id元素指定匹配规则,非主键用result指定匹配规则;一致时可以省略-->
    <resultMap id="userMap" type="myBatis.test.User">
      <id property="id" column="user_id"></id>
      <result prompt="name" column="name"></result>
    </resultMap>

    Mapper映射接口规则

    需要编写DAO接口的实现类,给controll或service使用。

     

    如果开发者按照MyBatis的规则定义DAO接口,实现类就不用写了,框架会动态地在内存中创建实现类。

    1. 根据SQL定义文件中的id属性当接口的方法名
    2. 根据SQL定义文件中的parameterType类型当方法参数类型
    3. 根据SQL定义文件中的resultType类型定义方法返回的类型
    (多行使用List<T>;单行使用T类型)
    4. 将SQL定义文件<mapper>的namespace属性指定成包名+DAO的接口名

    //定义DAO接口
    public interface UserDao{
      public User getUserByID(int id);
      public void save(User user);
    }

    使用:

    UserDao userDao = Session.getMapper(UserDao.class);//接口实现的对象
    User user=userDao.getUserByID("10");

    Mybatis与Spring的整合

    Mybatis-spring.jar整合包,包含以下组件:
    1) SqlSessionFactoryBean组件:封装了创建SqlSessinFactory的过程。
    在applictionContext.xml中配置MapperFactoryBean组件
    2) MapperFactoryBean组件:封装了根据Mapper映射器接口生成实现组件的功能。
    不用再调用session.getMapper(UserDao.class),生成的bean会加入spring容器中,直接调用该bean实例的方法执行sql语句。
    一个bean只能给一个mapper接口生成实现组件。

    <!--定义MapperFactoryBean
    一次只能为一个Mapper接口生成实现组件;id为实现接口的对象,value为实现的mapper接口;ref为引用的SqlSession资源;可以注入到service中直接使用。-->
    <bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean"> 
      <property name="mapperInterface" value="myBatis.test.Demo.userMapper"></property> 
      <property name="sqlSessionFactory" ref="ssf"></property> 
    </bean> 
    <!--创建SqlSessionFactory,定义SqlSession资源--> <!-- 整合后不需要myBatis主配置文件,相关信息以注入的方式加入到此 --> <bean id="ssf" class="org.mybatis.spring.SqlSessionFactoryBean">   <!-- 注入dataSource -->   <property name="dataSource" ref="dbcp" />   <!-- 注入SQL语句文件 -->   <property name="configLocation" value="classpath:org/mybaits/*.xml"></property> </bean>
    <!-- 定义dbcp的DataSource --> <bean id="dbcp" class="org.apache.commons.dbcp.BasicDataSource">   <property name="username" value="root" />   <property name="password" value="123" />   <property name="url" value="jdbc:mysql://localhost:3306/mydb?useUnicode=true&amp;characterEncoding=UTF-8"></property>   <property name="driver" value="com.mysql.jdbc.Driver"/> </bean>

    测试与使用

    public class TestMybatis {
      private static ApplicationContext cxt;
      public static void main(String[] args) {
        // TODO 自动生成的方法存根
        cxt = new ClassPathXmlApplicationContext("applicationContext.xml"); 
        UserDao userDao = cxt.getBean("UserDao",UserDao.class);
        List<User> list = userDao.findAll();
        for (User user : list){
          System.out.println(user.getName());
        }
      } }

    3) MapperScannerConfiger组件,封装了批量生成Mapper接口组件的功能。

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      <!-- value设置包路径,可以使用分号或逗号作为分隔符设置多个包路径。 -->
      <property name="basePackage" value="myBatis.test.Demo" />
      <!-- 只有具备该注解标记的接口才会被自动实现 -->
      <property name="annotationClass" value="myBatis.test.annotation.MyBatisDao" />
      <!-- sqlSessionFactory会自动注入 -->
      <property name="sqlSessionFactory" ref="ssf"></property> 
    </bean>

    4) SqlSessionTemplate组件:自己编写Dao接口实现类时可以简化编程。

     

    Spring整合MyBatis结构:

    以上皆为个人理解,如有错误之处,欢迎留言指正。
  • 相关阅读:
    1941套站点模版,终生收藏,个个精品
    中文分词--逆向最大匹配
    解释抽象类继承实体类的前提是这个实体类必须明白构造函数
    iOS开发之解析XML格式数据
    在MyEclipse上部署Tomcatserver
    [BLE--Link Layer]物理信道
    项目实施准备事项
    【06】若不想使用编译器自动生成的函数,就该明确拒绝
    【05】了解C++默默编写并调用那些函数
    理解C# Attribute
  • 原文地址:https://www.cnblogs.com/kevin2chen/p/6543327.html
Copyright © 2020-2023  润新知