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开发方法(需要些接口和实现类)
3.使用Mapper代理方法(只需要mapper接口)
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()); } }
相关文章推荐
- python 小知识点
- css中postion的fixed与absolute区别详解
- Java随机输出验证码包含数字、字母、汉字
- [leetcode] 200 Number of Islands(DFS)
- IOS 异步下载图片
- 算法 随笔
- iOS编程------UIAlertController
- ViewPagerIndicator开源框架简单使用
- c++ primer第五版(中文)习题答案 第十章第四节第一小节-插入迭代器
- Xcode 向6.0以后版本添加iOS开发空白模板
- Absolute Uninstaller是类似于标准的Windows添加/删除卸载工具
- Absolute Uninstaller是类似于标准的Windows添加/删除卸载工具
- lintcode-矩阵的之字型遍历 -185
- c++特殊函数
- gcc编译程序的过程
- iOS中sqlite的基本使用
- C结构体之位域(位段)
- 开源中国源码学习UI篇(三)之ViewPager+Fragment的使用分析
- 用费马小定理做素性测试
- 内核list.h在用户态使用举例