mybatis的简单使用调用mapper接口

mybatis 是apache下的一个面向sql编程的半自动化的ORM持久层的框架。特点:面向sql编程,达到高性能的使用目的。

下面是简单使用

现导入jar包,只有mybatis和数据库驱动包(这里用的是mysql的驱动包)是必须的,其余是日志需要的包

db.properties配置连接池的配置文件

1 jdbc.driverClassName=com.mysql.jdbc.Driver
2 jdbc.url=jdbc:mysql://localhost:3306/mybatis
3 jdbc.username=root
4 jdbc.password=12

创建一个mybatis数据库,执行下面的生sql语句插入数据

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT ‘用户名称‘,
  `birthday` date DEFAULT NULL COMMENT ‘生日‘,
  `sex` char(1) DEFAULT NULL COMMENT ‘性别‘,
  `address` varchar(256) DEFAULT NULL COMMENT ‘地址‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (‘1‘, ‘王五‘, null, ‘2‘, null);
INSERT INTO `user` VALUES (‘10‘, ‘张三‘, ‘2014-07-10‘, ‘1‘, ‘北京市‘);
INSERT INTO `user` VALUES (‘16‘, ‘张小明‘, null, ‘1‘, ‘河南郑州‘);
INSERT INTO `user` VALUES (‘22‘, ‘陈小明‘, null, ‘1‘, ‘河南郑州‘);
INSERT INTO `user` VALUES (‘24‘, ‘张三丰‘, null, ‘1‘, ‘河南郑州‘);
INSERT INTO `user` VALUES (‘25‘, ‘陈小明‘, null, ‘1‘, ‘河南郑州‘);
INSERT INTO `user` VALUES (‘26‘, ‘王五‘, null, null, null);

log4j.properties  日志的配置文件

 1 ### direct log messages to stdout ###
 2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 3 log4j.appender.stdout.Target=System.err
 4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 5 log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
 6
 7 ### direct messages to file mylog.log ###
 8 log4j.appender.file=org.apache.log4j.FileAppender
 9 log4j.appender.file.File=d:/mylog.log
10 log4j.appender.file.layout=org.apache.log4j.PatternLayout
11 log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
12
13 ### set log levels - for more verbose logging change ‘info‘ to ‘debug‘ ###
14
15 log4j.rootLogger=info, stdout

SqlMapConfig.xml  是mybatis全局的配置文件

<?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>
        <properties resource="db.properties">
        </properties>
        <typeAliases>
        <!-- 单个别名定义 ,后面就可用直接写user,不用写全路径名-->
        <!-- <typeAlias type="com.baoyuan.domain.User" alias="user"/> -->
        <!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) -->
        <package name="com.baoyuan.domain"/>
        </typeAliases>
                            <!--名称随意  -->
    <environments default="development">
            <!--id必须和上面的一致  -->
        <environment id="development">
                                <!--固定格式JDBC  -->
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClassName}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>

        <!-- 使用mapper接口类路径 注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中-->
        <!-- <mapper class="com.baoyuan.mapper.dao.UserMapper"/> -->

    <!-- 注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。 -->
    <package name="com.baoyuan.mapper.dao"/>
    </mappers>
</configuration>

创建一个pojo类User类

package com.baoyuan.domain;

import java.util.Date;

public class User {

    private Integer id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
                + address + "]";
    }

}

在src目录下建立一个com.baoyuan.mapper.dao的包

在com.baoyuan.mapper.dao创建一个UserMapper.xml的映射文件

Mapper接口开发需要遵循以下规范:

1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。

2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

