我爱编程

Mybatis框架入门

2018-04-01  本文已影响39人  guanalex

刚学习了Spring,肯定不能少了mybatis,两者既有优势又有劣势。MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了 JDBC 代码和参数的手工设置以及对结果集的检索。 MyBatis 只要简单的配置和原始映射,将接口和 Java 的 POJO( 普通的Java 对象)映射成数据库中的记录.自我感觉使用起来很好。本周主要是学习了mybatis一些简单的使用过程。如mybatis框架原理、mybatis用户的增、删、改、查。mybatis开发dao两种方法:原始dao开发方法(程序需要编写dao接口和dao实现类)、mybaits的mapper接口(相当于dao接口)代理开发方法、mybatis配置文件SqlMapConfig.xml。
mybatis核心:(mybatis输入映射、mybatis输出映射)、mybatis的动态sql。

mybatis对数据库用户的增加、删、改、查

(1)原始dao开发方法:
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">
<!-- 
    这个xml文件主要是用来配置mybatis的环境、数据源、事物等
 -->

  <configuration>
   <properties resource="config/db.properties">
    <!--properties中还可以配置一些属性名和属性值  -->
    <!-- <property name="jdbc.driver" value=""/> -->
</properties>
<!-- 批量定义类地址别名 -->
 <typeAliases>
 
    <package name="sqlmap"/>
 </typeAliases>



<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
    <environment id="development">
    <!-- 使用jdbc事务管理,事务控制由mybatis-->
        <transactionManager type="JDBC" />
    <!-- 数据库连接池,由mybatis管理-->
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
        </dataSource>
    </environment>
</environments>
<!-- 加载 映射文件 -->
<mappers>
    <mapper resource="config/User.xml"/>
         <!--注意在使用接口代理时要配置加载的映射文件-->
    <mapper resource="dailiDao/UserMapper.xml"/>
    <!-- 批量加载映射文件 -->
    <package name="sqlmap"/>
</mappers>

</configuration>

2、创建User类

package mybatisjdbc;
  public class User {
 //对应数据库定义的字段
     private Integer  id;
     private String  mail;
     private String name;
public String getName() {
    return name;
  }    
public void setName(String name) {
this.name = name;
}
public Integer getId() {
        return id;
}
public void setId(Integer id) {
  this.id = id;
}
  public String getMail() {
        return mail;
}
  public void setMail(String mail) {
    this.mail = mail;
}
}

