mybatis学习(一)

每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得。SqlSessionFactoryBuilder对象可以通过XML配置文件,或从以往使用惯例中准备好的Configuration类实例中来构建SqlSessionFactory对象。

1、从XML中构建SqlSessionFactory

代码如下:

 
  1. String resource = "org/mybatis/example/Configuration.xml";  
  2. Reader reader = Resources.getResourceAsReader(resource);  
  3. sqlMapper = new SqlSessionFactoryBuilder().build(reader);

XML配置文件包含对MyBatis系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器。

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/lichunan?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mybatis/config/UserDaoMapper.xml"/>
    </mappers>
</configuration>

2、从SqlSessionFactory中获取SqlSession

通过以下代码获得SqlSession实例。

  1. SqlSession session = sqlMapper.openSession(); 

3、映射SQL语句的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="mybatis.config.UserDao">
    <select id="countAll" resultType="int">
        select count(*) c from users;
    </select>
   
    <select id="selectAll" resultType="mybatis.config.User">
        select * from users
    </select>
   
    <insert id="insert" parameterType="mybatis.config.User">
        insert into users(username,password,mobile,email) values(#{username},#{password},#{mobile},#{email})
    </insert>
   
    <update id="update" parameterType="mybatis.config.User">
        update users set username=#{username},password=#{password},mobile=#{mobile} where id=#{userId}
    </update>
   
    <delete id="delete" parameterType="int">
        delete from users where id=#{userId}
    </delete>
   
    <select id="findByUserId" parameterType="int" resultType="mybatis.config.User">
        select * from users where id=#{userId}
    </select>
</mapper>

在命名空间“mybatis.config.UserDao”中,它定义了一个名为“selectAll”的映射语句,这样它允许你使用完全限定名“mybatis.config.User.selectAll”来调用映射语句。所以,相应的代码写法为:

UserDao userDao = session.getMapper(UserDao.class);
       
        User user = new User();
        user.setUsername("dengx");
        user.setPassword("123456");
        user.setMobile("wangle");
        user.setEmail("buzhidao");
        userDao.insert(user);
        System.out.println("记录条数:"+userDao.countAll());
       
        List<User> users = userDao.selectAll();
        Iterator<User> iter = users.iterator();
        while(iter.hasNext()){
            User u = iter.next();
            System.out.println("用户名:"+u.getUsername()+"密码:"+u.getPassword());
        }

4、范围和生命周期

SqlSessionFactoryBuilder
这个类可以被实例化,使用和丢弃。一旦你创建了SqlSessionFactory后,这个类就不需要存在了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是本地方法变量)。

SqlSessionFactory
一旦被创建,SqlSessionFactory实例应该在你的应用程序执行期间都存在。没有理由来处理或重新创建它。使用SqlSessionFactory的最佳实践是在应用程序运行期间不要重复创建多次。因此SqlSessionFactory的最佳范围是应用范围。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。然而这两种方法都不认为是最佳实践。考虑依赖注入容器,比如Google Guice或Spring。这样的框架允许你创建支持程序来管理单例SqlSessionFactory的生命周期。

SqlSession
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Serlvet架构中的HttpSession。
基于收到的HTTP请求,你可以打开了一个SqlSession,然后返回响应,就可以关闭它了。关闭Session很重要,你应该确保使用finally块来关闭它。下面的示例就是一个确保SqlSession关闭的基本模式:
SqlSession session = sqlSessionFactory.openSession();
try {
    // do work
} finally {
    session.close();
}

映射器实例
映射器是你创建绑定映射语句的接口。映射器接口的实例可以从SqlSession中获得。那么从技术上来说,当被请求时,任意映射器实例的最宽范围和SqlSession是相同的。然而,映射器实例的最佳范围是方法范围。也就是说,它们应该在使用它们的方法中被请求,然后就抛弃掉。
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
    // do work
} finally {
    session.close();
}

 

 

       

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值