1 Mybatis开发基本流程
(1)配置SqlMapConfig.xml,设置数据连接信息等
(2)编写数据库表对应的实体类
(3)编写映射文件mapper.xml,这里主要是SQL语句
(4)创建SqlSessionFactory对象
(5)获取SqlSession对象,进行增删改查操作
(6)提交事务,关闭SqlSession
2 Mybatis开发准备环境
创建一个名为mybatis的maven项目,通过pom引入相关jar包
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
</dependencies>
在mybatis数据库中创建tb_user表
CREATE TABLE `tb_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`name` varchar(10) NOT NULL COMMENT '用户姓名',
`birthday` date DEFAULT NULL COMMENT '生日',
`gender` char(1) DEFAULT NULL COMMENT '性别,F-男,M-女',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
SqlMapConfig.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>
<!-- 和Spring整合后environment配置都会被干掉 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理,目前由mybatis来管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池,目前由mybatis来管理 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 原始DAO开发方式的映射文件 -->
<mapper resource="dao/userMapper.xml" />
<!-- 原始Mapper代理开发方式的映射文件 -->
<mapper resource="mapper/userMapper.xml" />
</mappers>
</configuration>
编写tb_user对应的实体类UserModel
package lzgsea.mybatis.model;
import java.util.Date;
public class UserModel {
private Integer id; // 用户id
private String name; // 用户姓名
private Date birthday; // 生日
private String gender; // 性别
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "UserModel [id=" + id + ", name=" + name + ", birthday=" + birthday + ", gender=" + gender + "]";
}
}
3 原始DAO开发方式
编写映射文件userMapper.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="userMapper">
<!-- 添加用户 -->
<insert id="insert" parameterType="lzgsea.mybatis.model.UserModel"
useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into tb_user
(name,birthday,gender) values (#{name},#{birthday},#{gender})
</insert>
<!-- 查询用户 -->
<select id="getUserById" parameterType="int"
resultType="lzgsea.mybatis.model.UserModel">
select * from tb_user where id = #{id}
</select>
<!-- 更新用户 -->
<update id="update" parameterType="lzgsea.mybatis.model.UserModel">
update tb_user set name =
#{name}, birthday =
#{birthday}, gender = #{gender} where id = #{id}
</update>
<!-- 删除用户 -->
<delete id="delete" parameterType="int">
delete from tb_user where id =
#{id}
</delete>
</mapper>
编写UserDao接口以及它的实现类UserDaoImpl
package lzgsea.mybatis.dao;
import lzgsea.mybatis.model.UserModel;
public interface UserDao {
void insert(UserModel user);
UserModel getUserById(int id);
void update(UserModel user);
void delete(int id);
}
package lzgsea.mybatis.dao.impl;
import java.io.IOException;
import java.io.InputStream;
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 lzgsea.mybatis.dao.UserDao;
import lzgsea.mybatis.model.UserModel;
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl() {
try {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public void insert(UserModel user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.insert("userMapper.insert", user);
sqlSession.commit();
sqlSession.close();
}
public UserModel getUserById(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserModel user = sqlSession.selectOne("userMapper.getUserById", id);
sqlSession.close();
return user;
}
public void update(UserModel user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.update("userMapper.update", user);
sqlSession.commit();
sqlSession.close();
}
public void delete(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("userMapper.delete", id);
sqlSession.commit();
sqlSession.close();
}
}
测试:
public static void main(String[] args) throws IOException {
UserDao userDao = new UserDaoImpl();
UserModel user = new UserModel();
user.setName("lzgsea");
user.setGender("F");
user.setBirthday(new Date());
userDao.insert(user);
System.out.println(userDao.getUserById(user.getId()));
}
4 Mapper代理开发方式
编写userMapper.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="lzgsea.mybatis.mapper.UserMapper">
<!-- 添加用户 -->
<insert id="insert" parameterType="lzgsea.mybatis.model.UserModel"
useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into tb_user
(name,birthday,gender) values (#{name},#{birthday},#{gender})
</insert>
<!-- 查询用户 -->
<select id="getUserById" parameterType="int"
resultType="lzgsea.mybatis.model.UserModel">
select * from tb_user where id = #{id}
</select>
<!-- 更新用户 -->
<update id="update" parameterType="lzgsea.mybatis.model.UserModel">
update tb_user set name =
#{name}, birthday =
#{birthday}, gender = #{gender} where id = #{id}
</update>
<!-- 删除用户 -->
<delete id="delete" parameterType="int">
delete from tb_user where id =
#{id}
</delete>
</mapper>
编写UserMapper接口
package lzgsea.mybatis.mapper;
import lzgsea.mybatis.model.UserModel;
public interface UserMapper {
void insert(UserModel user);
UserModel getUserById(int id);
void update(UserModel user);
void delete(int id);
}
测试:
public static void main(String[] args) throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserModel user = new UserModel();
user.setName("lzgsea");
user.setGender("F");
user.setBirthday(new Date());
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.insert(user);
System.out.println(userMapper.getUserById(user.getId()));
sqlSession.commit();
sqlSession.close();
}
总结:
Mapper代理开发方式,映射文件userMapper.xml的namespace属性的值为UserMapper接口的全路径
Mapper代理开发方式,UserMapper接口通过sqlSession.getMapper(Class<T> type)方法获取实例化对象