摘要
使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方式和Mapper接口代理开发方式。而现在主流的开发方式是接口代理开发方式,这种方式总体上更加简便。口代理开发方式为主。现在给大家介绍一下基于传统编写Dao实现类的开发方式。
一、数据库脚本准备
/*
Navicat MySQL Data Transfer
Source Server : localhost_3306
Source Server Version : 50732
Source Host : localhost:3306
Source Database : mybatis
Target Server Type : MYSQL
Target Server Version : 50732
File Encoding : 65001
Date: 2021-12-24 11:51:18
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for account
-- ----------------------------
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`id` int(11) NOT NULL COMMENT '编号',
`uid` int(11) DEFAULT NULL COMMENT '用户编号',
`money` double DEFAULT NULL COMMENT '金额',
PRIMARY KEY (`id`),
KEY `FK_Reference_8` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of account
-- ----------------------------
INSERT INTO `account` VALUES ('1', '41', '1000');
INSERT INTO `account` VALUES ('2', '45', '1000');
INSERT INTO `account` VALUES ('3', '41', '2000');
-- ----------------------------
-- Table structure for role
-- ----------------------------
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
`ID` int(11) NOT NULL COMMENT '编号',
`ROLE_NAME` varchar(30) DEFAULT NULL COMMENT '角色名称',
`ROLE_DESC` varchar(60) DEFAULT NULL COMMENT '角色描述',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of role
-- ----------------------------
INSERT INTO `role` VALUES ('1', '院长', '管理整个学院');
INSERT INTO `role` VALUES ('2', '总裁', '管理整个公司');
INSERT INTO `role` VALUES ('3', '校长', '管理整个学校');
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`password` varchar(20) DEFAULT NULL,
`birthday` datetime DEFAULT NULL COMMENT '生日',
`sex` char(1) DEFAULT NULL COMMENT '性别',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('41', '张三丰', '111', '2018-02-27 17:47:08', '男', '上海徐汇');
INSERT INTO `user` VALUES ('42', '宋远桥', '111', '2018-03-02 15:09:37', '女', '北京昌平');
INSERT INTO `user` VALUES ('43', '俞莲舟', '111', '2018-03-04 11:34:34', '女', '陕西西安');
INSERT INTO `user` VALUES ('45', '张翠山', '111', '2018-03-04 12:04:06', '男', '山东济南');
INSERT INTO `user` VALUES ('46', '殷梨亭', '111', '2018-03-07 17:37:26', '男', '河北张家口');
INSERT INTO `user` VALUES ('48', '莫声谷', '111', '2018-03-08 11:44:00', '女', '山西太原');
-- ----------------------------
-- Table structure for user_role
-- ----------------------------
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) DEFAULT NULL,
`rid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user_role
-- ----------------------------
INSERT INTO `user_role` VALUES ('1', '45', '1');
INSERT INTO `user_role` VALUES ('2', '41', '1');
INSERT INTO `user_role` VALUES ('3', '45', '2');
二、代码分析
(1)创建一个接口UusrDao
package com.by.mapper;
import com.by.pojo.User;
import java.util.List;
public interface UserDao {
// 查询所有User信息
public List<User> findAll();
// 根据id查询User
public User findUserById(Integer id);
// 保存用户信息
public void saveUser(User user);
// 修改用户
public void updateUser(User user);
// 删除用户
public void deleteUserById(Integer id);
}
(2)创建接口的实现类UserDaoImpl
package com.by.mapper;
import com.by.pojo.User;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class UserDaoImpl implements UserDao {
private SqlSession sqlSession;
//将sqlSession 作为参数传入 构造函数
public UserDaoImpl(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
// 查询所有数据
@Override
public List<User> findAll() {
List<User> userList = sqlSession.selectList("com.by.mapper.UserDao.findAll");
sqlSession.close();
return userList;
}
// 根据id查询user
@Override
public User findUserById(Integer id) {
User user = sqlSession.selectOne("com.by.mapper.UserDao.findUserById", id);
sqlSession.close();
return user;
}
// 保存用户信息
@Override
public void saveUser(User user) {
sqlSession.insert("com.by.mapper.UserDao.saveUser", user);
//提交信息 操作数据库
sqlSession.commit();
sqlSession.close();
}
// 修改用户信息
@Override
public void updateUser(User user) {
sqlSession.update("com.by.mapper.UserDao.updateUser", user);
sqlSession.commit();
sqlSession.close();
}
// 删除用户信息
@Override
public void deleteUserById(Integer id) {
sqlSession.delete("com.by.mapper.UserDao.deleteUserById",id);
sqlSession.commit();
sqlSession.close();
}
}
(3)定义映射文件UserDao.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.by.mapper.UserDao">
<!-- 查询用户的所有信息-->
<select id="findAll" resultType="User">
select * from mybatis.user
</select>
<!-- 根据id 查询用户信息-->
<select id="findUserById" parameterType="int" resultType="user">
select * from mybatis.user where id=#{id}
</select>
<!-- 保存用户信息 -->
<insert id="saveUser" parameterType="user">
insert into mybatis.user(username, password, birthday, sex, address)
values (#{username}, #{password}, #{birthday}, #{sex}, #{address})
</insert>
<!-- 修改用户信息-->
<update id="updateUser" parameterType="user">
update mybatis.user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id}
</update>
<!-- 删除用户信息-->
<delete id="deleteUserById" parameterType="int">
delete from mybatis.user where id=#{id};
</delete>
</mapper>
(4)创建测试类
/*
* Copyright (c) 2020, 2023, webrx.cn All rights reserved.
*
*/
import com.by.mapper.RoleMapper;
import com.by.mapper.UserDao;
import com.by.mapper.UserDaoImpl;
import com.by.pojo.Role;
import com.by.pojo.User;
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.After;
import org.junit.Before;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
* <p>Project: mybatis - test</p>
* <p>Powered by webrx On 2023-12-20 14:40:47</p>
* <p>描述:<p>
*
* @author 简单遗忘 [814736551@qq.com]
* @version 1.0
* @since 17
*/
public class Test {
RoleMapper roleMapper;
InputStream inputstream;
SqlSession sqlSession;
@Before
public void init() throws IOException {
String resource = "mybatis-config.xml";
inputstream = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
//获得数据的会话实例
sqlSession = sessionFactory.openSession();
//返回接口的代理类
roleMapper = sqlSession.getMapper(RoleMapper.class);
}
/*
1. 查询用户所有信息
*/
@org.junit.Test
public void testFindAll() {
//1. 创建接口实现类的对象
UserDao userDao = new UserDaoImpl(sqlSession);
List<User> userL = userDao.findAll();
for (User user : userL) {
System.out.println(user);
}
}
/*
2. 根据id 查询用户信息
*/
@org.junit.Test
public void testFindUserById() {
UserDaoImpl userDao = new UserDaoImpl(sqlSession);
User userById = userDao.findUserById(41);
System.out.println(userById);
}
/*
3. 保存用户信息
*/
@org.junit.Test
public void testSaveUser() {
UserDao userDao = new UserDaoImpl(sqlSession);
User user = new User();
user.setUsername("灭绝师太");
user.setPassword("123");
user.setBirthday(new Date());
user.setSex("女");
user.setAddress("商丘");
userDao.saveUser(user);
}
/*
4. 修改用户信息
*/
@org.junit.Test
public void testUpdateUser() {
UserDao userDao = new UserDaoImpl(sqlSession);
User user = new User();
user.setUsername("周芷若");
user.setId(49);
userDao.updateUser(user);
}
/*
4. 删除用户信息
*/
@org.junit.Test
public void testDeleteUser() {
UserDao userDao = new UserDaoImpl(sqlSession);
userDao.deleteUserById(49);
}
@After
public void close() throws IOException {
//关闭
sqlSession.close();
inputstream.close();
}
}
三、运行结果