<?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.baoyuan.mapper.dao.UserMapper">    <!-- Id表示statement的id唯一标识符,resultType表示结果集的类型,parameterType表示形式参数类型 ,如果SqlMapConfig.xml中配置了别名,就可以直接谢别名user,不用再写全路径com.baoyuan.domain.User -->
    <select id="findUserById" resultType="com.baoyuan.domain.User"  parameterType="int" >                    <!--#{}大括号类随意写只是表示一个占位符,相当于statment中的"?"  -->
        select * from user where id =#{id}
    </select>                    <!--这里返回的类型虽然是list,resultType表示list泛型的类型  -->
    <select id="findUserByUsername" resultType="com.baoyuan.domain.User"  parameterType="java.lang.String" >                              <!--这里必须写value,${value}表示拼接字符串,如果用其他会报错,用#{}只是表示占位符,可以在调用时传"%条件%的参数"  -->
        select * from user where username like ‘%${value}%‘
    </select>
    <insert id="saveUser"  parameterType="com.baoyuan.domain.User" >                                      <!--这里由于 parameterType形式参数的类型是user,所以这里#{}大括号中不能随便写,写的是user的属性 -->
        insert INTO user(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
    </insert>
    <delete id="deleteUserById"  parameterType="int">
        delete from user where id =#{id}
    </delete>
    <update id="updateUserById" parameterType="com.baoyuan.domain.User">
        update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
    </update>
</mapper>

创建UserMapper的接口

package com.baoyuan.mapper.dao;

import java.util.List;

import com.baoyuan.domain.User;
//类名必须和
public interface UserMapper {
    public User findUserById(Integer id);
    public List<User> findUserByUsername(String username);
    public void saveUser(User user);
    public void deleteUserById(Integer id);
    public void updateUserById(User user);
}

测试代码

package com.baoyuan.test;

import java.io.IOException;
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.baoyuan.domain.User;
import com.baoyuan.mapper.dao.UserMapper;

public class TestUserMapper {
    private SqlSessionFactory sqlSessionFactory ;   //表示运行测试代码前执行,给sqlSessionFactory赋值
    @Before
    public void InitialContext() throws IOException{
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        InputStream inputStream=Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = builder.build(inputStream);
        this.sqlSessionFactory=sqlSessionFactory;

    }//通过id查询用户
    @Test
    public void findUserById(){
        //获取sqlsession
        SqlSession sqlSession=null;
        try {
            sqlSession = sqlSessionFactory.openSession();
            //获取mapper接口代理对象
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user = userMapper.findUserById(1);
            System.out.println(user);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(sqlSession!=null){
                sqlSession.close();
            }
        }
    }//通过用户名模糊查询用户
    @Test
    public void findUserByUsername(){
        //获取sqlsession
        SqlSession sqlSession=null;
        try {
            sqlSession = sqlSessionFactory.openSession();
            //获取mapper接口代理对象
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
             List<User> list = userMapper.findUserByUsername("张");
            System.out.println(list);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(sqlSession!=null){
                sqlSession.close();
            }
        }
    }//保存用户
    @Test
    public void saveUser(){
        //获取sqlsession
        SqlSession sqlSession=null;
        try {
            sqlSession = sqlSessionFactory.openSession();
            //获取mapper接口代理对象
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user=new User();
            user.setUsername("李四");
            user.setBirthday(new Date());
            user.setSex("1");
            user.setAddress("深圳");
            userMapper.saveUser(user);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(sqlSession!=null){
                sqlSession.close();
            }
        }
    }//更新用户
    @Test
    public void updateUserById(){
        //获取sqlsession
        SqlSession sqlSession=null;
        try {
            sqlSession = sqlSessionFactory.openSession();
            //获取mapper接口代理对象
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user=new User();
            user.setId(30);
            user.setUsername("李四");
            user.setBirthday(new Date());
            user.setSex("1");
            user.setAddress("深圳");
            userMapper.updateUserById(user);;
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(sqlSession!=null){
                sqlSession.close();
            }
        }
    }//删除用户
    @Test
    public void deleteUserById(){
        //获取sqlsession
        SqlSession sqlSession=null;
        try {
            sqlSession = sqlSessionFactory.openSession();
            //获取mapper接口代理对象
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            userMapper.deleteUserById(30);;
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(sqlSession!=null){
                sqlSession.close();
            }
        }
    }
}
时间: 2024-10-11 13:48:43

mybatis的简单使用调用mapper接口的相关文章

MyBatis 之 使用二 (Mapper接口的使用)

一.在前一篇中,存在一些问题: 1.  没有使用接口编程,Java是面向接口编程语言.应该对数据库操作定义一些接口,调用dao接口完成数据库操作. public interface UserDao { //根据Id查询用户信息 public User findUserById(int userId) throws Exception; //添加用户 public void insertUser(User user) throws Exception; //修改用户 public void upd

Mybatis为什么只有mapper接口没有实现类

做JAVA开发的小伙伴都知道,接口几乎都由实现类实现其功能,使用接口作变量引用实现类作变量实例.然而有部分接口我们在源代码中却找不到其实现类,mybatis的mapper接口便是如此.那么,他们是怎么实现其功能的呢,那就是动态代理. 什么是动态代理这里就不做解释了,不了解的朋友可以参考一下设计模式. mybatis的动态代理过程: 初始化SqlSessionFactory解析mapper.xml的namespace属性的时候,将MapperProxyFactory代理工厂存入mapper缓存中,

mybatis 详解(六)------通过mapper接口加载映射文件

通过 mapper 接口加载映射文件,这对于后面 ssm三大框架 的整合是非常重要的.那么什么是通过 mapper 接口加载映射文件呢? 我们首先看以前的做法,在全局配置文件 mybatis-configuration.xml 通过 <mappers> 标签来加载映射文件,那么如果我们项目足够大,有很多映射文件呢,难道我们每一个映射文件都这样加载吗,这样肯定是不行的,那么我们就需要使用 mapper 接口来加载映射文件 以前的做法: 改进做法:使用 mapper 接口来加载映射文件 1.定义

Mybaits 源码解析 (五)----- 面试源码系列:Mapper接口底层原理(为什么Mapper不用写实现类就能访问到数据库?)

刚开始使用Mybaits的同学有没有这样的疑惑,为什么我们没有编写Mapper的实现类,却能调用Mapper的方法呢?本篇文章我带大家一起来解决这个疑问 上一篇文章我们获取到了DefaultSqlSession,接着我们来看第一篇文章测试用例后面的代码 EmployeeMapper employeeMapper = sqlSession.getMapper(Employee.class); List<Employee> allEmployees = employeeMapper.getAll(

实现mapper接口注入的两种方式,以及后台的使用区别

1.使用模板方式: 1 <!--使用模板类实现mybatis --> 2 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> 3 <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>

使用generatorConfig工具自动生成mybatis的实体类以及dao接口和映射文件

1:数据准备 创建一个数据库表 1 CREATE TABLE `logininfo` ( 2 `id` BIGINT(20) NOT NULL AUTO_INCREMENT, 3 `username` VARCHAR(50) DEFAULT NULL, 4 `password` VARCHAR(200) DEFAULT NULL, 5 `state` TINYINT(4) DEFAULT NULL, 6 PRIMARY KEY (`id`) 7 ) ENGINE=INNODB DEFAULT C

六、通过mapper接口加载映射文件

通过 mapper 接口加载映射文件,这对于后面 ssm三大框架 的整合是非常重要的.那么什么是通过 mapper 接口加载映射文件呢? 我们首先看以前的做法,在全局配置文件 mybatis-configuration.xml 通过 <mappers> 标签来加载映射文件,那么如果我们项目足够大,有很多映射文件呢,难道我们每一个映射文件都这样加载吗,这样肯定是不行的,那么我们就需要使用 mapper 接口来加载映射文件 以前的做法: 改进做法:使用 mapper 接口来加载映射文件 回到顶部

MyBatis 中 Mapper 接口的使用原理

MyBatis 中 Mapper 接口的使用原理 MyBatis 3 推荐使用 Mapper 接口的方式来执行 xml 配置中的 SQL,用起来很方便,也很灵活.在方便之余,想了解一下这是如何实现的,之前也大致知道是通过 JDK 的动态代理做到的,但这次想知道细节. 东西越多就越复杂,所以就以一个简单的仅依赖 MyBatis 3.4.0 的 CRUD 来逐步了解 Mapper 接口的调用. 通常是通过 xml 配置文件来创建SqlSessionFactory对象,然后再获取SqlSession对

mybatis的基本配置:实体类、配置文件、映射文件、工具类 、mapper接口

搭建项目 一:lib(关于框架的jar包和数据库驱动的jar包) 1,第一步:先把mybatis的核心类库放进lib里 2,第二步:导入第三方类库(在lib里).mybatis的核心类库在运行时还依赖一些第三方类库 3,第三步:导入连接数据库驱动jar包 二:创建mybatis的配置文件 1,第一步:先创建实体包,对照着表结构把实体类写出来.封装好就是写get,set方法------不像hibernate,可以自动的将表名字段名与实体类相对应,不用自己手写实体类与映射文件 2,第二步:创建xml