思路

程序员需要写 dao 接口和 dao 实现类

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

项目准备

1、项目结构

① 新建 Java 项目

② 在 src 下新建 com.liuyanzhao.mybatis.po 包(用来放持久化类,和数据库对应)

和 com.liuyanzhao.mybatis.dao 包 (用来放 CURD 实现代码)

③ 在 src 下新建(或者拷贝)Configuration.xml (mybatis全局配置文件)和 userDao.xml (映射文件)

2、导入 两个必备的 jar 包

  • mysql-jdbc 驱动包: mysql-connector-java-5.1.41-bin.jar
  • mybatis 包:mybatis-3.4.4.jar

在项目中新建一个 lib 目录,将两个包拷贝到 lib 中,然后将两个包加入环境(build path)中

3、新建数据库和数据表

我这里在本地测试,主机 localhost,数据库用户名root,密码为空

① 新建数据库:mybatis

② 新建数据表:user表

表结构如下,五个字段(id,username,gender,birthday,address)

代码实现

1、Configuration.xml    mybatis的全局配置文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 和Spring整合后,environments配置将废除-->
  7. <environments default="development">
  8. <environment id="development">
  9. <!--使用JDBC事务管理,事务控制由mybatis-->
  10. <transactionManager type="JDBC">
  11. <property name="" value=""/>
  12. </transactionManager>
  13. <!--数据库连接池-->
  14. <dataSource type="UNPOOLED">
  15. <property name="driver" value="com.mysql.jdbc.Driver"/>
  16. <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8"/>
  17. <property name="username" value="root"/>
  18. <property name="password" value=""/>
  19. </dataSource>
  20. </environment>
  21. </environments>
  22. <!--加载映射文件-->
  23. <mappers>
  24. <mapper resource="userDao.xml" />
  25. </mappers>
  26. </configuration>

