Mybatis开发dao

Mybatis在项目中主要使用的地方就是开发dao(数据访问层),

有两种方式:原始dao开发方式mapper代理开发方式(推荐)

需求:

1、 根据用户ID来查询用户信息;

2、 根据用户名称来模糊查询用户信息列表;

3、添加用户;

一、原始dao开发方式

1、思路

需要写dao接口和dao实现类。

2、编程步骤

1、  根据需求创建po类

2、  编写全局配置文件

3、  根据需求编写映射文件

4、  加载映射文件

5、  编写dao接口

6、  编写dao实现类

7、  编写测试代码

3、程序编写

在测试代码中,有大量的重复代码。所以我们第一反应就是想给它抽取出共性的部分,

但是SqlSession、SqlSessionFactory、SqlSessionFactoryBuilder有着各自的生命周期,

因为这些生命周期的不同,抽取时要有针对性的处理。

sqlSession使用范围:
SqlSessionFactoryBuilder

它的作用只是通过配置文件创建SqlSessionFactory,所以只要创建出SqlSessionFactory,它就可以销毁了。

所以说,它的生命周期是在方法之内。

 SqlSessionFactory

它的作用是创建SqlSession的工厂,工厂一旦创建,除非应用停掉,不要销毁。

所以说它的生命周期是在应用范围内。这里可以通过单例模式来管理它。

在mybatis整合spring之后,最好的处理方式是把SqlSessionFactory交由spring来做单例管理。

 SqlSession

SqlSession是一个面向用户(程序员)的接口,它的默认实现是DefaultSqlSession。

Mybatis是通过SqlSession来操作数据库的。SqlSession中不仅包含要处理的SQL信息,还包括一些数据信息,

所以说它是线程不安全的,因此它最佳的生命周期范围是在方法体之内。

UserDao:

