1.MyBatis入门及简单增删改查

1 MyBatis是什么

  1. 平时我们都用JDBC访问数据库,除了需要自己写SQL之外,还必须操作Connection, Statement, ResultSet 这些其实只是手段的辅助类。 不仅如此,访问不同的表,还会写很多雷同的代码,显得繁琐和枯燥。
  2. 那么用了Mybatis之后,只需要自己提供SQL语句,其他的工作,诸如建立连接,Statement,

JDBC相关异常处理等等都交给Mybatis去做了,那些重复性的工作Mybatis也给做掉了,我们只需要关注在增删改查等操作层面上,而把技术细节都封装在了我们看不见的地方。

  1. 总结起来一句话:MyBatis就是Java的ORM关系映射模型,把数据库里的一条数据映成为Java的一个对象。

    2 MyBatis连接数据库

    2.1 使用MyBatis项目的文件组成

    图片.png

  2. 主配置文件,通常在src目录下的,通常包括数据库的连接信息,映射文件的位置信息。

    1. configuration结点表示MyBatis的配置结点,是MyBatis的最外层配置结点。
    2. environment结点包是数据库配置信息。
    3. dataSource节点表示数据库连接信息。
    4. mapper结点表示映射文件的位置。
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <typeAliases>
  7. <package name="com.huang.test"/>
  8. </typeAliases>
  9. <environments default="development">
  10. <environment id="development">
  11. <transactionManager type="JDBC"/>
  12. <dataSource type="POOLED">
  13. <property name="driver" value="com.mysql.jdbc.Driver"/>
  14. <property name="url" value="jdbc:mysql://localhost:3306/how2java?characterEncoding=UTF-8"/>
  15. <property name="username" value="root"/>
  16. <property name="password" value="HDD740409"/>
  17. </dataSource>
  18. </environment>
  19. </environments>
  20. <mappers>
  21. <mapper resource="com/huang/test/Category.xml"/>
  22. <mapper resource="com/huang/test/Product.xml"/>
  23. </mappers>
  24. </configuration>
  1. 映射文件,在某个包下,由主配置文件指出其所在位置。
  2. 模型文件及其他文件,在某个包下。

    3.2 连接数据库

  3. 比较严谨的连接方式,会有错误异常处理。

  1. package com.huang.test;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import org.apache.ibatis.io.Resources;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8. public class Demo1_Connection {
  9. public static void main(String[] args) {
  10. // TODO Auto-generated method stub
  11. String resource = "mybatis-config.xml";
  12. try {
  13. InputStream inputStream = Resources.getResourceAsStream(resource);
  14. System.out.println("MyBatis主配置文件查找成功");
  15. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  16. SqlSession session;//一个数据库线程会话
  17. try{
  18. session = sqlSessionFactory.openSession();
  19. // 你的应用逻辑代码
  20. Category c= session.selectOne("getCategory",2);
  21. System.out.println(c.getName());
  22. System.out.println("MyBatis与数据库会话创建成功");
  23. }catch(Exception e) {
  24. System.out.println("MyBatis与数据库会话创建失败");
  25. }
  26. } catch (IOException e) {
  27. // TODO Auto-generated catch block
  28. System.out.println("MyBatis主配置文件查找失败");
  29. e.printStackTrace();
  30. }
  31. }
  32. }
  1. 一般的连接方式。
    1. 指定配置文件位置读取配置文件信息,可能会抛出IOException。
    2. 根据配置文件信息创建一个SqlSessionFactory对象。
    3. 打开一个Session,此时不会立即检查连接信息,会在执行第一个sql语句时检查连接。
  1. package com.huang.test;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import org.apache.ibatis.io.Resources;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8. public class Demo_2_4_TestProduct_update {
  9. public static void main(String[] args) throws IOException {
  10. String resource = "mybatis-config.xml";
  11. InputStream inputStream = Resources.getResourceAsStream(resource);
  12. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  13. SqlSession session = sqlSessionFactory.openSession();
  14. //增删改需要commit提交到数据库中
  15. session.commit();
  16. session.close();
  17. }
  18. }

3 简单增删改查

