MyBatis-接口开发-User例子

定位sql需要很长的字符串,namespace+id的使用方式很容易出错,因为是string类型的,编译时没发检查,写错运行时才会抛出异常。所以,mybatis提供了一种非常好的设计方式来避免这种问题,即Mapper接口。namespace的值统一为接口的全路径。
接口开发步骤:[]里是你自己需要的名字
1.修改映射文件[User]Mapper.xml
映射文件中的namspace的值是接口的包名+接口的类名
dao.[User]MapperDao(绑定Mapper文件和接口的关系)
(Dao层就是和数据库交互的)
2.创建[User]Mapper接口(interface)
2.1接口所在包的包名+接口名=[User]Mapper.xml中namespace的值
(绑定接口和映射文件的关系)
2.2接口中的方法名=[User]Mapper.xml中定义SQL的id值
(绑定了将要执行的SQL的id)
2.3接口中的方法的返回值类型和参数类型要和UserMapper.xml
映射文件中resultType的类型一致
3.在核心配置文件sqlMapConfig.xml的中引入


获取接口实现类对象,getMapper方法能基于类全名找到对应名称空间,然后基于名称空间找到映射文件,最后基于你的方法在映射文件找到与元素id相同的方法。

UserMapperDao dao = session.getMapper(UserMapperDao.class);

1、在mysql中执行下面的sql

CREATE DATABASE mybatisdb;
USE mybatisdb;
CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(100),addr VARCHAR(100),age INT);
INSERT INTO USER VALUES(NULL,'张三','北京',28);
INSERT INTO USER VALUES(NULL,'李四','上海',30);
INSERT INTO USER VALUES(NULL,'王五','广州',19);

2、创建maven工程

MyBatis-接口开发-User例子_第1张图片

MyBatis-接口开发-User例子_第2张图片

MyBatis-接口开发-User例子_第3张图片

pom.xml输入如下内容,保存更新项目


    4.0.0
    com.company
    mybatisv2
    0.0.1-SNAPSHOT
    
        UTF-8
    
    
        
        
            mysql
            mysql-connector-java
            5.1.40
        
        
            junit
            junit
            4.11
        
        
            org.mybatis
            mybatis
            3.2.8
        
        
        
            log4j
            log4j
            1.2.17
        
    
    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.5.1
                
                    1.8
                    1.8
                    UTF-8
                
            
        
    

3像下面的方式创建对应的文件,在对应的文件添加代码


MyBatis-接口开发-User例子_第4张图片

UserMapperDao接口

/usermapper/src/main/java/dao/UserMapperDao.java

注意:
1、 包名 + 类名 = UserMapper.xml中namespace的值
2、 接口中方法名 = UserMapper.xml中定义的SQL的id值
3、 方法的返回值类型(resultType)和参数类型(parameterType或sql中的参数(parameterType可以不传))要和UserMapper.xml映射文件中类型一致

package dao;

import java.util.List;

import pojo.User;

/**
 * 这个类用来完成用户表的业务
 * 
 * @author Administrator
 *
 */
public interface UserMapperDao {
    // 
    // 查询所有表的所有数据
    public List findAll();

    // 
    public int count();

    // 
    public User findOne(int id);

    // 
    // insert into user values(null,#{name},#{addr},#{age})
    // 
    public void save(User user);

    // 
    // update user  age=#{age} name=#{name}
    // 
    public void updateUser(User user);

    // 
    // delete from user where name=#{name}
    // 
    public void deleteUser(User user);
}

User

/usermapper/src/main/java/pojo/User.java

package pojo;
/**
 * 这个类用来和user表做映射关系
 * 要求:属性名必须和表字段名保持一致
 */
public class User {
    //id
    private int id;
    //用户名
    private String name;
    //地址
    private String addr;
    //年龄
    private int age;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", addr=" + addr + ", age=" + age + "]";
    }
    
}

UserMapper

