Mybatis实现数据的增删改查(CRUD)

什么是 MyBatis?

MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

MyBatis下载:https://github.com/mybatis/mybatis-3/releases

Mybatis实例

对一个User表的CRUD操作:

User表:

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(50) DEFAULT NULL,
  `userAge` int(11) DEFAULT NULL,
  `userAddress` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'summer', '30', 'shanghai');
INSERT INTO `user` VALUES ('2', 'test2', '22', 'suzhou');
INSERT INTO `user` VALUES ('3', 'test1', '29', 'some place');
INSERT INTO `user` VALUES ('4', 'lu', '28', 'some place');
INSERT INTO `user` VALUES ('5', 'xiaoxun', '27', 'nanjing');

在Src目录下建一个mybatis的xml配置文件Configuration.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- mybatis别名定义 -->
    <typeAliases>
        <typeAlias alias="User" type="com.mybatis.test.User"/>
    </typeAliases> 

    <environments default="development">
        <environment id="development">
        <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis" />
            <property name="username" value="root"/>
            <property name="password" value="admin"/>
            </dataSource>
        </environment>
    </environments>

    <!-- mybatis的mapper文件,每个xml配置文件对应一个接口 -->
    <mappers>
        <mapper resource="com/mybatis/test/User.xml"/>
    </mappers>
</configuration>