2、userDao.xml   映射文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!--namespace命名空间,作用是对sql进行分类话管理,理解sql,理解sql隔离
  6. 注意:使用mapper代理方法开发,namespace有着特殊的作用
  7. -->
  8. <mapper namespace="test">
  9. <!--在映射文件中配置很多sql语句-->
  10. <!--
  11. id:表示映射文件中的sql
  12. 将sql语句封装到mappedStatement对象中,所以称id为Statement的id
  13. parameterType:指定输入参数的类型
  14. resultType:指定就是单条记录所映射的java对象类型
  15. #{}表示占位符,相当于?
  16. #{id} 其中id表示接受输入的参数,参数名就是id,如果输入的参数是简单类型,#{}中的参数可以任意,可以value或者其他名称
  17. ${}:表示拼接sql串,将接受到的参数的内容不加任何修饰直接拼接在sql中
  18. ${}安全隐患:使用${}拼接sql,引起sql注入
  19. ${value}:接受输入参数的内容,如果传入类型是简单类型,${}中只有使用value
  20. -->
  21. <select id="findUserById" parameterType="int" resultType="com.liuyanzhao.mybatis.po.User">
  22. SELECT * FROM user WHERE id=#{value}
  23. </select>
  24. <!--根据用户名称模糊查询,可能返回多条-->
  25. <select id="findUserByName" parameterType="java.lang.String" resultType="com.liuyanzhao.mybatis.po.User">
  26. SELECT * FROM user WHERE username LIKE '%${value}%'
  27. </select>
  28. <!--#{}指定pojo的属性名,接收到pojo对象的属性值,Mybatis通过OGNL获取对象的属性值-->
  29. <!--添加用户-->
  30. <insert id="insertUser" parameterType="com.liuyanzhao.mybatis.po.User">
  31. <!--
  32. 将插入数据的主键返回,返回到user对象中
  33. SELECT LAST_INSERT_ID(); 得到insert进去的主键值,只适用自增主键
  34. -->
  35. <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
  36. SELECT LAST_INSERT_ID()
  37. </selectKey>
  38. INSERT INTO user(username,birthday,gender,address) VALUE(#{username},#{birthday},#{gender},#{address})
  39. </insert>
  40. <!--删除用户,根据id-->
  41. <delete id="deleteUserById" parameterType="java.lang.Integer">
  42. DELETE FROM user WHERE id=#{id}
  43. </delete>
  44. <!--更新用户,根据id
  45. 需要传入用户信息
  46. parameterType指定user对象,包括id和更新信息。注意:id必须存在
  47. #{id}:从输入的user对象中获取id的属性值
  48. -->
  49. <update id="updateUserById" parameterType="com.liuyanzhao.mybatis.po.User">
  50. UPDATE user SET username=#{username},birthday=#{birthday},gender=#{gender},address=#{address} WHERE id=#{id}
  51. </update>
  52. </mapper>

3、UserDao.java   dao接口

  1. package com.liuyanzhao.mybatis.dao;
  2. import com.liuyanzhao.mybatis.po.User;
  3. import java.util.List;
  4. /**
  5. * Created by 言曌 on 2017/8/10.
  6. */
  7. public interface UserDao {
  8. //根据id查询用户信息
  9. public User findUserById(int id) throws Exception;
  10. //根据username查询用户信息
  11. public List<User> findUserByName(String username) throws Exception;
  12. //添加用户信息
  13. public void insertUser(User user) throws Exception;
  14. //删除用户信息
  15. public void deleteUser(int id) throws Exception;
  16. //更新用户信息
  17. public void updateUser(User user) throws Exception;
  18. }

4、UserDaoImpl.java  dao接口的实现类

  1. package com.liuyanzhao.mybatis.dao;
  2. import com.liuyanzhao.mybatis.po.User;
  3. import org.apache.ibatis.session.SqlSession;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import java.util.List;
  6. /**
  7. * Created by 言曌 on 2017/8/10.
  8. */
  9. public class UserDaoImpl implements UserDao{
  10. //向dao实现类注入SqlSessionFactory
  11. //这里通过构造方法注入
  12. private SqlSessionFactory sqlSessionFactory;
  13. public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
  14. this.sqlSessionFactory = sqlSessionFactory;
  15. }
  16. @Override
  17. public User findUserById(int id) throws Exception {
  18. SqlSession sqlSession = sqlSessionFactory.openSession();
  19. //执行查询操作,赋值给user对象
  20. User user = sqlSession.selectOne("test.findUserById",id);
  21. //释放资源
  22. sqlSession.close();
  23. return user;
  24. }
  25. @Override
  26. public List<User> findUserByName(String username) throws Exception {
  27. SqlSession sqlSession = sqlSessionFactory.openSession();
  28. //执行查询操作,存储到list中
  29. List<User> list = sqlSession.selectList("test.findUserByName",username);
  30. //释放资源
  31. sqlSession.close();
  32. return list;
  33. }
  34. @Override
  35. public void insertUser(User user) throws Exception {
  36. SqlSession sqlSession = sqlSessionFactory.openSession();
  37. //执行插入操作
  38. sqlSession.insert("test.insertUser",user);
  39. //提交事务
  40. sqlSession.commit();
  41. //释放资源
  42. sqlSession.close();
  43. }
  44. @Override
  45. public void deleteUser(int id) throws Exception {
  46. SqlSession sqlSession = sqlSessionFactory.openSession();
  47. //执行删除操作
  48. sqlSession.delete("test.deleteUserById",id);
  49. //提交事务
  50. sqlSession.commit();
  51. //释放资源
  52. sqlSession.close();
  53. }
  54. @Override
  55. public void updateUser(User user) throws Exception {
  56. SqlSession sqlSession = sqlSessionFactory.openSession();
  57. //执行更新操作
  58. sqlSession.update("test.updateUserById",user);
  59. //提交事务
  60. sqlSession.commit();
  61. //释放资源
  62. sqlSession.close();
  63. }
  64. }

