mybatis(2)mybatis开发dao的方法
2015-10-08 16:38
501 查看
1.1 SqlSession使用范围
1.1.1 SqlSessionFactoryBuilder
通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。
在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。
1.1.2 SqlSessionFactory
通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory。
1.1.3 SqlSession
SqlSession是一个面向用户(程序员)的接口。SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)、。
SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。
SqlSession最佳应用场合在方法体内,定义成局部变量使用。
1.2 原始dao开发方法(程序员需要写dao接口和dao实现类)
1.2.1 思路
程序员需要写dao接口和dao实现类。需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession
1.2.2 dao接口
public interface UserDao { //根据id查询用户信息 public User findUserById(int id) throws Exception; //根据名字查询用户 public List<User> findUserByName(String name) throws Exception; //添加用户 public void insertUser(User user) throws Exception; //根据id删除用户信息 public void deleteUser(int id) throws Exception; }
1.2.3 dao接口实现类
package com.xdy.mybatis.dao; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import com.xdy.mybatis.po.User; public class UserDaoImpl implements UserDao { private SqlSessionFactory sqlSessionFactory; public UserDaoImpl(SqlSessionFactory sqlSessionFactory) { super(); this.sqlSessionFactory = sqlSessionFactory; } @Override public User findUserById(int id) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); User user = sqlSession.selectOne("test.findUserById", id); sqlSession.close(); return user; } @Override public List<User> findUserByName(String name) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); List<User> users = sqlSession.selectList("test.findUserByName", name); sqlSession.close(); return users; } @Override public void insertUser(User user) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSession.insert("test.insertUser", user); sqlSession.commit(); sqlSession.close(); } @Override public void deleteUser(int id) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSession.delete("test.deleteUser", id); sqlSession.commit(); sqlSession.close(); } }
1.2.4 测试代码:
package com.xdy.mybatis.dao; import static org.junit.Assert.fail; import java.io.InputStream; import java.util.Date; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import com.xdy.mybatis.po.User; public class UserDaoImplTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws Exception { // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUserById() throws Exception { UserDao userDao = new UserDaoImpl(sqlSessionFactory); User user = userDao.findUserById(1); System.out.println(user); } @Test public void testFindUserByName() throws Exception { UserDao userDao = new UserDaoImpl(sqlSessionFactory); List<User> list = userDao.findUserByName("张三"); System.out.println(list); } @Test public void testInsertUser() throws Exception { UserDao userDao = new UserDaoImpl(sqlSessionFactory); User user = new User(); user.setUsername("花千骨"); user.setSex("0"); user.setBirthday(new Date()); user.setAddress("渝中区解放碑"); userDao.insertUser(user); } @Test public void testDeleteUser() throws Exception { UserDao userDao = new UserDaoImpl(sqlSessionFactory); userDao.deleteUser(16); } }
1.2.5 总结原始 dao开发问题
1、dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。2、调用sqlsession方法时将statement的id硬编码了
3、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。
2.1 mapper代理方法(程序员只需要mapper接口(相当 于dao接口))
2.1.1 思路(mapper代理开发规范)
程序员还需要编写mapper.xml映射文件,程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。开发规范:
1、在mapper.xml中namespace等于mapper接口地址
2、mapper.java接口中的方法名和mapper.xml中statement的id一致
3、mapp
efd1
er.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。
4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。
UserMapper.java
package com.xdy.mybatis.mapper; import java.util.List; import com.xdy.mybatis.po.User; public interface UserMapper { public User findUserById(int id) throws Exception; public List<User> findUserByName(String name) throws Exception; public void insertUser(User user) throws Exception; public void deleteUser(int id) throws Exception; public void updateUser(User user) throws Exception; public User findUserByIdResultMap(int id) throws Exception; }
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 namespace="com.xdy.mybatis.mapper.UserMapper"> <select id="findUserById" parameterType="int" resultType="com.xdy.mybatis.po.User"> select * from user where id=#{value} </select> <select id="findUserByName" parameterType="java.lang.String" resultType="com.xdy.mybatis.po.User"> select * from user where username like '%${value}%' </select> <insert id="insertUser" parameterType="com.xdy.mybatis.po.User"> <selectKey keyProperty="id" order="AFTER" resultType="int"> select last_insert_id() </selectKey> insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}) </insert> <delete id="deleteUser" parameterType="int"> delete from user where id=#{id} </delete> <update id="updateUser" parameterType="com.xdy.mybatis.po.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper>
UserMapperTest
package com.xdy.mybatis.mapper; import java.io.InputStream; import java.util.Date; import java.util.List; 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.xdy.mybatis.po.User; public class UserMapperTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws Exception { // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUserById() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findUserById(1); System.out.println(user); } @Test public void testFindUserByName() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> users = userMapper.findUserByName("张三"); System.out.println(users); sqlSession.close(); } @Test public void testInsertUser() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUsername("白子画"); user.setSex("1"); user.setBirthday(new Date()); user.setAddress("江北观音桥"); userMapper.insertUser(user); sqlSession.commit(); sqlSession.close(); } @Test public void testDeleteUser() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); userMapper.deleteUser(22); sqlSession.commit(); sqlSession.close(); } @Test public void testUpdateUser() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setId(27); user.setUsername("糖宝"); user.setSex("0"); user.setBirthday(new Date()); user.setAddress("长留山"); userMapper.updateUser(user); sqlSession.commit(); sqlSession.close(); } }
2.1.2 一些问题总结
2.1.2.1 代理对象内部调用selectOne或selectList
如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。
2.1.2.2 mapper接口方法参数只能有一个是否影响系统 开发
mapper接口方法参数只能有一个,系统是否不利于扩展维护。系统 框架中,dao层的代码是被业务层公用的。
即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。
注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。
相关文章推荐
- slidemenu简单使用
- 高性能JavaScript:脚本的无阻塞加载策略
- [Android] ImageView.ScaleType设置图解
- Yii 渲染与布局(渲染页面的两种方式)
- iOS -- 自定义TabBar
- [LeetCode]Longest Substring Without Repeating Characters
- Node.js安装配置
- sql查询中datetime显示的格式为yyyy-DD-mm
- 1011. World Cup Betting (20)
- 网络请求
- 通过hibernate API编写访问数据库的代码
- Android开发学习笔记:Intent的简介以及属性的详解
- ORMLite学习入门笔记
- LeetCode(92) Reverse Linked List II
- 基于MFC的ActiveX控件开发
- [LeetCode]Add Two Numbers
- oracle的乐观锁和悲观锁
- LeetCode(92) Reverse Linked List II
- managed_shared_memory.construct造成的性能损失
- 6-1、全排序 --(按字典顺序)BinaryComparable