myBatis框架demo

269 查看

关于myBatis的介绍,我就多讲了,主要写下的内容是代码,还有一些我碰到的问题
1.配置文件Configuration.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>

<!-- 这里是设置对应类的别名,为了省去每次调用时加的包名 -->
<typeAliases> 
       <typeAlias alias="User" type="myBatisTest.User"/> 
</typeAliases> 

<environments default="development">

    <!-- 这里是用来设置对应数据库的内容,包括驱动,url,用户名,密码 -->
    <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/softcal" />
        <property name="username" value="root"/>
        <property name="password" value=""/>
        </dataSource>
    </environment>
</environments>

<!-- 这里用来设置对应mapper文件的路径,为了方便我把它放到了和Configuration.xml的相同目录下面 -->
<mappers>
    <mapper resource="UserMapper.xml"/>
</mappers>
</configuration>

2.映射器xml文件 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适用的命名空间,在使用class时貌似没什么特别大的用处,当使用接        口的时候是接口对应的地址 -->
<mapper namespace="myBatisTest.UserOperation">
<!-- id一定要与对应的接口中的函数名对应 -->
<select id="selectUserByID" parameterType="int" resultType="User">
    select * from user where user_id = #{user_id}
</select>
</mapper>

这两步一般是使用myBatis框架都会做的事(好像很多内容都可以在注解中做了,但是我对注解不是特别熟悉,就不尝试了)。接下来如何在Java代码中体现呢?
3.代码程序访问myBatis:

 1)类实现:
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;

static{
    try{
        reader =Resources.getResourceAsReader("Configuration.xml");
        sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
    }catch(Exception e){
        e.printStackTrace();
    }
}

     public User selectUserByID(int id){
    SqlSession session=sqlSessionFactory.openSession();
    User user;
    try{
        user=(User)session.selectOne("UserMapper.selectUserByID", id);
        System.out.println(user);
    }finally{
        session.close();
    }
    
    return user;
}

主要的内容其实就是先加载Configuration.xml文件,然后创建一个SqlSessionFactory,利用这个工厂类创建session,通过session来访问数据库。我猜想框架源码中通过工厂类封装了数据库的连接这些模板代码,session对象类似于我们在jdbc中使用的statement对象的封装,在我们调用close关闭这个session对象时,框架帮你关闭数据库连接之类的工作。

   2)接口实现:
public interface UserOperation {
      public User selectUserByID(int user_id);
}

没错,只用这一点代码,调用时就用如下代码就可以了

    SqlSession session =sqlSessionFactory.openSession();
    try{
        UserOperation userOperation =session.getMapper(UserOperation.class);
        User user =userOperation.selectUserByID(3);
        System.out.println(user);
        //session.commit();
        
    }finally{
        session.close();
    }

的确省去了很多不方便的数据库连接代码,我自己重构之前写过的一些代码,之前一个DAO类大概会有200行左右吧,用myBatis写完之后大概会到100左右,我还想把一些公共的部分提取出来作为工具类,那样会更少。总之,还不错。

在做demo的时候犯过的错:
1.在使用类实现的时候传递多个参数到myBatis框架一直都不对,尝试了网上的注解还是不可以,然后用接口实现,完全没有这个问题了,建议用接口
2.在写映射器文件的时候,会有奇怪的问题,报出无法找到XX属性,可以利用序号来在xml文件中可以利用序号传递参数,这样会避免这个问题