5、测试类 UserDaoImplTest.java

  1. package com.liuyanzhao.mybatis.test;
  2. import com.liuyanzhao.mybatis.dao.UserDao;
  3. import com.liuyanzhao.mybatis.dao.UserDaoImpl;
  4. import com.liuyanzhao.mybatis.po.User;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.apache.ibatis.io.Resources;
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8. import org.junit.Before;
  9. import org.junit.Test;
  10. import java.io.InputStream;
  11. import java.util.Date;
  12. import java.util.List;
  13. /**
  14. * Created by Liu_Yanzhao on 2017/8/10.
  15. */
  16. public class UserDaoImplTest {
  17. private SqlSessionFactory sqlSessionFactory;
  18. @Before
  19. public void setUp() throws Exception {
  20. String resource = "Configuration.xml";
  21. InputStream inputStream = Resources.getResourceAsStream(resource);
  22. sqlSessionFactory = new SqlSessionFactoryBuilder()
  23. .build(inputStream);
  24. }
  25. //测试,根据id查询用户
  26. @Test
  27. public void testFindUserById() throws Exception {
  28. UserDao userDao = new UserDaoImpl(sqlSessionFactory);
  29. User user = userDao.findUserById(10);
  30. System.out.println(user);
  31. }
  32. //测试,根据username查询用户
  33. @Test
  34. public void testFindUserByName() throws Exception {
  35. UserDao userDao = new UserDaoImpl(sqlSessionFactory);
  36. List<User> list = userDao.findUserByName("小明");
  37. System.out.println(list);
  38. }
  39. //测试,添加信息
  40. @Test
  41. public void testInsertUser() throws Exception {
  42. UserDao userDao = new UserDaoImpl(sqlSessionFactory);
  43. //创建User对象,存储用户信息
  44. User user = new User();
  45. user.setUsername("龙小云");
  46. user.setGender("女");
  47. user.setBirthday(new Date());
  48. user.setAddress("江西南昌");
  49. //执行添加操作
  50. userDao.insertUser(user);
  51. }
  52. //测试,删除信息
  53. @Test
  54. public void testDeleteUserByUser() throws Exception {
  55. UserDao userDao = new UserDaoImpl(sqlSessionFactory);
  56. //执行删除操作
  57. userDao.deleteUser(10);
  58. }
  59. //测试,更新用户信息
  60. @Test
  61. public void testUpdateUser() throws Exception {
  62. UserDao userDao = new UserDaoImpl(sqlSessionFactory);
  63. //创建User对象,存储用户信息
  64. User user = new User();
  65. user.setId(8);
  66. user.setUsername("令小冲");
  67. user.setGender("男");
  68. user.setBirthday(new Date());
  69. user.setAddress("华山");
  70. //执行更新操作
  71. userDao.updateUser(user);
  72. }
  73. }

总结原生 dao 开发问题

1、dao 接口实现类方法中存在大量模板方法,设想是否能将这些代码提取出来,从而减少程序员的工作量。

2、调用 sqlSession 方法时将 statement 的 id 硬编码(硬编码是指将可变变量用一个固定值来代替的方法)了。

如:

  1. User user = sqlSession.selectOne("test.findUserById",id);

在根据id查询用户的方法里,这句里的 "test.findUserById" 是一个固定的值。

3、调用 sqlSession 方法时传入的变量,由于 sqlSession 方法使用泛型,即使变量类型传入错误,在编译阶段也不会报错,不利于 程序员开发

如:

  1. User user = sqlSession.selectOne("test.findUserById",id);

还是 2  中的那一行代码,id 处接受一个对象值,但是我们要求是 一个整数,所以当我输入其他的,如字符串类型时,编译时不会报错,运行时才会有。

本文链接:https://liuyanzhao.com/5782.html

