目录
Mybatis介绍
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录.
Mybatis的优势
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
-
提供xml标签,支持编写动态sql。
Mybatis入门案例
-
创建一个maven Java工程
-
引入相关依赖
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.12.1</version> </dependency>
-
创建数据表
CREATE TABLE person( id INT NOT NULL AUTO_INCREMENT, NAME VARCHAR(30), gender VARCHAR(6), age INT, birthday DATE, PRIMARY KEY(id) );
-
创建实体类(省略get set方法)
-
创建核心配置文件
<!--在resources目录创建一个mybatis的核心配置文件,改配置文件可以是任意的名字。SqlMapConfig.xml mybatis-cfg.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> <!--development或者worker--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///803mbatis01"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> </configuration>
-
创建一个映射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="cn.offcn.PersonMapper"> <!-- id属性是一个唯一标识,类拟于方法名,parameterType 表示输入参数类型--> <!-- #{}表示mybatis中的占位符,如果传递参数为对象,#{}中必须填写对象中属性名 --> <insert id="addPerson" parameterType="cn.offcn.entity.Person"> insert into person(name,gender,age,birthday) values(#{name},#{gender},#{age},#{birthday}) </insert> </mapper>
-
把映射文件注册在mybatis核心配置文件中
<mappers> <mapper resource="cn/offcn/entity/PersonMapper.xml"></mapper> </mappers>
-
添加资源插件
<!--如何让mapper映射文件放到src/main/java包下,这时maven不会把该包下的任何配置文件加入到classpath中,如果想让资源文件部署到classpath中,需要加入资源插件--> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build>
-
创建SqlSessionFactory对象
public static void main(String[] args) throws Exception{ //1. 创建mybatis核心配置文件的输入流对象 InputStream inputStream=Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 创建SqlSessionFactory对象 相当于jdbc中DriverManager SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); }
-
完成CRUD
<?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="cn.offcn.PersonMapper"> <!-- id属性是一个唯一标识,类拟于方法名,parameterType 表示输入参数类型--> <!-- #{}表示mybatis中的占位符,如何传递参数为对象,#{}中必须填写对象中属性名 --> <insert id="addPerson" parameterType="cn.offcn.entity.Person"> insert into person(name,gender,age,birthday) values(#{name},#{gender},#{age},#{birthday}) </insert> <delete id="deletePerson" parameterType="int"> delete from person where id=#{id} </delete> <update id="updatePerson" parameterType="cn.offcn.entity.Person"> update person set name=#{name},gender=#{gender},age=#{age},birthday=#{birthday} where id=#{id} </update> <select id="getPersonById" parameterType="int" resultType="cn.offcn.entity.Person"> select * from person where id=#{id} </select> <select id="getPersons" resultType="cn.offcn.entity.Person"> select * from person </select> </mapper>
public class PersonTest { public static void addPerosn()throws Exception{ //1. 创建mybatis核心配置文件的输入流对象 InputStream inputStream=Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 创建SqlSessionFactory对象 相当于jdbc中DriverManager SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //3.获取SqlSession对象 相当于jdbc中Connection SqlSession session=sqlSessionFactory.openSession(); //4. 调用sqlSession中的insert方法 String statement="cn.offcn.PersonMapper.addPerson"; Person person=new Person("李四","女",23,new Date()); session.insert(statement,person); //5. 提交事务 session.commit(); //6.关闭session对象 session.close(); } public static void getPersonById(int id)throws Exception{ //1. 创建mybatis核心配置文件的输入流对象 InputStream inputStream=Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 创建SqlSessionFactory对象 相当于jdbc中DriverManager SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //3.获取SqlSession对象 相当于jdbc中Connection SqlSession session=sqlSessionFactory.openSession(); //4. 调用sqlSession中的insert方法 String statement="cn.offcn.PersonMapper.getPersonById"; Person person=session.selectOne(statement,id); System.out.println(person); //5. 提交事务 session.commit(); //6.关闭session对象 session.close(); } public static void getPersons()throws Exception{ //1. 创建mybatis核心配置文件的输入流对象 InputStream inputStream=Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 创建SqlSessionFactory对象 相当于jdbc中DriverManager SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //3.获取SqlSession对象 相当于jdbc中Connection SqlSession session=sqlSessionFactory.openSession(); //4. 调用sqlSession中的insert方法 String statement="cn.offcn.PersonMapper.getPersons"; List<Person> personList= session.selectList(statement); for (Person person : personList) { System.out.println(person); } //5. 提交事务 session.commit(); //6.关闭session对象 session.close(); } public static void updatePerson(int id)throws Exception{ //1. 创建mybatis核心配置文件的输入流对象 InputStream inputStream=Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 创建SqlSessionFactory对象 相当于jdbc中DriverManager SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //3.获取SqlSession对象 相当于jdbc中Connection SqlSession session=sqlSessionFactory.openSession(); //4. 调用sqlSession中的insert方法 String statement="cn.offcn.PersonMapper.getPersonById"; Person person=session.selectOne(statement,id); person.setName("王五"); person.setAge(30); statement="cn.offcn.PersonMapper.updatePerson"; session.update(statement,person); //5. 提交事务 session.commit(); //6.关闭session对象 session.close(); } public static void deletePerson(int id)throws Exception{ //1. 创建mybatis核心配置文件的输入流对象 InputStream inputStream=Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 创建SqlSessionFactory对象 相当于jdbc中DriverManager SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //3.获取SqlSession对象 相当于jdbc中Connection SqlSession session=sqlSessionFactory.openSession(); //4. 调用sqlSession中的insert方法 String statement="cn.offcn.PersonMapper.deletePerson"; session.delete(statement,id); //5. 提交事务 session.commit(); //6.关闭session对象 session.close(); } public static void main(String[] args) throws Exception{ deletePerson(1); } }