概述
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
使用
资源
- 下载地址:https://github.com/mybatis/mybatis-3
- 中文学习文档:http://www.mybatis.org/mybatis-3/zh/index.html
这里的mybatis-3.5.1.jar是mybatis的核心jar包。lib下是依赖jar包。pdf是官方提供的文档。
用法
这里通过对t_user数据库查询为例
实体类User.java
public class User {
private String uid;
private String uname;
private int uage;
private String usex;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getUage() {
return uage;
}
public void setUage(int uage) {
this.uage = uage;
}
public String getUsex() {
return usex;
}
public void setUsex(String usex) {
this.usex = usex;
}
@Override
public String toString() {
return "User{" +
"uid='" + uid + '\'' +
", uname='" + uname + '\'' +
", uage=" + uage +
", usex='" + usex + '\'' +
'}';
}
}
配置文件
- 全局配置文件: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 default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库连接的四大参数-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/sql_test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--实体类对应的数据库xml文件-->
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
- 实体类对应的xml文件:User.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="cn.edu.stu">
<!--
id:findUserById sql语句对应的标识id.
parameterType: 参数类型
resultType:sql语句执行后返回值类型
-->
<select id="findUserById" parameterType="String" resultType="cn.edu.stu.po.User">
select * from t_User where uid = #{value}
</select>
<select id="findUserByName" parameterType="String" resultType="cn.edu.stu.po.User">
select * from t_User where uname like '%${value}%'
</select>
<insert id="insertUser" parameterType="cn.edu.stu.po.User">
<!--mysql主键不自增:通过调用MySQL自带的uuid()函数,自动生成一个uuid,并在插入之前生成,然后存入到uid中
mysql主键自增:使用select LAST_INSERT_ID()在插入语句后查询自增主键值。
<selectKey keyProperty="uid" order="AFTER" resultType="java.lang.String">
select LAST_INSERT_ID()
</selectKey>
-->
<selectKey keyProperty="uid" order="BEFORE" resultType="java.lang.String">
select uuid()
</selectKey>
insert into t_user values (#{uid},#{uname},#{uage},#{usex})
</insert>
<delete id="deleteUserById" parameterType="java.lang.String">
delete from t_user where uid=#{uid}
</delete>
<update id="updateUserById" parameterType="cn.edu.stu.po.User">
update t_user set uname=#{uname},uage=#{uage},usex=#{usex} where uid=#{uid}
</update>
</mapper>
实体类映射数据库操作的文件,包含增,删,改,查。
-
#{}:占位符。如果是简单类型(例如:int,String 等)可以使用value或任意字符作为变量名;如果是实体类类型,可以通过OGNL读取对象中的属性值:通过属性.属性.属性等
对于图片上的例子,String和int类型,可以直接#{value}或#{uid等};如果是一个User对象:要使用对象zhangsan的uname属性:#{zhangsan.uname} -
${}: 表示一个sql拼接符号,例如上面xml中使用的 ‘%&{value}%’ 在模糊查询中有所应用。如果接收的是简单类型,变量名只能是value;如果接受的是对象类型,一样可以使用属性.属性方式。
核心类或接口
- SqlSessionFactory(接口):Sql会话工厂,用来产生session对象
- SqlSessionFactoryBuilder(类):调用自身的build()方法得到工厂
- SqlSession(接口):调用自身的方法,对数据库进行操作
测试代码
@Test
public void findUserById() throws IOException {
//得到mybatis全局配置文件
String resource="mybatis-config.xml";
//得到配置文件流
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
//创建工厂
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(resourceAsStream);
//得到session
SqlSession sqlSession = factory.openSession();
/**
* 调用session的查询方法
* 参数1:User映射xml中命名空间名+sql语句id
*/
User user = sqlSession.selectOne("cn.edu.stu.findUserById", "2019041701");
System.out.println(user);
//释放回话
sqlSession.close();
}
Mybatis中dao开发
原始dao开发
需要实现dao接口和dao实现类
用户管理接口:UserDao.java
public interface UserDao {
//根据用户id查询用户
public User findUserById(String uid) throws Exception;
//根据用户id删除用户
public void deleteUserById(String uid) throws Exception;
//插入用户
public void insertUser(User user) throws Exception;
//根据用户id更新
public void updateUserById(User user) throws Exception;
}
用户管理实现类:UserDaoImpl.java
/**
* 因为sqlsession是线程不安全的,需要在每个方法中单独创建使用
*/
public class UserDaoImpl implements UserDao{
private SqlSessionFactory factory;
//通过构造函数,注入工厂实例
public UserDaoImpl(SqlSessionFactory factory){
this.factory=factory;
}
@Override
public User findUserById(String uid) throws Exception {
//得到session对象
SqlSession session=factory.openSession();
//单行查询
User user=session.selectOne("cn.edu.stu.findUserById",uid);
//释放session
session.close();
return user;
}
@Override
public void deleteUserById(String uid) throws Exception {
//得到session对象
SqlSession session=factory.openSession();
//删除
session.delete("cn.edu.stu.deleteUserById",uid);
//提交
session.commit();
//释放session
session.close();
}
@Override
public void insertUser(User user) throws Exception {
//得到session对象
SqlSession session=factory.openSession();
//删除
session.insert("cn.edu.stu.insertUser",user);
//提交
session.commit();
//释放session
session.close();
}
@Override
public void updateUserById(User user) throws Exception {
//得到session对象
SqlSession session=factory.openSession();
//删除
session.update("cn.edu.stu.updateUserById",user);
//提交
session.commit();
//释放session
session.close();
}
}
方法测试
@Test
public void DAOTest() throws Exception {
//得到mybatis全局配置文件
String resource="mybatis-config.xml";
//得到配置文件流
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
//创建工厂
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(resourceAsStream);
UserDao dao=new UserDaoImpl(factory);
User user =dao.findUserById("2019041703");
System.out.println(user);
}
mapper代理方式
使用mapper代理,我们只需要写mapper接口(例如dao接口)。但是需要满足一些规范
- mapper映射xml(对应原始dao开发中的User.xml)的命名空间namespace需要等于mapper接口类路径
<mapper namespace="cn.edu.stu.mapper.UserMapper">
- mapper接口中的方法名和mapper映射xml中sql语句的id一致
- mapper接口中的方法的参数和返回值需要和mapper映射xml中参数和返回值对应一致
具体实现
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="cn.edu.stu.mapper.UserMapper">
<select id="findUserById" parameterType="String" resultType="cn.edu.stu.po.User">
select * from t_User where uid = #{value}
</select>
<insert id="insertUser" parameterType="cn.edu.stu.po.User">
/*通过调用MySQL自带的uuid()函数,自动生成一个uuid,并在插入之前生成,然后存入到uid中*/
<selectKey keyProperty="uid" order="BEFORE" resultType="java.lang.String">
select uuid()
</selectKey>
insert into t_user values (#{uid},#{uname},#{uage},#{usex})
</insert>
<delete id="deleteUserById" parameterType="java.lang.String">
delete from t_user where uid=#{uid}
</delete>
<update id="updateUserById" parameterType="cn.edu.stu.po.User">
update t_user set uname=#{uname},uage=#{uage},usex=#{usex} where uid=#{uid}
</update>
</mapper>
在全局配置文件中添加UserMapper.xml的引用
<mappers>
<mapper resource="sqlmap/User.xml"/>
<!--添加-->
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
mapper接口UserMapper.java
public interface UserMapper {
//根据用户id查询用户
public User findUserById(String uid) throws Exception;
//根据用户id删除用户
public void deleteUserById(String uid) throws Exception;
//插入用户
public void insertUser(User user) throws Exception;
//根据用户id更新
public void updateUserById(User user) throws Exception;
}
测试
@Test
public void MapperTest() throws Exception {
//得到mybatis全局配置文件
String resource="mybatis-config.xml";
//得到配置文件流
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
//创建工厂
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session
SqlSession session=factory.openSession();
//通过session得到mapper接口中的类
UserMapper mapper = session.getMapper(UserMapper.class);
//调用mapper中的方法
User user = mapper.findUserById("2019041705");
System.out.println(user);
}