3、代码实现

  package mybatisjdbc;
  import java.io.IOException;
  import java.io.InputStream;
  import java.util.List;
  import javax.annotation.Resource;
  import org.apache.ibatis.io.Resources;
  import org.apache.ibatis.session.SqlSession;
  import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  org.junit.Test;

    public class mybatisTest {

//@Test
public void finUserbyid() throws IOException{
    //加载配置文件
    String resource="config/SqlMapconfig.xml";
    //得到配置文件流
    InputStream       inputStream=Resources.getResourceAsStream(resource);
    //创建会话工厂,把mybatis配置信息传入
    SqlSessionFactory sqls=new       SqlSessionFactoryBuilder().build(inputStream);
    //通过工厂得到sqlsession
    //SqlSession sqlsession=sqls.openSession();
    SqlSession sqlSession = sqls.openSession();

    //通过sqlsession操作数据库
    /*
     *  参数说明:
     *  第一个参数为映射文件User.xml的id,其值为namespace.+id
     *  第二个参数为映射文件User.xml的parameterType类型的参数
     *  sqlSession+查询对应的api
     * */
      User user=sqlSession .selectOne("test.finUser", 1);
      System.out.println(user.getMail()+user.getId());
    
      sqlSession.close();
    
    
    
    
      }
    //根据用户输入模糊查询
  //@Test
  public void finUserbyname() throws IOException{
    //加载配置文件
    String resource="config/SqlMapconfig.xml";
    //得到配置文件流
    InputStream   inputStream=Resources.getResourceAsStream(resource);
    //创建会话工厂,把mybatis配置信息传入
    SqlSessionFactory sqls=new SqlSessionFactoryBuilder().build(inputStream);
    //通过工厂得到sqlsession
    //SqlSession sqlsession=sqls.openSession();
    SqlSession sqlSession = sqls.openSession();

    //通过sqlsession操作数据库
    /*
     *  参数说明:
     *  第一个参数为映射文件User.xml的id,其值为namespace.+id
     *  第二个参数为映射文件User.xml的parameterType类型的参数
     * */
     List<User> user= sqlSession.selectList("test.finUsername", "xiao");
      System.out.println(user);
    
      sqlSession.close();
    
    
    
    
    }
      //添加用户信息
//@Test
public void addUser() throws IOException{
    //加载配置文件
    String resource="config/SqlMapconfig.xml";
    //得到配置文件流
    InputStream inputStream=Resources.getResourceAsStream(resource);
    //创建会话工厂,把mybatis配置信息传入
    SqlSessionFactory sqls=new SqlSessionFactoryBuilder().build(inputStream);
    //通过工厂得到sqlsession
    //SqlSession sqlsession=sqls.openSession();
    SqlSession sqlSession = sqls.openSession();

    User user=new User();
    user.setId(6);
    user.setName("mybatis");
    user.setMail("999999");
     
    //通过sqlsession操作数据库
    /*
     *  参数说明:
     *  第一个参数为映射文件User.xml的id,其值为namespace.+id
     *  第二个参数为插入的对象
     *  无返回值
     * */
     sqlSession.insert("test.addUser",user);
     //提交事务
     sqlSession.commit();
    //关闭连接
      sqlSession.close();

}
//根据id删除用户
//@Test
public void deleteUser() throws IOException{
    //加载配置文件
    String resource="config/SqlMapconfig.xml";
    //得到配置文件流
    InputStream inputStream=Resources.getResourceAsStream(resource);
    //创建会话工厂,把mybatis配置信息传入
    SqlSessionFactory sqls=new SqlSessionFactoryBuilder().build(inputStream);
    //通过工厂得到sqlsession
    //SqlSession sqlsession=sqls.openSession();
    SqlSession sqlSession = sqls.openSession();
     
    //通过sqlsession操作数据库
    /*
     *  参数说明:
     *  第一个参数为映射文件User.xml的id,其值为namespace.+id
     *  第二个参数为插入的对象
     *  无返回值
     * */
     sqlSession.insert("test.deletebyid",4);
     //提交事务
    sqlSession.commit();
    //关闭连接
      sqlSession.close();

        }
  //根据id修改用户信息
@Test
public void updateUser() throws IOException{
    //加载配置文件
    String resource="config/SqlMapconfig.xml";
    //得到配置文件流
    InputStream inputStream=Resources.getResourceAsStream(resource);
    //创建会话工厂,把mybatis配置信息传入
    SqlSessionFactory sqls=new SqlSessionFactoryBuilder().build(inputStream);
    //通过工厂得到sqlsession
    //SqlSession sqlsession=sqls.openSession();
    SqlSession sqlSession = sqls.openSession();

    User user=new User();
    user.setId(6);
    user.setName("Spring");
    user.setMail("999888");
     
    //通过sqlsession操作数据库
    /*
     *  参数说明:
     *  第一个参数为映射文件User.xml的id,其值为namespace.+id
     *  第二个参数为插入的对象
     *  无返回值
     * */
     sqlSession.insert("test.update",user);
     //提交事务
     sqlSession.commit();
    //关闭连接
      sqlSession.close();

  }

mybaits的mapper接口代理开发dao

简单的理解就是把接口方法的实现交给mybatis,即在接口中定义方法即可在应用中直接使用完成对数据库的操作。

(1)定义mapper接口

   package dailiDao;

  import mybatisjdbc.User;
    /**
     *  使用mapper代理是注意mapper.java接口中的方法名和mapper.xml    中statement的id一致
     *  mapper.java接口中的方法输入参数类型和mapper.xml中statement  的parameterType指定的类型一致
     *  mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致
   * 
 */

public interface UserMapper {
//根据id查询用户,这里使用mapper代理机制
public User findUserById(int id) throws Exception;
}

(2)定义映射文件(别忘了在全局配置文件中加载此映射文件)

<?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="test">
   <!-- 
   在映射文件中会配置许多sql语句,通过select执行对数据库查询
  id:表示映射文件中的SQL语句,通过将SQL语句封装到mapperstatement中,所以将id称为staement的id
 -->
 <!-- 
  #{}相当于占位符
  #{value}其中的value表示传入的参数,括号里面的value可随便取.
  parameterType:为输入的参数类型
  resultType:为指定数据库查询返回的映射java对象,一般为定义的某个对象的路径
  -->
<select id="finUser" parameterType="int" resultType="mybatisjdbc.User">
   select * from user where id=#{value}

</select>
<!-- 根据用户输入进行模糊查询 -->
<!-- 
   ${}表示拼接sql串,但会引起SQL注入问题
   ${value}表示接收参数内容,如果传入参数是简单的类型只能用value
 -->
<select id="finUsername" parameterType="String" resultType="mybatisjdbc.User">
    select * from user where name like '%${value}%'
</select>
<!-- 添加用户信息 -->
<insert id="addUser" parameterType="mybatisjdbc.User" >
  <!-- 当参数parameterType为类类型时,查询语句的值为其属性名 -->
      insert into user(id,name,mail) value(#{id},#{name},#{mail})
</insert>
<!-- 根据id删除用户 -->
<delete id="deletebyid" parameterType="Int">
     delete  from user where id=#{vlaue}
</delete>
<update id="update" parameterType="mybatisjdbc.User">
   update user set name=#{name},mail=#{mail} where id=#{id}
</update>

</mapper>

(3)测试类

 package dailiDao;

 import java.io.IOException;
 import java.io.InputStream;

  import mybatisjdbc.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;
  import org.junit.Before;
  import org.junit.Test;

  public class dailiTest {
      private SqlSessionFactory sqls;
    @Before//使用时先执行这个方法
    public void init() throws IOException{
    String resource="config/SqlMapconfig.xml";
      //得到配置文件流
        InputStream       inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂得到会话SqlSessionFactory,把mybatis配置信息传入
 sqls=new SqlSessionFactoryBuilder().build(inputStream);
}


@Test
  public void test() throws Exception{
  //调用工厂会话得到sqlsession
    SqlSession sqlsession= sqls.openSession();
        //调用UserMapper方法可以直接实现数据库查询,而不用实现这个接口的方法,mapper代理直接实现创建mapper对象
   UserMapper usermapper=sqlsession.getMapper(UserMapper.class);
  User user=usermapper.findUserById(2);
  sqlsession.close();
  System.out.println(user.getName());
  }

 }

以上是两种mybatis开发dao层的方法,可能第二种比较乱一点,但是弄懂了相比第一种方法更容易使用。很多要注意的地方都在代码中写注释了,不懂的可以去查相应的就会容易理解一点。

上一篇下一篇

猜你喜欢

热点阅读