Mybatis框架基础学习(四)

来源:互联网 发布:行业分类数据库 mysql 编辑:程序博客网 时间:2024/05/17 01:30

本节内容: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实现类中注入sqlSessionFactoryprivate SqlSessionFactory sqlSessionFactory;public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}@Overridepublic User findUserById(int id) {SqlSession sqlSession = sqlSessionFactory.openSession();User user = sqlSession.selectOne("test.findUserById", id);sqlSession.close();return user;}@Overridepublic void insertUser(User user) {SqlSession sqlSession = sqlSessionFactory.openSession();sqlSession.selectOne("test.insertUser", user);sqlSession.commit();sqlSession.close();}@Overridepublic 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;@Beforepublic void setUp() throws Exception {// mybatis配置文件String resource = "SqlMapConfig.xml";// 得到配置文件流InputStream inputStream = Resources.getResourceAsStream(resource);// 创建会话工厂,builder中要传入配置文件信息sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic 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 mapperPUBLIC "-//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;@Beforepublic void setUp() throws Exception {// mybatis配置文件String resource = "SqlMapConfig.xml";// 得到配置文件流InputStream inputStream = Resources.getResourceAsStream(resource);// 创建会话工厂,builder中要传入配置文件信息sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic 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());}}




0 0
原创粉丝点击