定位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工程
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
UTF-8
3像下面的方式创建对应的文件,在对应的文件添加代码
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方法不存在是,底层会直接通过反射为私有属性赋值