Mybatis原生dao开发方法实现增删改查相关推荐

  1. Mybatis中使用Dao实现类实现增删改查【实际开发中使用代理dao】

    在Mybatis开发中,使用到的是代理Dao的方式实现增删改查,这样就不需要在写Dao的实现类 但是Mybatis也支持写Dao实现类!即DaoImpl 直接上DaoImpl,之前的代码可以参考前面几 ...

  2. HibernateTemplate、HibernateDaoSupport两种方法实现增删改查Good

    Spring+Hibernate两种方法实现增删改查 首先,定义一个Customer的bean类,设置好Customer.hbm.xml文件.再定义好一个Dao接口.准备好一个jdbc.propert ...

  3. 【Vue】MyClassroom.vue 使用组件方法实现增删改查-20221226

    MyClassroom.vue 使用组件方法实现增删改查. <template><div class="container"><div class=& ...

  4. 【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

    目录 前言 一.准备工作 1.1.下载MyBatis 1.2.数据库设计 二.搭建框架 2.1.创建Maven项目 2.2.jar包.引入依赖 2.3.创建MyBatis核心配置文件 2.4.映射文件 ...

  5. springboot整合mybatis实现简单的单表增删改查(完整代码可下载)

    搭建项目 项目简单效果,前端效果丑的一批,主要是后端功能实现: springboot增删改查 csdn完整代码下载链接: springboot+mybatis Gitee下载地址: Gitee下载地址 ...

  6. springboot+mybatis+thymleft 做一套简单增删改查

    首先我们先创建项目 注意:创建SpringBoot项目时一定要联网不然会报错 项目创建好后我们首先对 application.yml 进行编译 #指定端口号 server:port: 8888 #配置 ...

  7. android增删功能代码,Android Studio开发实战 之 增删改查

    增删改查是一个应用最基础的操作,增删改查的流程走通了,下面的路程也就顺利多了.现在使用Android Studio开发一个简单的应用,该应用就实现了增删改查的操作,看似简单,到底简不简单呢,下面开始操 ...

  8. jdbc增删改查有哪些步骤_用Mybatis如何实现对数据库的增删改查步骤

    使用Mybatiss实现对数据库的增删改查 文件目录 1.导入jar包,这里使用maven <dependencies><!--mybatis依赖--><!-- org. ...

  9. java连接mysql数据库连接池_java使用原生MySQL实现数据的增删改查以及数据库连接池技术...

    一.工具类及配置文件准备工作 1.1 引入jar包 使用原生MySQL,只需要用到MySQL连接的jar包,maven引用方式如下: mysql mysql-connector-java 5.1.48 ...

  10. 02.Mybatis的动态代理方式实现增删改查

    动态代理的方式实现增删改查: 通过约定的方式定位sql语句 约定 > 配置文件 > 硬编码 约定的目标是省略掉通过硬编码的方式定位sql的代码,通过接口直接定位出sql语句,以下代码为通过 ...

最新文章

  1. matplotlib.pyplot中add_subplot方法参数的含义
  2. IE9开始支持SVG格式(VML终结)
  3. Metro Win8风格的按钮(Filp翻转)
  4. adb查看某个文件是否存在_动能定理是否存在某个方向的分量方程式?
  5. 获取前一天的时间安排表_要想有一个完美的婚礼 这份婚庆策划时间表少不了...
  6. 让php4和php5共存的方法
  7. 【TeeChart .NET教程】(七)使用函数
  8. android webview测速,学习分享,echarts模拟宽带测速效果 附Demo演示地址!!
  9. element-ui多选框模糊搜索输入文字闪动问题
  10. 基于jedis的Redis工具类
  11. AcWing 1738. 蹄球(特殊基环树)
  12. python3 字符串_Python3字符串 详解
  13. python写彩票程序30选7_写一个彩票程序:30选7
  14. MIPS32-单周期数据通路设计
  15. 【华为OD机试真题 JAVA】事件推送
  16. Java项目前后端文件简体转换繁体
  17. AE学习02:时间轴
  18. 核与线程 什么叫四核八线程
  19. IBuySpy 网上商店的设计和实现
  20. JAVA Idea中各个包.idea,out,src,web所放类的作用说明

热门文章

  1. 2018云+未来峰会圆桌面对面:以网络安全之能,造国之重器
  2. mysql客户端navicat连接数据库
  3. JAVA代码 httpclient 模拟NTLM域登录 GET、POST两种连接方式
  4. 肯德基champs各个字母代表什么_百度知道
  5. nis+nfs+autofs
  6. 用python的turtle库画圣诞树
  7. py樱花代码_武汉大学生用代码敲出樱花绽放,这个开源项目也很酷炫
  8. ARM基础相关寄存器的讲解-LPC21XX
  9. 安卓开发 在oncreate显示对话框 hide 之后 点不动_微信小程序云开发教程微信小程序的API入门常用API...
  10. python 并发编程实战_使用Python进行并发编程