MyBatisMyBatis起步

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

Mybatis结构

MyBatis 1

 

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 2

假若开发者根据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,Mybatis与Spring的整合

Mybatis-spring.jar整合包,包罗以下组件:
1) SqlSessionFactoryBean组件:封装了成立SqlSessinFactory的进度。
在applictionContext.xml中配置MapperFactoryBean组件
2)
MapperFactoryBean组件:封装了基于Mapper映射器接口生成已毕组件的听从。
不用再调用session.getMapper(UserDao.class),生成的bean会参与spring容器中,直接调用该bean实例的章程执行sql语句。
一个bean只可以给一个mapper接口生成完成组件。

MyBatis 3

 

<!--定义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接口达成类时可以简化编程。

 MyBatis 4

Spring整合MyBatis结构:

MyBatis 5

 

网站地图xml地图