定义User mappers的User.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.mybatis.test.IUserOperation">

    <!-- select语句 -->
    <select id="selectUserByID" parameterType="int" resultType="User">
        select * from `user` where user.id = #{id}
    </select>

    <!-- 定义的resultMap,可以解决类的属性名和数据库列名不一致的问题-->
    <!-- <resultMap type="User" id="userResultMap">
        <id property="id" column="user_id"  />
        <result property="userName" column="user_userName"  />
        <result property="userAge" column="user_userAge"  />
        <result property="userAddress" column="user_userAddress"  />
    </resultMap> -->

    <!-- 返回list的select语句,注意 resultMap的值是指向前面定义好的 -->
    <!-- <select id="selectUsersByName" parameterType="string" resultMap="userResultMap">
        select * from user where user.userName = #{userName}
    </select> -->

    <select id="selectUsersByName" parameterType="string" resultType="User">
        select * from user where user.userName = #{userName}
    </select>

    <!--执行增加操作的SQL语句。id和parameterType分别与IUserOperation接口中的addUser方法的名字和参数类型一致。
    useGeneratedKeys设置为"true"表明要MyBatis获取由数据库自动生成的主键;keyProperty="id"指定把获取到的主键值注入到User的id属性-->
    <insert id="addUser" parameterType="User"
        useGeneratedKeys="true" keyProperty="id">
        insert into user(userName,userAge,userAddress)
             values(#{userName},#{userAge},#{userAddress})
    </insert>

    <update id="updateUser" parameterType="User" >
        update user set userName=#{userName},userAge=#{userAge},userAddress=#{userAddress} where id=#{id}
    </update>

    <delete id="deleteUser" parameterType="int">
        delete from user where id=#{id}
    </delete>

</mapper>

配置文件实现了接口和SQL语句的映射关系。selectUsersByName采用了2种方式实现,注释掉的也是一种实现,采用resultMap可以把属性和数据库列名映射关系定义好,property为类的属性,column是表的列名,也可以是表列名的别名!

User类的定义:

package com.mybatis.test;

public class User {

    private int id;
    private String userName;
    private int userAge;
    private String userAddress;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getUserAge() {
        return userAge;
    }

    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    @Override
    public String toString(){
        return this.userName+" "+this.userAge+" "+this.userAddress;
    }

}

IUserOperaton定义:

package com.mybatis.test;

import java.util.List;

public interface IUserOperation {

    public User selectUserByID(int id);

    public List<User> selectUsersByName(String userName);

    public void addUser(User user);

    public void updateUser(User user);

    public void deleteUser(int id);

}

IUserOperation为操作接口,函数名和mybatis的xml配置文件中的操作id名对应。

测试类Test:

package com.mybatis.test;

import java.io.Reader;
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;

public class Test {

    private static SqlSessionFactory sqlSessionFactory;
    private static Reader reader;

    static {
        try {
            reader = Resources.getResourceAsReader("Configuration.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory getSession() {
        return sqlSessionFactory;
    }

    public void getUserByID(int userID) {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session
                    .getMapper(IUserOperation.class);
            User user = userOperation.selectUserByID(userID);
            if (user != null) {
                System.out.println(user.getId() + ":" + user.getUserName()
                        + ":" + user.getUserAddress());
            }

        } finally {
            session.close();
        }
    }

    public void getUserList(String userName) {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session
                    .getMapper(IUserOperation.class);
            List<User> users = userOperation.selectUsersByName(userName);
            for (User user : users) {
                System.out.println(user.getId() + ":" + user.getUserName()
                        + ":" + user.getUserAddress());
            }

        } finally {
            session.close();
        }
    }

    /**
     * 增加后要commit
     */
    public void addUser() {
        User user = new User();
        user.setUserAddress("place");
        user.setUserName("test_add");
        user.setUserAge(30);
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session
                    .getMapper(IUserOperation.class);
            userOperation.addUser(user);
            session.commit();
            System.out.println("新增用户ID:" + user.getId());
        } finally {
            session.close();
        }
    }

    /**
     * 修改后要commit
     */
    public void updateUser() {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session
                    .getMapper(IUserOperation.class);
            User user = userOperation.selectUserByID(1);
            if (user != null) {
                user.setUserAddress("A new place");
                userOperation.updateUser(user);
                session.commit();
            }
        } finally {
            session.close();
        }
    }

    /**
     * 删除后要commit.
     *
     * @param id
     */
    public void deleteUser(int id) {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session
                    .getMapper(IUserOperation.class);
            userOperation.deleteUser(id);
            session.commit();
        } finally {
            session.close();
        }
    }

    public static void main(String[] args) {
        try {
            Test test = new Test();
            // test.getUserByID(1);
            // test.getUserList("test1");
            // test.addUser();
            // test.updateUser();
            // test.deleteUser(6);

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

}

 

代码下载:http://download.csdn.net/detail/luxiaoxun/8056559

Source Code:https://github.com/luxiaoxun/MybatisDemo

 

参考:

MyBatis-3-User-Guide-zh

http://legend2011.blog.51cto.com/3018495/d-5

http://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html

 

作者:阿凡卢

出处:http://www.cnblogs.com/luxiaoxun/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

时间: 2024-11-02 17:03:21

Mybatis实现数据的增删改查(CRUD)的相关文章

JAVA访问数据库之增删改查(CRUD)

上一篇博客介绍了如何使用JAVA连接数据库,那么这一篇将继续为大家介绍如何使用JDBC对数据库的增删改查(CRUD)操作. 这一篇博客中的示例将使用上一篇中生成的H2数据库文件. 查询 查询在数据库的操作中是很重要的,我们把数据保存在数据库中,就是为了我们在需要的时候能够快速.高效的查询出来. /** * 查询 * * @throws Exception */ public void query() throws Exception { Connection conn = getConnecti

如何在JTable中实现数据的增删改查,有示例说明最好

问题描述 各位大侠,有人能详细介绍下如何用JTable实现数据的增删改查吗,小弟急求.我要没搞定,明年的咋天就是我的祭日了,悲剧中. 解决方案 解决方案二:看以下DefaultTableModel的API解决方案三:没搞过swing解决方案四:引用楼主tianxiawuzei的回复: 各位大侠,有人能详细介绍下如何用JTable实现数据的增删改查吗,小弟急求.我要没搞定,明年的咋天就是我的祭日了,悲剧中. 鬼啊!!!!解决方案五:试试喔

使用Dojo和Grails快速实现数据的增删改查(CRUD)

选择 Grails 和 Dojo 的原因 随着 web 的广泛应用,web application 的开发项 目越来越多,而大部分的 web 开发归根结底都是对数据库的增删改查.对于一张数据库表的 增删改查,采用基于 MVC(模型 - 视图 - 控制器)设计模式的开发往往需要 Domain class . Controller.4 个增删改查的页面.form 输入数据的校验等.这样就免不了大量类似功 能的复制粘贴修改. 如果你想从重复劳动中解放出来,Grails 是一个很好的选择. 使用 Gra

sharepoint做数据的增删改查,统计

问题描述 用户之前自己用excel表在维护他们的数据,还用到了excel的宏:实现简单的数据增删改和查询统计:但因为想多人同时编辑,也希望更好用的一点:找到我希望基于工厂的sharepoint实现此功能:如果用vs.net之类+sqlserver,分分钟就轻松搞定:但由于某些原因,只能用sharepoint来做:我用sharepoint做过一些应用,比如文档库.工作流等等:但上述需求没做过,谁有好的建议吗:sharepoint能否实现的了这个需求:谢谢: 解决方案 解决方案二:建议尝试用Shar

winform 窗体实现增删改查(CRUD)共用模式

转载:http://www.csframework.com/archive/2/arc-2-20110617-1632.htm 高度封装的编辑窗体 http://www.cnblogs.com/wuhuacong/archive/2010/05/31/1748579.html 本站原创文章是有针对性地实现一个功能或一个简单的项目. 有很多刚毕业的学生都有着丰富的理论知识,通过学习本站实例源码,我们相信很快提高您的开发经验.但开发较大型项目,光从实践角度来讲还是不够的,尽管少数学生在校期间开发出一

2.非关系型数据库(Nosql)之mongodb:mongodb显示所有数据库,使用数据库,集合创建(显示和隐式创建),集合查询,初步数据的增删改查,分页

 1代开一个cmd窗口,当作mongodb客户端,执行以下命令: mongo localhost:27017 2查看所有的数据库: > show dbs; admin (empty) local 0.078GB 3 db命令,查看当前窗口在那个数据库下面(test数据库没有任何数据,在内存里面): 4创建集合 A 显示创建 db.createCollection("collectionName"); > db.createCollection("c1"

Android中访问通讯录,数据的增删改查

1.权限 <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> 2.通过提供的内容供应商访问通信录(uri) content://com.android.contacts/contacts 操作的数据是联系人信息Uri con

winform 窗体实现增删改查(CRUD)窗体基类模式

参考博客下方:http://www.cnblogs.com/wuhuacong/archive/2010/05/31/1748579.html 对于一般常用到的编辑数据.新增数据窗体,分开了两个不同的窗体进行处理,而且由于BaseForm窗体没有对通用的函数进行进一步的抽象,因此,编辑及新增窗体多了很多重复累赘的代码,其实可以把新增.编辑合并一个窗体,然后根据新增.编辑两种不同的条件进行处理即可. 由于BaseForm一般需要在大多数的窗体中,而新增编辑数据窗体一般较为特殊一点,可以再增加一个基

java除了增删改查还能干什么?

问题描述 java除了写增删改查,还能干什么啊?自己写了多半年的增删改查,感觉java除了写增删改查也写不出什么了,现在又要找工作,感觉很迷惑.求解惑!! 解决方案 换个工作吧,增删改查也就是最基础的东西,编程最大的价值在于实现有价值的思想:)跟语言没有关系,用java比较多只是因为java学习和使用相对简单解决方案二:现在Java的需求这么火爆,说明它可以做很多事情,至于你只知道这点,说明你的见识还很短浅.送你一句话:路漫漫而修远,吾将上下而求索.解决方案三: 解决方案四:增删改查是数据库的操