前言
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",两个的属性值必须一致
--><environmentsdefault="development"><environmentid="development"><transactionManagertype="JDBC"/><dataSourcetype="POOLED"><propertyname="driver"value="com.mysql.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://192.168.137.212:3306/chunfeng_test?useUnicode=true&characterEncoding=UTF-8"/><propertyname="username"value="root"/><propertyname="password"value="root"/></dataSource></environment></environments><!-- 在配置文件中 关联包下的 接口类--><mappers><mapperclass="com.fall.mybatistest.mapper.MainMapper"/></mappers></configuration>
3. 建立实体类
在domain包下新建一个实体类People.java
package com.fall.mybatistest.domain;publicclassPeople{privateint id;private String name;}
用eclipse自动填充getter(),setter(),hashcode(),equals(),toString()方法。
4. 建立映射类
在mapper包下新建映射接口类MainMapper(即conf.xml中指向的映射类)。
package com.fall.mybatistest.mapper;publicinterfaceMainMapper{}
当需要映射语句时,在这里新建函数并配置注解,比如建立一个根据id查找的函数:
MyBatis会自动将查找结果转化成实体类。
publicinterfaceMainMapper{@Select("SELECT * FROM people WHERE id=#{id}")public PeopleselectById(int id);}
注意注解的sql语句使用#{<name>}
来接收参数。
当参数不止一个时,要在函数参数前加@Param("<name>")
来标识参数名。
5. 建立utils类
在utils包下建立MyBatisUtils类,这个类只会创建一次factory。
package com.fall.mybatistest.utils;publicclassMyBatisUtils{static SqlSessionFactory factory;publicstatic SqlSessiongetSession(){if(factory==null){
String resource="conf.xml";
InputStream is= MyBatisUtils.class.getClassLoader().getResourceAsStream(resource);
factory=newSqlSessionFactoryBuilder().build(is);}return factory.openSession();}}
6. 测试
建立测试类Test.java
package com.fall.mybatistest;publicclassTest{publicstaticvoidmain(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:
publicinterfaceMainMapper{@Select("SELECT * FROM people")public ArrayList<People>selectAll();@Select("SELECT * FROM people WHERE id=#{id}")public PeopleselectById(int id);@Update("UPDATE people SET name=#{name} WHERE id=#{id}")publicbooleanupdateNameById(@Param("id")int id,@Param("name") String name);@Insert("INSERT INTO people(name) VALUES (#{name})")publicbooleaninsertByName(String name);@Delete("DELETE FROM people WHERE id=#{id}")publicbooleandeleteById(int id);}
修改Test.java如下:
publicclassTest{publicstaticvoidmain(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");}staticvoidtestInsert(){try(SqlSession session= MyBatisUtils.getSession()){
MainMapper mapper= session.getMapper(MainMapper.class);boolean success= mapper.insertByName("qq");
System.out.println(success);
session.commit();}}staticvoidtestSelect(){try(SqlSession session= MyBatisUtils.getSession()){
MainMapper mapper= session.getMapper(MainMapper.class);
People people= mapper.selectById(2);
System.out.println(people);
session.commit();}}staticvoidtestSelectAll(){try(SqlSession session= MyBatisUtils.getSession()){
MainMapper mapper= session.getMapper(MainMapper.class);
List<People> list= mapper.selectAll();
System.out.println(list);
session.commit();}}staticvoidtestUpdate(){try(SqlSession session= MyBatisUtils.getSession()){
MainMapper mapper= session.getMapper(MainMapper.class);boolean success= mapper.updateNameById(2,"cutes");
System.out.println(success);
session.commit();}}staticvoidtestDelete(){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还有其它的使用方式将在后续更新。
参考资料