官方网站
 
文章目录
- 一、什么是 MyBatis ?
 - 二、mybatis和hibernate的比较
 - 三、入门案例
 
- 1.创建maven工程,添加对应jar包
 - 2.创建全局配置文件
 - 3.定义User对象
 - 4.创建映射文件
 - 5.将映射文件添加到主配置文件中
 - 6.测试
 - 7.查询,修改,删除操作
 
- 四、案例优化
 
- 1.获取SqlSessionFactory对象的方式
 - 2.整理CRUD操作
 
- 五、mybatis接口的使用方式
 
- 1.定义Mapper接口
 - 2.定义映射文件
 - 3.测试
 
一、什么是 MyBatis ?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二、mybatis和hibernate的比较
mybatis  | hibernate  | 
半自动ORM框架  | 全自动ORM框架  | 
必须写SQL  | 可以不写SQL  | 
事务处理  | 事务处理  | 
缓存都支持  | 缓存都支持,二级缓存比mybatis更好  | 
三、入门案例
1.创建maven工程,添加对应jar包
<dependencies>
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.27</version>
  </dependency>
</dependencies>2.创建全局配置文件
该配置文件包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器TransactionManager)。XML 配置文件的详细内容后面再探讨,这里先给出一个简单的示例
 
  
  
<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/ssm?characterEncoding=utf-8"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
</configuration>配置允许其他用户连接mysql:
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
flush privileges;
3.定义User对象

4.创建映射文件
 
  
  
<mapper namespace="dpb">
  <insert id="addUser" parameterType="com.sxt.dao.User">
    insert into t_user(name,age)values(#{name},#{age})
  </insert>
  <delete id="deleteUserById" parameterType="java.lang.Integer"> 
    delete from t_user where id=#{id}    
  </delete>
  <update id="updateUserById" parameterType="com.sxt.dao.User"> 
    update t_user set name = #{name} where id=#{id}    
  </update>
  <select id="getUserById" parameterType="java.lang.Integer" resultType="com.sxt.dao.User"> 
    select * from t_user where id=#{id}   
  </select>
</mapper>5.将映射文件添加到主配置文件中

 
  
  
<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/ssm"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
      </dataSource>
    </environment>
  </environments>
  <!-- 注册映射文件 -->
  <mappers>
    <mapper resource="com/sxt/dao/UserMapper.xml"/>
  </mappers>
</configuration>6.测试
  public void add() throws IOException {
    // 1.通过Resources对象加载配置文件
    InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
    // 2.获取SqlSessionFactory对象
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream );
    // 3.通过SqlSessionFactory对象获取SQLSession对象
    SqlSession session = factory.openSession();
    User user = new User();
    user.setName("dpb");
    user.setAge(22);
    // dpb.addUser  是映射文件中 namespace的内容加 id的内容,定位要执行的SQL
    int count = session.insert("dpb.addUser", user);
    System.out.println("影响的行数:"+count);
    // 需要显示的提交
    session.commit();
    session.close();
  }
}
7.查询,修改,删除操作
public class Test02 {
  private SqlSession sqlSession;
  
  public void before() throws IOException {
    // 1. 加载配置文件
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    // 2. 根据配置文件获取一个SqlSessionFactory对象,这个对象相当于连接工厂
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    // 3. 获取一个sqlsession,sqlsession类似于之前学过的Connection
    sqlSession = sqlSessionFactory.openSession();
  }
  
  public void after() {
    sqlSession.commit();
    sqlSession.close();
  }
  
  public void test1() {
    User user = new User();
    user.setId(7);
    user.setName("里斯1");
    int update = sqlSession.update("dpb.updateUserById", user);
    System.out.println(update);
  }
  
  public void test2() {
    int delete = sqlSession.delete("dpb.deleteUserById", 7);
    System.out.println(delete);
  }
  
  public void test3() {
    User user = (User) sqlSession.selectOne("dpb.getUserById", 8);
    System.out.println(user);
  }
}四、案例优化
1.获取SqlSessionFactory对象的方式
SqlSessionFactory在一个服务中只需要有一个实例就可以了,此时可以通过单例的模式获取
/**
 * 工具类  对外提供SqlSessionFactory的单例对象
 * @author dengp
 *
 */
public class DbUtils {
  private static  SqlSessionFactory factory ;
  
