您的位置:首页 > 其它

Mybatis框架基础学习(四)

2015-10-12 23:13 501 查看
本节内容:Mybatis开发Dao方法

1. sqlSession应用场景

1.1 通过SqlSessionFactoryBuilder创建SqlSessionFactory

只需要作为一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder

1.2 通过SqlSessionFactory创建SqlSession,使用单例模式管理SqlSessionFactory(一旦创建,使用一个实例)。将来与Spring整合后,可以方便的使用单例模式进行管理

1.3SqlSession是一个面向用户的接口,提供了很多操作数据库的方法。SqlSession是线程不安全的,在SqlSession实现类中除了操作数据库中的方法还有数据域属性。

最佳应用场合在方法体内,定义成局部变量。

2. 原始Dao开发方法(需要些接口和实现类)

public class UserDaoImpl implements UserDao {

// 需要向dao实现类中注入sqlSessionFactory
private SqlSessionFactory sqlSessionFactory;

public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}

@Override
public User findUserById(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", id);
sqlSession.close();
return user;
}

@Override
public void insertUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.selectOne("test.insertUser", user);
sqlSession.commit();
sqlSession.close();

}

@Override
public void deleteUser(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.selectOne("test.deleteUser", id);
sqlSession.commit();
sqlSession.close();
}

}
/**
* 测试方法
*
* @author aron
*
*/
public class UserDaoImplTest {
private SqlSessionFactory sqlSessionFactory;

@Before
public void setUp() throws Exception {
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,builder中要传入配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}

@Test
public void testFindUserById() {
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User user = userDao.findUserById(1);
System.out.println(user);
}

}
该方法不足:1. 存在大量代码重复 2.调用sql方法时,将statement的ID硬编码 3. 由于使用泛型,即使传入的变量类型错误,编译阶段也不会报错,不利于开发。

3.使用Mapper代理方法(只需要mapper接口)

/**
* 1. Mapper接口,用户管理,相当于Dao接口
* 2. 编写mapper.xml映射文件
*
* mybatis可以自动生成mapper接口实现类代理对象
* 开发规范:
* 1) mapper.xml中,namespace等于mapper接口的地址
* 2) mapper.java接口中的方法名,和mapper.xml中statement的id一致
* 3) mappe.java接口中参数类型和mapper.xml中parameterType指定的类型一致
* 4) 返回值和mapper.xml中resultType指定的类型一致
*
* @author aron
*
*/
public interface UserMapper {

public User findUserById(int id);

public User findUserByName(String name);

public void insertUser(User user);

public void deleteUser(int id);
}
<?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">
<!-- namespace 命名空间,作用是对sql进行分类管理,进行sql隔离 -->
<!-- 注意:使用Mapper代理方法开发,namespace有特殊重要的作用 -->
<mapper namespace="com.cupdata.zicon.dao.mapper.UserMapper">
<span style="white-space:pre">	</span><!-- 在映射文件中配置很多sql语句 -->
<span style="white-space:pre">	</span><!-- 通过select进行数据库查询 
<span style="white-space:pre">		</span>id: 标识映射文件中sql, 将sql语句封装到mappedStatement对象中,所以成为statement的id 
<span style="white-space:pre">		</span>parameterType:指定输入参数的类型 
<span style="white-space:pre">		</span>#{actor_id}:占位符,其中actor_id表示输入的参数,参数名就是actor_id.如果输入参数是简单类型,参数可以任意。 
<span style="white-space:pre">		</span>resultType:指定sql输出结果所映射的java对象。 -->
<span style="white-space:pre">	</span><select id="findUserById" parameterType="int"
<span style="white-space:pre">		</span>resultType="com.cupdata.zicon.cobatis.User">
<span style="white-space:pre">		</span>SELECT * FROM ACTOR WHERE ACTOR_ID=#{actor_id}
<span style="white-space:pre">	</span></select>

<span style="white-space:pre">	</span><!-- 根据用户名称模糊查询用户信息,可能返回多条
<span style="white-space:pre">	</span> resultType:指定单条记录所映射的java对象
<span style="white-space:pre">	</span> ${}:表示拼接sql串,將接收到的內容不加任何形式拼接在sql中。
<span style="white-space:pre">	</span> 使用该方式可能会引起sql注入。
<span style="white-space:pre">	</span> 注意:${value}:接收输入参数的内容,如果传入的类型是简单类型,${}中只能使用value
<span style="white-space:pre">	</span> -->
<span style="white-space:pre">	</span><select id="findUserByName" parameterType="java.lang.String"
<span style="white-space:pre">		</span>resultType="com.cupdata.zicon.cobatis.User">
<span style="white-space:pre">		</span>SELECT * FROM ACTOR WHERE FIRST_NAME LIKE '%${value}%'
<span style="white-space:pre">	</span></select>
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span><!-- 添加用户 
<span style="white-space:pre">	</span>parameterType:指定的输入类型是POJO
<span style="white-space:pre">	</span>#{}:指定POJO的属性名,接收POJO属性对象,Mybatis通过ONGL获取对象属性值
<span style="white-space:pre">	</span>-->
<span style="white-space:pre">	</span><insert id="insertUser" parameterType="com.cupdata.zicon.cobatis.User">
<span style="white-space:pre">		</span><!-- 将插入的主键返回到User对象中,只适用于自增主键 -->
<span style="white-space:pre">		</span><selectKey keyProperty="actor_id" order="AFTER" resultType="java.lang.Integer">
<span style="white-space:pre">			</span>SELECT LAST_INSERT_ID();
<span style="white-space:pre">		</span></selectKey>
<span style="white-space:pre">		</span>insert into actor(actor_id,first_name,last_name,last_update)value(#{actor_id},#{first_name},#{last_name},#{last_update});
<span style="white-space:pre">	</span></insert>
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span><update id="updateUser" parameterType="com.cupdata.zicon.cobatis.User">
<span style="white-space:pre">		</span>update actor set first_name=#{first_name}, last_name=#{last_name} where actor_id=#{actor_id}
<span style="white-space:pre">	</span></update>
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span><delete id="deleteUser" parameterType="java.lang.Integer">
<span style="white-space:pre">		</span>delete from actor where actor_id = #{id}
<span style="white-space:pre">	</span></delete>
</mapper>
package com.cupdata.zicon.dao.mapper;

import static org.junit.Assert.*;

import java.io.InputStream;

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;

import com.cupdata.zicon.cobatis.User;
//测试程序
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;

@Before
public void setUp() throws Exception {
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,builder中要传入配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}

@Test
public void testFindUserById() {
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(1);
System.out.println(user.getFirst_name());

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: