前言
MyBatis
MyBatis 是一款优秀的持久层框架,可以很方便的在java中实现对数据库的操作。
MyBatis 可以将sql语句映射为java接口函数,直接对实体进行操作。
MyBatis 的映射类(Mapper)在映射sql语句时有两种方式,一种是xml映射,功能强大;另一种是java注解,书写简便。
本文将通过示例来简单展示基于注解的MyBatis使用方法。
原理简介
MyBatis首先获得一个SqlSessionFactory对象,再由其产生若干个SqlSession对象。每个SqlSession对象所产生的Mapper对象都可以用来执行函数。
注意SqlSessionFactory对象应当只在程序运行过程中产生一次,可以考虑使用单例模式。SqlSession每次使用完成后需要关闭来释放数据库资源,可以使用try-with-resource.
项目下载地址
项目示例
0. 建立项目
建立一个maven项目,在eclipse的包浏览器中呈现如下结构:(文末有项目示例的下载链接)
1. 建立数据库
在test数据库中建立了people表,主键id为int型且自动增加,还有一个类型为varchar(255)的name字段。
随意插入几条数据。
1. 安装MyBatis:
在/pom.xml中添加如下依赖,刷新项目。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
2.配置MyBatis:
在/src/main/resources下新建conf.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:开发模式
work:工作模式
default="development",id="development",两个的属性值必须一致
-->
<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://192.168.137.212:3306/chunfeng_test?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 在配置文件中 关联包下的 接口类-->
<mappers>
<mapper class="com.fall.mybatistest.mapper.MainMapper"/>
</mappers>
</configuration>
3. 建立实体类
在domain包下新建一个实体类People.java
package com.fall.mybatistest.domain;
public class People {
private int id;
private String name;
}
用eclipse自动填充getter(),setter(),hashcode(),equals(),toString()方法。
4. 建立映射类
在mapper包下新建映射接口类MainMapper(即conf.xml中指向的映射类)。
package com.fall.mybatistest.mapper;
public interface MainMapper {
}
当需要映射语句时,在这里新建函数并配置注解,比如建立一个根据id查找的函数:
MyBatis会自动将查找结果转化成实体类。
public interface MainMapper {
@Select("SELECT * FROM people WHERE id=#{id}")
public People selectById(int id);
}
注意注解的sql语句使用#{<name>}
来接收参数。
当参数不止一个时,要在函数参数前加@Param("<name>")
来标识参数名。
5. 建立utils类
在utils包下建立MyBatisUtils类,这个类只会创建一次factory。
package com.fall.mybatistest.utils;
public class MyBatisUtils
{
static SqlSessionFactory factory;
public static SqlSession getSession()
{
if(factory==null)
{
String resource="conf.xml";
InputStream is = MyBatisUtils.class.getClassLoader().getResourceAsStream(resource);
factory = new SqlSessionFactoryBuilder().build(is);
}
return factory.openSession();
}
}
6. 测试
建立测试类Test.java
package com.fall.mybatistest;
public class Test
{
public static void main(String[] args) throws IOException
{
try(SqlSession session = MyBatisUtils.getSession())
{
MainMapper mapper = session.getMapper(MainMapper.class);
People people = mapper.selectById(2);
System.out.println(people);
}
}
}
结果如下:
People [id=2, name=cutes];
7. 其它测试
进行增/删/改/查/查全部 五个测试:
首先修改MainMapper:
public interface MainMapper {
@Select("SELECT * FROM people")
public ArrayList<People> selectAll();
@Select("SELECT * FROM people WHERE id=#{id}")
public People selectById(int id);
@Update("UPDATE people SET name=#{name} WHERE id=#{id}")
public boolean updateNameById(@Param("id") int id, @Param("name") String name);
@Insert("INSERT INTO people(name) VALUES (#{name})")
public boolean insertByName(String name);
@Delete("DELETE FROM people WHERE id=#{id}")
public boolean deleteById(int id);
}
修改Test.java如下:
public class Test
{
public static void main(String[] args) throws IOException
{
System.out.println("--- insert ---");
testInsert();
System.out.println("--- select ---");
testSelect();
System.out.println("--- select all ---");
testSelectAll();
System.out.println("--- update ---");
testUpdate();
System.out.println("--- delete ---");
testDelete();
System.out.println("done");
}
static void testInsert()
{
try(SqlSession session = MyBatisUtils.getSession())
{
MainMapper mapper = session.getMapper(MainMapper.class);
boolean success = mapper.insertByName("qq");
System.out.println(success);
session.commit();
}
}
static void testSelect()
{
try(SqlSession session = MyBatisUtils.getSession())
{
MainMapper mapper = session.getMapper(MainMapper.class);
People people = mapper.selectById(2);
System.out.println(people);
session.commit();
}
}
static void testSelectAll()
{
try(SqlSession session = MyBatisUtils.getSession())
{
MainMapper mapper = session.getMapper(MainMapper.class);
List<People> list = mapper.selectAll();
System.out.println(list);
session.commit();
}
}
static void testUpdate()
{
try(SqlSession session = MyBatisUtils.getSession())
{
MainMapper mapper = session.getMapper(MainMapper.class);
boolean success = mapper.updateNameById(2,"cutes");
System.out.println(success);
session.commit();
}
}
static void testDelete()
{
try(SqlSession session = MyBatisUtils.getSession())
{
MainMapper mapper = session.getMapper(MainMapper.class);
boolean success = mapper.deleteById(3);
System.out.println(success);
session.commit();
}
}
}
结果如下:
最后的delete出现false是因为之前已经将那条记录删除,所以删除失败。
注意:update,select,delete操作在执行完成后需要进行session.commit()才能使得操作生效。
总结
本文简要介绍了MyBatis基于注解的使用方式,MyBatis还有其它的使用方式将在后续更新。
参考资料