3.1 准备

  1. 主配置文件指明映射文件的位置。
  1. <mappers>
  2. <mapper resource="com/huang/test/Product.xml"/>
  3. </mappers>
  1. 映射文件包括了映射sql语句的模板。

    1. insert、delete、select、update结点分别对应增删查。
    2. id属性用来唯一表示某个sql语句模板。
    3. parameterType属性用来指定传入数据参数的数据类型。

      1. MyBatis的传入参数parameterType类型分两种
        a.
        ⅰ. 基本数据类型:int、string、long、Date;基础的数据类型也可以不用给出.
        b.
        ⅰ. 复杂数据类型:类(JavaBean、Integer等)和Map
      2. 如何获取参数中的值:
        2.1 基本数据类型:#{参数} 获取参数中的值
        2.2 复杂数据类型:#{属性名} ,map中则是#{key}
      3. 使用insert/delete/search/update(id,传入对象)来调用这条sql语句并且传入参数.如果传入对象类型与parameterType给出的类型不同,则传入的对象失效。
    4. resultType属性用来在查询后把查询结果映射为一个模型对象。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.huang.test">
  6. <!-- insertdeleteselectupdate标签分别对应增删查 -->
  7. <!-- id用来唯一表示某个sql语句 -->
  8. <!-- parameterType用来指定传入数据参数的数据类型, -->
  9. <insert id="insertProduct" parameterType="Product" >
  10. insert into product_ ( name,price ) values (#{name},#{price})
  11. </insert>
  12. <delete id="deleteProduct" parameterType="Product" >
  13. delete from product_ where id= #{id}
  14. </delete>
  15. <select id="getProduct" parameterType="int" resultType="Product">
  16. select * from product_ where id= #{id}
  17. </select>
  18. <select id="listProduct" resultType="Product">
  19. select * from product_
  20. </select>
  21. <update id="updateProduct" parameterType="Product" >
  22. update product_ set name=#{name},price=#{price} where id=#{id}
  23. </update>
  24. <!-- 其他查询 -->
  25. <select id="listProductByPrice" parameterType="float" resultType="Product">
  26. select * from product_ where price> #{0}
  27. </select>
  28. </mapper>
  1. 模型文件表示sql语句查询结果对应的对象。
  1. package com.huang.test;
  2. public class Product {
  3. private int id;
  4. private String name;
  5. private float price;
  6. //右键source自动生成的getter和setter
  7. //每个变量的第一个字母get/set+变量的第一个字母大写后的变量名
  8. public int getId() {
  9. return id;
  10. }
  11. public void setId(int id) {
  12. this.id = id;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public float getPrice() {
  21. return price;
  22. }
  23. public void setPrice(float price) {
  24. this.price = price;
  25. }
  26. }
  1. 数据库的预先处理
  1. drop database how2java;
  2. create database how2java;
  3. use how2java;
  4. -- 分类表
  5. CREATE TABLE category_ (
  6. id int(11) NOT NULL AUTO_INCREMENT,
  7. name varchar(32) DEFAULT NULL,
  8. PRIMARY KEY (id)
  9. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  10. -- 产品表
  11. create table product_(
  12. id int NOT NULL AUTO_INCREMENT,
  13. name varchar(30) DEFAULT NULL,
  14. price float DEFAULT 0,
  15. cid int ,
  16. PRIMARY KEY (id)
  17. )AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  18. -- 插入数据
  19. delete from category_;
  20. INSERT INTO category_ VALUES (1,'衣服');
  21. INSERT INTO category_ VALUES (2,'玩具');
  22. delete from product_;
  23. INSERT INTO product_ VALUES (1,'帽子', 30, 1);
  24. INSERT INTO product_ VALUES (2,'鞋子', 20, 1);
  25. INSERT INTO product_ VALUES (3,'袜子', 10, 1);
  26. INSERT INTO product_ VALUES (4,'变形金刚', 50, 2);
  27. INSERT INTO product_ VALUES (5,'赛车', 70, 2);
  28. INSERT INTO product_ VALUES (6,'芭比娃娃', 100.5, 2);

3.2 增

  1. 映射文件中的结点
  1. <insert id="insertProduct" parameterType="Product" >
  2. insert into product_ ( name,price ) values (#{name},#{price})
  3. </insert>
  1. Java代码
  1. //insert方法插入
  2. Product p=new Product();
  3. p.setName("新的Product");
  4. p.setPrice((float) 100.5);
  5. session.insert("insertProduct",p);
  6. //增删改需要commit提交到数据库中
  7. session.commit();

3.3 删

  1. 映射文件中的结点
  1. <delete id="deleteProduct" parameterType="Product" >
  2. delete from product_ where id= #{id}
  3. </delete>
  1. Java代码
  1. //delete方法插入
  2. Product p=new Product();
  3. p.setId(2);
  4. session.delete("deleteProduct",p);
  5. //增删改需要commit提交到数据库中
  6. session.commit();

3.4 查

  1. 映射文件中的结点
  1. <select id="getProduct" parameterType="int" resultType="Product">
  2. select * from product_ where id= #{id}
  3. </select>
  4. <select id="listProduct" resultType="Product">
  5. select * from product_
  6. </select>
  1. Java代码
  1. /selectOne获取单个查询结果,获得结果集的第一个结果
  2. Product p= session.selectOne("getProduct",1);
  3. System.out.println(p.getName()+" "+p.getPrice());
  4. System.out.println("------------------------");
  5. //selectList获取所有查询
  6. List<Product> ps = session.selectList("listProduct");
  7. for(Product p1:ps) {
  8. System.out.println(p1.getName()+" "+p1.getPrice());
  9. }

3.5 改

  1. 映射文件中的结点
  1. <update id="updateProduct" parameterType="Product" >
  2. update product_ set name=#{name},price=#{price} where id=#{id}
  3. </update>
  1. Java代码
  1. //update方法更新
  2. Product p=new Product();
  3. p.setId(1);
  4. p.setName("新的编号为1的Product");
  5. p.setPrice((float)10.5);
  6. session.update("updateProduct",p);
  7. //增删改需要commit提交到数据库中
  8. session.commit();

4 原理图

1.MyBatis入门及简单增删改查 - 图2

5 总结

5.1 基本文件结构

  1. 主配置文件mybatis-config.xml.
  2. 映射文件在主配置文件中注册。
  3. 模型文件。
  4. 基本模板
  1. String resource = "mybatis-config.xml";
  2. InputStream inputStream = Resources.getResourceAsStream(resource);
  3. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  4. SqlSession session = sqlSessionFactory.openSession();
  5. //增删改需要commit提交到数据库中
  6. session.commit();
  7. session.close();

5.2 使用映射文件

  1. mapper结点,insert/delete/select/update结点。
  2. id属性,parameterType属性,resultType属性。
  3. 使用增删改查insert/delete/select/update(id,指定类型的参数)