package com.hcx.mybatis.dao;import java.util.List;import org.apache.ibatis.session.SqlSession;import com.hcx.mybatis.po.User;/***  * <p>* Title: UserDao*/
public interface UserDao {// 1、 根据用户ID查询用户信息public User findUserById(int id) throws Exception;// 2、 根据用户名称模糊查询用户列表public List<User> findUsersByName(String name) throws Exception;// 3、 添加用户public void insertUser(User user) throws Exception;}

UserDaoImpl:

需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession

要注意SqlSession和SqlSessionFactory的生命周期。

package com.hcx.mybatis.dao;import java.util.List;import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;import com.hcx.mybatis.po.User;/*** Title: UserDaoImpl*/
public class UserDaoImpl implements UserDao {// 依赖注入private SqlSessionFactory sqlSessionFactory;//使用构造方法来初始化SqlSessionFactorypublic UserDaoImpl(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}@Overridepublic User findUserById(int id) throws Exception {// 通过工厂在方法内部获取sqlsession,这样可以避免线程安全问题SqlSession sqlSession = sqlSessionFactory.openSession();// 调用SqlSession的增删改查方法// 第一个参数:表示statement的唯一标示User user = sqlSession.selectOne("test.findUserById", id);System.out.println(user);// 关闭资源sqlSession.close();return user;}@Overridepublic List<User> findUsersByName(String name) {// 创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 调用SqlSession的增删改查方法// 第一个参数:表示statement的唯一标示List<User> list = sqlSession.selectOne("test.findUsersByName", name);System.out.println(list);// 关闭资源sqlSession.close();return list;}@Overridepublic void insertUser(User user) {// 创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 调用SqlSession的增删改查方法// 第一个参数:表示statement的唯一标示sqlSession.insert("test.insertUser", user);System.out.println(user.getId());// 提交事务sqlSession.commit();// 关闭资源sqlSession.close();}}

UserDaoTest:


public class UserDaoTest {//声明全局的SqlSessionFactoryprivate SqlSessionFactory sqlSessionFactory;@Beforepublic void setUp() throws Exception {// 1、读取配置文件String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 2、根据配置文件创建SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void testFindUserById() {//构造UserDao对象UserDao userDao = new UserDaoImpl(sqlSessionFactory);//调用UserDao对象的方法User user = userDao.findUserById(1);System.out.println(user);}@Testpublic void testFindUsersByName() {//构造UserDao对象UserDao userDao = new UserDaoImpl(sqlSessionFactory);//调用UserDao对象的方法List<User> list = userDao.findUsersByName("小明");System.out.println(list);}@Testpublic void testInsertUser() {//构造UserDao对象UserDao userDao = new UserDaoImpl(sqlSessionFactory);//构造User对象User user = new User();user.setUsername("东哥3");user.setAddress("清河宝盛西里3");//调用UserDao对象的方法userDao.insertUser(user);System.out.println(user.getId());}}

4、问题总结

原始dao开发存在一些问题:

存在一定量的模板代码。比如:通过SqlSessionFactory创建SqlSession;调用SqlSession的方法操作数据库;关闭Sqlsession。

存在一些硬编码。调用SqlSession的方法操作数据库时,需要指定statement的id,这里存在了硬编码。

二、Mapper代理开发方式

Mapper代理的开发方式,程序员只需要编写mapper接口(相当于dao接口)即可。Mybatis会自动的为mapper接口生成动态代理实现类。

不过要实现mapper代理的开发方式,需要遵循一些开发规范。

1、开发规范

1、  mapper接口的全限定名要和mapper映射文件的namespace的值相同。

2、  mapper接口的方法名称要和mapper映射文件中的statement的id相同;

3、  mapper接口的方法参数只能有一个,且类型要和mapper映射文件中statement的parameterType的值保持一致。

4、  mapper接口的返回值类型要和mapper映射文件中statement的resultType值或resultMap中的type值保持一致;

通过规范式的开发mapper接口,可以解决原始dao开发当中存在的问题:

1、  模板代码已经去掉;

2、  剩下去不掉的操作数据库的代码,其实就是一行代码。这行代码中硬编码的部分,通过第一和第二个规范就可以解决。

2、编程步骤

1、  根据需求创建po类

2、  编写全局配置文件

3、  根据需求编写映射文件

4、  加载映射文件

5、  编写mapper接口

6、  编写测试代码

3、程序编写

(1)编写mapper映射文件

重新定义mapper映射文件UserMapper.xml(内容同Users.xml,除了namespace的值),放到新创建的目录mapper下。

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">
<!-- namespace:此时用mapper代理方式,它的值必须等于对应mapper接口的全限定名  -->
<mapper namespace="cn.hcx.mybatis.mapper.UserMapper"><!-- 根据用户ID,查询用户信息 --><!-- [id]:statement的id,要求在命名空间内唯一  [parameterType]:入参的java类型,可是是简单类型、POJO、HashMap[resultType]:查询出的单条结果集对应的java类型[#{}]: 表示一个占位符?[#{id}]:表示该占位符待接收参数的名称为id。注意:如果参数为简单类型时,#{}里面的参数名称可以是任意定义--><select id="findUserById" parameterType="int" resultType="cn.hcx.mybatis.po.User">SELECT * FROM USER WHERE id = #{id}</select><!-- 根据用户名称模糊查询用户信息列表 --><!-- [${}]:表示拼接SQL字符串,即不加解释的原样输出[${value}]:表示要拼接的是简单类型参数。注意:1、如果参数为简单类型时,${}里面的参数名称必须为value 2、${}会引起SQL注入,一般情况下不推荐使用。但是有些场景必须使用${},比如order by ${colname}--><select id="findUsersByName" parameterType="java.lang.String" resultType="cn.hcx.mybatis.po.User">SELECT * FROM USER WHERE username LIKE '%${value}%'</select><!-- 添加用户之自增主键返回(selectKey方式) --><!-- [selectKey标签]:通过select查询来生成主键[keyProperty]:指定存放生成主键的属性[resultType]:生成主键所对应的Java类型[order]:指定该查询主键SQL语句的执行顺序,相对于insert语句,此时选用AFTER[last_insert_id]:MySQL的函数,要配合insert语句一起使用--><insert id="insertUser" parameterType="cn.hcx.mybatis.po.User"><selectKey keyProperty="id" resultType="int" order="AFTER">SELECT LAST_INSERT_ID()</selectKey>INSERT INTO USER(username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address})</insert></mapper>

(2)加载mapper映射文件

在SqlMapConfig.xml文件中:
<!-- 加载mapper -->
<mappers><mapper resource="sqlmap/User.xml"/><mapper resource="mapper/UserMapper.xml"/>
</mappers>

(3)编写mapper接口

内容与UserDao接口一样
public interface UserMapper {//根据用户ID来查询用户信息public User findUserById(int id);//根据用户名称来模糊查询用户信息列表public List<User> findUsersByName(String username);//添加用户public void insertUser(User user);
}

(4)编写测试代码

public class UserMapperTest {// 声明全局的SqlSessionFactoryprivate SqlSessionFactory sqlSessionFactory;@Beforepublic void setUp() throws Exception {// 1、读取配置文件String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 2、根据配置文件创建SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void testFindUserById() {// 创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 通过SqlSession,获取mapper接口的动态代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 调用mapper对象的方法User user = userMapper.findUserById(1);System.out.println(user);// 关闭SqlSessionsqlSession.close();}@Testpublic void testFindUsersByName() {// 创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 通过SqlSession,获取mapper接口的动态代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 调用mapper对象的方法List<User> list = userMapper.findUsersByName("小明");System.out.println(list);// 关闭SqlSessionsqlSession.close();}@Testpublic void testInsertUser() {// 创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 通过SqlSession,获取mapper接口的动态代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//构造User对象User user = new User();user.setUsername("东哥4");user.setAddress("清河宝盛西里4");// 调用mapper对象的方法userMapper.insertUser(user);System.out.println(user.getId());//执行SqlSession的commit操作sqlSession.commit();// 关闭SqlSessionsqlSession.close();}}

mybatis--开发Dao--原始dao方式和Mapper代理方式相关推荐

  1. MyBatis mapper代理方式

    3. mapper代理方式(程序员只需mapper接口(相当于Dao的接口)) 3.1   思路:1.程序员只需要写mapper接口(相当于Dao接口),mybatis可以自动生成mapper接口实现 ...

  2. springboot整合mybatis,使用逆向工程和使用通用mapper的方式

    一.使用逆向工程 集成mybatis的步骤: 1.导入mybatis和数据库的依赖 <parent><groupId>org.springframework.boot</ ...

  3. 02JavaWeb之MyBatis详解、SqlSession执行、mapper代理执行、动态SQL语句、注解开发、resultMap、resultType、多参数传递

    MyBatis MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发,它封装了JDBC大部分的操作. MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由 ...

  4. MyBatis中Mapper代理方式

    Mapper 的动态代理作用 目前使用sqlsession进行增删改查的缺点: [1]没有办法实现多参数的传递 [2]书写的时候没有接口,后期的维护就比较的低 解决的方案: Mapper的代理方式实现 ...

  5. mybatis教程--原始方式和mapper方式开发dao详解

    mybatis开发dao的两种方式 一.原始的dao开发方式 所谓的原始的dao的开发方式,其实就是和hibernate的开发方式类似的,需要dao的接口和dao的实现类,这个就是原始的开发方式,而m ...

  6. 【MyBatis框架】Mybatis开发dao方法第一部分

    下面来讨论mybatis开发Dao的方法 先来说一下基本架构流程中使用到的几个类 1.SqlSession使用范围 1.1SqlSessionFactoryBuilder  通过SqlSessionF ...

  7. mybatis dao实现 || 接口代理方式实现

    目录 1.mybatis环境搭建 2.mybatis dao接口实现 3.动态代理方式,只实现Mapper接口 mybatis入门==单表操作demo mybatis dao层实现1. 实现dao层接 ...

  8. Mybatis mapper代理SqlMapConfig.xml配置详解

    SqlMapConfig.xml是mybatis的全局配置文件: 1.mapper映射配置 >配置mapper的另外一种方式: <mappers> <mapper resour ...

  9. SSM21:Mapper代理开发

    目录 创建数据库 连接数据库 导入坐标pom.xml 编写mybatis.xml配置文件 编写日志配置文件 编写sql映射文件UserMapper.xml 创建UserMapper接口 创建pojo类 ...

最新文章

  1. iOS自动签名打包(xcodebuild)----常用
  2. 错误:Script file ‘D:\software_install\Anaconda_install\Scripts\pip-script.py‘ is not present.完美解决方法
  3. 4kyu N linear
  4. qmoc文件_Qt中Q_OBJECT与生成的moc文件的作用
  5. python3 安装opencv_Page20-opencv的编译与安装
  6. 小论文期刊投稿相关整理资料
  7. 《ASP.NET Core 微服务实战》-- 读书笔记(第12章)
  8. 面向对象的写法,见到就添,持续更新。。。
  9. 如何从 0 到 1 参与 Flink 社区?
  10. HTML5程序设计 SVG
  11. Android 权限清单大全
  12. windows 搭建kms服务器激活_自建KMS激活服务器的技巧
  13. CoppeliaSim(Vrep)动力学仿真入门设置
  14. 谷歌浏览器访问接口无返回
  15. Java常量池与方法区
  16. myeclipse配置下面没有Tomcat的解决办法
  17. 大胖子走迷宫 [蓝桥杯 ]
  18. hdu 5956 The Elder
  19. portal认证 java_华为5700交换机通过外部开源protal和本地aaa用户认证的一些问题
  20. SAXReader saxReader = new SAXReader();来解析xml文件

热门文章

  1. 解决win2008下系统补丁无法安装的问题
  2. 一枚渣渣的贝壳找房笔试惨痛经历
  3. 浙江大学数据结构(4.1二叉搜索树)
  4. 海尔三翼鸟:生态聚拢的密度,决定场景落地速度
  5. 亚马逊化妆品眼影,口红等需要提供哪些报告才可以正常销售呢?提交步骤有哪些?
  6. chrome顶部变黑_win10系统chrome内核浏览器地址栏变黑的解决方法
  7. css毛玻璃效果/el-progress进度条渐变/axios的基本使用/跨域配置/关闭eslint验证
  8. Java设计模之简单工厂模式
  9. Ubuntu20.04分区方案
  10. Ubuntu一些实用软件安装