  public static SqlSessionFactory getInstace(){
    if(factory ==null){
      InputStream in = null;
      try{
        in = Resources.getResourceAsStream("mybatis-config.xml");
      }catch(Exception e){
        e.printStackTrace();
      }
      synchronized (DbUtils.class) {
        if(factory ==null){
          factory = new SqlSessionFactoryBuilder().build(in);
        }
      }
    }
    return factory;
  }
}2.整理CRUD操作
public interface UserMapper {
  public int addUser(User user);
  
  public int updateById(User user);
  
  public int deleteById(int id);
  
  public User queryById(int id);
}public class UserDao implements UserMapper {
  
  public int addUser(User user) {
    
    return DBUtils.getInstall().openSession().insert("com.sxt.dao.UserMapper.addUser", user);
  }
  
  public int updateById(User user) {
    // TODO Auto-generated method stub
    return DBUtils.getInstall().openSession().update("com.sxt.dao.UserMapper.updateById", user);
  }
  
  public int deleteById(int id) {
    // TODO Auto-generated method stub
    return DBUtils.getInstall().openSession().delete("com.sxt.dao.UserMapper.deleteById", id);
  }
  
  public User queryById(int id) {
    // TODO Auto-generated method stub
    return DBUtils.getInstall().openSession().selectOne("com.sxt.dao.UserMapper.queryById", id);
  }
} 
  
  
<mapper namespace="com.sxt.dao.UserMapper">
  <insert id="addUser" parameterType="com.sxt.bean.User">
    insert into t_user(name,age)values(#{name},#{age})    
  </insert>
  
  <delete id="deleteById" parameterType="java.lang.Integer">
    delete from t_user where id=#{id}
  </delete>
  
  <update id="updateById" parameterType="com.sxt.bean.User">
    update t_user 
    set name=#{name},age=#{age}
    where id=#{id}
  </update>
  
  <select id="queryById" parameterType="java.lang.Integer"
    resultType="com.sxt.bean.User">
    select * from t_user where id=#{id}
  </select>
</mapper>/**
 * 代理方式
 */
public void test(){
  UserMapper mapper = (UserMapper) Proxy.newProxyInstance(UserMapper.class.getClassLoader()
      , new Class[]{UserMapper.class},new InvocationHandler() {
        
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
          System.out.println(UserMapper.class.getName()+"."+method.getName());
          Object id = null;
          for (Object object : args) {
            System.out.println(object);
            id = object;
          }
          
          // 实现逻辑
          return DBUtils.getInstall().openSession().selectOne(UserMapper.class.getName()+"."+method.getName(), id);
        }
      } );
  System.out.println(mapper.queryById(5));
}
可行!!!
五、mybatis接口的使用方式
通过前面UserDao的设计,可以发现,UserDao中的代码都是模板化代码,都可以通过配置自动生成,因此,在实际开发中,Mapper可以按照如下方式设计
1.定义Mapper接口
Mapper接口中,只需要声明方法名,方法参数、方法返回等信息
public interface UserMapper {
  public int addUser(User user);
}2.定义映射文件
 
  
  
<!-- 使用接口 代理的方式 namespace必须和接口的全路径名称一致 -->
<mapper namespace="com.sxt.dao.UserMapper">
  <!-- id必须和接口声明的方法一致 -->
  <insert id="addUser" parameterType="com.sxt.bean.User">
    insert into t_user(name,age)values(#{name},#{age})
  </insert>
</mapper>3.测试
public void add() throws IOException {
  // 1.通过Resources对象加载配置文件
  InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
  // 2.获取SqlSessionFactory对象
  SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream );
  // 3.通过SqlSessionFactory对象获取SQLSession对象
  SqlSession session = factory.openSession();
  User user = new User();
  user.setName("dpb");
  user.setAge(22);
  //通过Java动态代理自动提供了UserMapper的实现类
  UserMapper mapper = session.getMapper(UserMapper.class);
  int count = mapper.addUser(user);
  System.out.println("影响的行数:"+count);
  session.commit();
}注意:
 使用mapper接口方式必须满足:
序号  | 注意点  | 
1  | 映射文件的namespace的值必须是接口的全路径名称 比如:com.dpb.dao.UserMapper  | 
2  | 接口中的方法名在映射文件中必须有一个id值与之对应。  | 
3  | 映射文件的名称必须和接口的名称一致  | 
数据添加成功
                
                










