1、概述
Mybatis是能定制SQL语句、存储过程以及映射的持久层框架
Mybaits避免了所有的JDBC代码和手动设置参数以及获取结果集的过程
Mybitas使用的是XML和注解用于配置和映射,将接口和java的bean对象 映射成数据库中的记录
2、使用
1、先在Mysql中创建一个数据库和表单,之后回到eclipse中创建java工程,工程中新建bean对象,对象的属性与表单的列名匹配。
drop database if exists mybatis;
create database mybatis;
use mybatis;
##############################################################################
################################### 单表 ######################################
##############################################################################
## 创建单表
create table t_user(
`id` int primary key auto_increment,
`last_name` varchar(50),
`sex` int
);
insert into t_user(`last_name`,`sex`) values('wzg168',1);
select * from t_user;
public class User {
private int id;
private String lastName;
private int sex;
2、创建mybatis-config.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>
<!-- environments 是配置多个jdbc环境
default表示使用的默认环境
-->
<environments default="development">
<!--
environment 标签用来配置一个环境
id 是环境的标识
-->
<environment id="development">
<!--
transactionManager 配置使用什么样类型的数据库事务管理
type="JDBC" 表示启用事务,有commit和rollback操作
type="MANAGED" 表示不直接控制事务。交给容器处理---几乎不用。
-->
<transactionManager type="JDBC" />
<!--
dataSource标签配置连接池
type="POOLED" 表示启用数据库连接池
type="UNPOOLED" 表示不启用数据库连接池
-->
<dataSource type="POOLED">
<!-- 连接数据库的驱动类 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<!-- 数据库访问地址 -->
<property name="url" value="jdbc:mysql:///mybatis" />
<!-- 数据库用户名 -->
<property name="username" value="root" />
<!-- 数据库密码 -->
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 导入mapper配置文件 -->
<mapper resource="com/atguigu/mybatis/bean/UserMapper.xml" />
</mappers>
</configuration>
首先需要注意的是 需要将其创建在src目录下,这样能配置所有的src下的mapper.xml文件
在mybatis-config.xml中 可以配置多个JDBC环境, 每个环境只需要在<enviroments>标签中添加<enviroment>标签并配置属性就行了,通常使用default的默认环境
标签:environment id属性是标识
标签:transactionManager 配置事务
标签:dataSource 配置链接池,在里面直接添加property便签 配置属性和值 驱动类、访问地址、数据库用户名和密码
3、创建XXXMapper.xml配置文件,这个配置文件时mybait的核心组件。
一般的命名规则为 类名Mapper.xml
例如User类,那么对应的是UserMapper.xml;
以下是Mapper.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">
<!--
namespace属性是名称空间的意思。
功能相当于 给配置文件定义一个包名。
一般情况下。可以写两种值,一种是对应类的全类名
一种情况是。对应类的处理接口全类名(后面讲)。
-->
<mapper namespace="com.atguigu.mybatis.bean.User">
<!--
select 标签用于定义一个select查询语句
id属性,又称之为statementId
id属性可以给select语句定义一个唯一的标识
parameterType 属性定义参数的类型,int 表示基本的Integer类型
resultType 属性定义返回值的数据类型
-->
<select id="selectUserById" parameterType="int" resultType="com.atguigu.mybatis.bean.User">
select id, last_name lastName, sex from t_user where id = #{value}
</select>
</mapper>
namespace 名称空间配置一个对应的全类名,或者接口类的全类名,多数情况下使用后者方法
select 标签表示定义了一个select查询语句的标签 里面存放select
id属性是select的唯一标识, parameteType属性是定义参数的类型,resultType属性定义返回值得数据类型
4、编写java程序测试--hello World程序示例
@Test
public void test1() throws IOException {
// 读取mybatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 通过SqlSessionFactoryBuilder创建一个SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 创建一个sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
User user = sqlSession.selectOne("com.atguigu.mybatis.bean.User.selectUserById", 1);
System.out.println(user);
} finally {
sqlSession.close();
}
}
需要注意的是 sqlSession是流,使用完毕时,需要注意关闭
4、传统的mybatis的CRUD实现
创建一个持久层接口
public interface UserDao {
// 保存用户
public int saveUser(User user);
// 更新用户
public int updateUser(User user);
// 根据id删除用户
public int deleteUserById(int id);
// 根据id搜索用户
public User findUserById(int id);
// 搜索全部用户
public List<User> findUsers();
}
在UserMapper.xml中配置
<!-- 插入用户
parameterType 属性设置参数类型
id 为使用的标识
-->
<insert id="saveUser" parameterType="com.atguigu.pojo.User">
insert into t_user(last_name,sex) values(#{lastName},#{sex})
</insert>
<!-- 更新用户
parameterType 属性设置参数类型
id 为使用的标识
-->
<update id="updateUser" parameterType="com.atguigu.pojo.User">
update t_user
set
last_name = #{lastName},
sex = #{sex}
where
id = #{id}
</update>
<!-- 根据id删除用户
parameterType 属性设置参数类型
id 为使用的标识
-->
<delete id="deleteUserById" parameterType="int">
delete from t_user where id = #{id}
</delete>
<!-- 根据id搜索用户
parameterType 属性设置参数类型
id 为使用的标识
resultType 属性是返回的类型
-->
<select id="findUserById" parameterType="int" resultType="com.atguigu.pojo.User">
select id,last_name lastName,sex from t_user where id = #{id}
</select>
<!-- 搜索全部用户
id 为使用的标识
resultType 属性是返回的类型
-->
<select id="findUsers" resultType="com.atguigu.pojo.User">
select id,last_name lastName,sex from t_user
</select>
增删改查方法对应的标签 <insert>、<delete>、<updata>、<select>
之后创建一个类去实现UserDao接口
public class UserDaoImpl implements UserDao {
SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public int saveUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int result = 0;
try {
result = sqlSession.insert("com.atguigu.mybatis.bean.User.saveUser", user);
//提交事务
sqlSession.commit();
} finally {
sqlSession.close();
}
return result;
}
@Override
public int updateUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int result = 0;
try {
result = sqlSession.update("com.atguigu.mybatis.bean.User.updateUser", user);
//提交事务
sqlSession.commit();
} finally {
sqlSession.close();
}
return result;
}
@Override
public int deleteUserById(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int result = 0;
try {
result = sqlSession.update("com.atguigu.mybatis.bean.User.deleteUserById", id);
//提交事务
sqlSession.commit();
} finally {
sqlSession.close();
}
return result;
}
@Override
public User findUserById(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
User result = null;
try {
result = sqlSession.selectOne("com.atguigu.mybatis.bean.User.findUserById", id);
} finally {
sqlSession.close();
}
return result;
}
@Override
public List<User> findUsers() {
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> result = null;
try {
result = sqlSession.selectList("com.atguigu.mybatis.bean.User.findUsers");
} finally {
sqlSession.close();
}
return result;
}
}
编写测试类
package com.atguigu.dao.impl.test;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
import org.junit.Test;
import com.atguigu.dao.UserDao;
import com.atguigu.dao.impl.UserDaoImpl;
import com.atguigu.pojo.User;
public class UserDaoTest {
static UserDao userDao;
/**
* @BeforeClass标注的方法会在所有测试之前执行之前执行一次
* @throws Exception
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
String url = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(url);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
userDao = new UserDaoImpl(sqlSessionFactory);
}
@Test
public void testSaveUser() {
User user = new User(0, "bbbbb", 0);
userDao.saveUser(user);
System.out.println(user);
}
@Test
public void testUpdateUser() {
User user = new User(2, "cccccc", 0);
userDao.updateUser(user);
}
@Test
public void testDeleteUserById() {
userDao.deleteUserById(2);
}
@Test
public void testFindUserById() {
System.out.println( userDao.findUserById(1) );
}
@Test
public void testFindUsers() {
System.out.println( userDao.findUsers() );
}
}
在进行插入操作如果需要返回主键,有一下方法
1、使用 insert 标签中的 userGeneratedKeys属性和keyProperty属性组合使用获取主键信息
<!-- 插入用户
useGeneratedKeys="true"
表示返回生成的主键
keyProperty 表示把返回的key注入到返回值的哪个属性中
keyProperty="id" 表示把返回的id主键值注入到返回对象的id属性中
-->
<insert id="saveUser" useGeneratedKeys="true" keyProperty="id"
parameterType="com.atguigu.pojo.User">
insert into t_user(last_name,sex) values(#{lastName},#{sex})
</insert>
2、使用子元素selectKey标签执行sql语句获取
<!-- 插入用户 -->
<insert id="saveUser" parameterType="com.atguigu.pojo.User">
<!--
selectKey标签主要用于插入数据后,获取生成的主键。
order 表示执行的顺序,AFTER表示在插入之后执行。BEFORE在插入之前执行。
keyProperty属性设置对象的哪个属性接收
resultType属性设置返回值类型。
-->
<selectKey order="AFTER" keyProperty="id" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
insert into t_user(last_name,sex) values(#{lastName},#{sex})
</insert>
两种方法的概念基本一致,后者涉及了在mapper.xml的中的sql语句高级操作,之后会详细描述
5、Mapper接口的方式实现mybatis的CRUD
在使用Mapper接口方式编写之前 , 我们必须注意Mapper接口开发方式的必须遵循四个规范
1、对应的mapper配置文件的namespace属性必须是mapper接口的全类名
2、Mapper接口的方法名必须与mapper配置文件中的id对应
3、Mapper接口的方法的参数类型必须与mapper配置文件的parameterType类型匹配
4、Mapper接口的方法返回值类型必须与mapper配置文件的resultType类型匹配
6、Mapper接口的方法实现方式
编写Mapper接口
package com.atguigu.mapper;
import java.util.List;
import com.atguigu.pojo.User;
public interface UserMapper {
// 保存用户
public int saveUser(User user);
// 更新用户
public int updateUser(User user);
// 根据id删除用户
public int deleteUserById(int id);
// 根据id搜索用户
public User findUserById(int id);
// 搜索全部用户
public List<User> findUsers();
}
这时我们还需要修改mapper 标签的 namespace 属性的值 换成Mapper接口的全类名
<mapper namespace="com.atguigu.mapper.UserMapper">
编写UserMapper的测试
package com.atguigu.mapper;
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 org.junit.BeforeClass;
import org.junit.Test;
import com.atguigu.pojo.User;
public class UserMapperTest {
static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
String url = "mybatis-config.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(url);
// 创建SqlSessionFactory对象
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testSaveUser() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User(0, "ddddd", 1);
userMapper.saveUser(user);
session.commit();
System.out.println(user);
} finally {
session.close();
}
}
@Test
public void testUpdateUser() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User(5, "eeeee", 1);
userMapper.updateUser(user);
session.commit();
} finally {
session.close();
}
}
@Test
public void testDeleteUserById() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
userMapper.deleteUserById(5);
session.commit();
} finally {
session.close();
}
}
@Test
public void testFindUserById() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
System.out.println(userMapper.findUserById(7));
} finally {
session.close();
}
}
@Test
public void testFindUsers() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
System.out.println(userMapper.findUsers());
} finally {
session.close();
}
}
}
7、使用注解的方式(了解使用,不推荐)
注解方式的实例:
public interface UserMapperAnnotation {
@Select("select id,last_name userName ,sex from t_user where id = #{id}")
public User selectUser(int id);
@Select("select * from t_user")
public List<User> selectUserList();
@Update("update t_user set last_name = #{lastName}, sex = #{sex} where id = #{id}")
public int updateUser(User user);
@Delete("delete from t_user where id = #{id}")
public int deleteUserById(int id);
@Insert("insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex})")
@SelectKey(before = false, keyProperty = "id", resultType = Integer.class, statement = { "select last_insert_id()" })
public int insertUser(User user);
}
mybatis-config.xml配置文件的导入
<mappers>
<mapper class="com.atguigu.dao.UserMapperAnnotation"/>
</mappers>