/usermapper/src/main/resources/mapper/UserMapper.xml





    
    
    
    
    
    
    
        insert into user values(null,#{name},#{addr},#{age})
    
    
    
        update user  age=#{age} name=#{name}  
    
    
        delete from user where name = #{name}
    

db.properties

/usermapper/src/main/resources/db.properties

driver:com.mysql.jdbc.Driver
url:jdbc:mysql:///mybatisdb
username:root
password:123456

log4j.properties

/usermapper/src/main/resources/log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

sqlMapConfig.xml

/usermapper/src/main/resources/sqlMapConfig.xml




 
    
    
    
    
        
    
    
    
        
        
            
            
            
            
            
                
                
                
                
                
                
                
            
        
    
     
    
        
        
    
 

InterfaceTest.java

/usermapper/src/test/java/test/InterfaceTest.java

package test;

import java.io.IOException;
import java.io.InputStream;
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 dao.UserMapperDao;
import pojo.User;

/**
 * 这个类用来测试Mapper接口
 * @author Administrator
 *
 */
public class InterfaceTest {
    SqlSessionFactory ssf=null;
    @Before
    public void init(){
        //获取会话工厂
        try {
            InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
            ssf = new SqlSessionFactoryBuilder().build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //查询user表的所有数据
    @Test
    public void findAll(){
        //获取sqlsession,执行SQL
        SqlSession session = ssf.openSession();
        //利用接口方法
        UserMapperDao dao = session.getMapper(UserMapperDao.class);
        List list = dao.findAll();
        //处理结果
        for (User user : list) {
            System.out.println(user);
        }
        //释放资源
        session.close();
    }
    @Test
    public void count() {
        // 2.创建sqlsession对象,执行sql
        SqlSession session = ssf.openSession();
        UserMapperDao dao = session.getMapper(UserMapperDao.class);
        int i = dao.count();
        // 3.处理结果
        System.out.println("count=" + i);
        // 4.释放资源
        session.close();
    }
    
    //根据id查询记录
        @Test
        public void findOne(){
            // 2.创建sqlsession对象,执行sql
            SqlSession session = ssf.openSession();
            UserMapperDao dao = session.getMapper(UserMapperDao.class);
            User user=dao.findOne(1);
            System.out.println(user);
            // 4.释放资源
            session.close();
        }
        //新增一条记录
        @Test
        public void save(){
            //创建sqlsession,执行sql
            SqlSession session = ssf.openSession();
            UserMapperDao dao = session.getMapper(UserMapperDao.class);
            //利用sqlsession执行插入的sql
            User user=new User();
            user.setName("张三");
            user.setAge(28);
            user.setAddr("河北");
            dao.save(user);
            session.commit();
            //释放资源
            session.close();
        }
        //修改指定记录
        @Test
        public void updateUser(){
            //创建sqlsession,执行sql
            SqlSession session = ssf.openSession();
            UserMapperDao dao = session.getMapper(UserMapperDao.class);
            User user=new User();
            user.setAge(9);
            user.setName("张三");
            dao.updateUser(user);
            session.commit();
            //释放资源
            session.close();
        }
        //删除指定记录
        @Test
        public void deleteUser(){
            //创建sqlsession,执行sql
            SqlSession session = ssf.openSession(true);
            UserMapperDao dao = session.getMapper(UserMapperDao.class);
            User user=new User();
            user.setName("张三");
            dao.deleteUser(user);
            session.close();
        }
}

如果在User类中加入输出System.out.println("User.setId()");

    public void setId(int id) {
        System.out.println("User.setId()");
        this.id = id;
    }
DEBUG [main] - ==>  Preparing: select * from user 
DEBUG [main] - ==> Parameters: 
User.setId()
User.setId()
User.setId()
User.setId()
User.setId()
DEBUG [main] - <==      Total: 5
User [id=1, name=张三, addr=北京, age=28]
User [id=2, name=李四, addr=上海, age=6]
User [id=3, name=王五, addr=广州, age=19]
User [id=4, name=张三, addr=河北, age=28]
User [id=5, name=张三, addr=河北, age=28]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4973813a]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4973813a]
DEBUG [main] - Returned connection 1232306490 to pool.

会发现底层会调用类的set方法,不过当set方法不存在是,底层会直接通过反射为私有属性赋值

你可能感兴趣的:(MyBatis-接口开发-User例子)