1.MyBatis入门及简单增删改查
1 MyBatis是什么
- 平时我们都用JDBC访问数据库,除了需要自己写SQL之外,还必须操作Connection, Statement, ResultSet 这些其实只是手段的辅助类。 不仅如此,访问不同的表,还会写很多雷同的代码,显得繁琐和枯燥。
- 那么用了Mybatis之后,只需要自己提供SQL语句,其他的工作,诸如建立连接,Statement,
JDBC相关异常处理等等都交给Mybatis去做了,那些重复性的工作Mybatis也给做掉了,我们只需要关注在增删改查等操作层面上,而把技术细节都封装在了我们看不见的地方。
总结起来一句话:MyBatis就是Java的ORM关系映射模型,把数据库里的一条数据映成为Java的一个对象。
2 MyBatis连接数据库
2.1 使用MyBatis项目的文件组成

主配置文件,通常在src目录下的,通常包括数据库的连接信息,映射文件的位置信息。
- configuration结点表示MyBatis的配置结点,是MyBatis的最外层配置结点。
- environment结点包是数据库配置信息。
- dataSource节点表示数据库连接信息。
- mapper结点表示映射文件的位置。
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><typeAliases><package name="com.huang.test"/></typeAliases><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/how2java?characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="HDD740409"/></dataSource></environment></environments><mappers><mapper resource="com/huang/test/Category.xml"/><mapper resource="com/huang/test/Product.xml"/></mappers></configuration>
package com.huang.test;import java.io.IOException;import java.io.InputStream;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class Demo1_Connection {public static void main(String[] args) {// TODO Auto-generated method stubString resource = "mybatis-config.xml";try {InputStream inputStream = Resources.getResourceAsStream(resource);System.out.println("MyBatis主配置文件查找成功");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession session;//一个数据库线程会话try{session = sqlSessionFactory.openSession();// 你的应用逻辑代码Category c= session.selectOne("getCategory",2);System.out.println(c.getName());System.out.println("MyBatis与数据库会话创建成功");}catch(Exception e) {System.out.println("MyBatis与数据库会话创建失败");}} catch (IOException e) {// TODO Auto-generated catch blockSystem.out.println("MyBatis主配置文件查找失败");e.printStackTrace();}}}
- 一般的连接方式。
- 指定配置文件位置读取配置文件信息,可能会抛出IOException。
- 根据配置文件信息创建一个SqlSessionFactory对象。
- 打开一个Session,此时不会立即检查连接信息,会在执行第一个sql语句时检查连接。
package com.huang.test;import java.io.IOException;import java.io.InputStream;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class Demo_2_4_TestProduct_update {public static void main(String[] args) throws IOException {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession session = sqlSessionFactory.openSession();//增删改需要commit提交到数据库中session.commit();session.close();}}
3 简单增删改查
3.1 准备
- 主配置文件指明映射文件的位置。
<mappers><mapper resource="com/huang/test/Product.xml"/></mappers>
映射文件包括了映射sql语句的模板。
- insert、delete、select、update结点分别对应增删查。
- id属性用来唯一表示某个sql语句模板。
parameterType属性用来指定传入数据参数的数据类型。
- MyBatis的传入参数parameterType类型分两种
a.
ⅰ. 基本数据类型:int、string、long、Date;基础的数据类型也可以不用给出.
b.
ⅰ. 复杂数据类型:类(JavaBean、Integer等)和Map - 如何获取参数中的值:
2.1 基本数据类型:#{参数} 获取参数中的值
2.2 复杂数据类型:#{属性名} ,map中则是#{key} - 使用insert/delete/search/update(id,传入对象)来调用这条sql语句并且传入参数.如果传入对象类型与parameterType给出的类型不同,则传入的对象失效。
- MyBatis的传入参数parameterType类型分两种
resultType属性用来在查询后把查询结果映射为一个模型对象。
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.huang.test"><!-- insert、delete、select、update标签分别对应增删查 --><!-- id用来唯一表示某个sql语句 --><!-- parameterType用来指定传入数据参数的数据类型, --><insert id="insertProduct" parameterType="Product" >insert into product_ ( name,price ) values (#{name},#{price})</insert><delete id="deleteProduct" parameterType="Product" >delete from product_ where id= #{id}</delete><select id="getProduct" parameterType="int" resultType="Product">select * from product_ where id= #{id}</select><select id="listProduct" resultType="Product">select * from product_</select><update id="updateProduct" parameterType="Product" >update product_ set name=#{name},price=#{price} where id=#{id}</update><!-- 其他查询 --><select id="listProductByPrice" parameterType="float" resultType="Product">select * from product_ where price> #{0}</select></mapper>
- 模型文件表示sql语句查询结果对应的对象。
package com.huang.test;public class Product {private int id;private String name;private float price;//右键source自动生成的getter和setter//每个变量的第一个字母get/set+变量的第一个字母大写后的变量名public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}}
- 数据库的预先处理
drop database how2java;create database how2java;use how2java;-- 分类表CREATE TABLE category_ (id int(11) NOT NULL AUTO_INCREMENT,name varchar(32) DEFAULT NULL,PRIMARY KEY (id)) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;-- 产品表create table product_(id int NOT NULL AUTO_INCREMENT,name varchar(30) DEFAULT NULL,price float DEFAULT 0,cid int ,PRIMARY KEY (id))AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;-- 插入数据delete from category_;INSERT INTO category_ VALUES (1,'衣服');INSERT INTO category_ VALUES (2,'玩具');delete from product_;INSERT INTO product_ VALUES (1,'帽子', 30, 1);INSERT INTO product_ VALUES (2,'鞋子', 20, 1);INSERT INTO product_ VALUES (3,'袜子', 10, 1);INSERT INTO product_ VALUES (4,'变形金刚', 50, 2);INSERT INTO product_ VALUES (5,'赛车', 70, 2);INSERT INTO product_ VALUES (6,'芭比娃娃', 100.5, 2);
3.2 增
- 映射文件中的结点
<insert id="insertProduct" parameterType="Product" >insert into product_ ( name,price ) values (#{name},#{price})</insert>
- Java代码
//insert方法插入Product p=new Product();p.setName("新的Product");p.setPrice((float) 100.5);session.insert("insertProduct",p);//增删改需要commit提交到数据库中session.commit();
3.3 删
- 映射文件中的结点
<delete id="deleteProduct" parameterType="Product" >delete from product_ where id= #{id}</delete>
- Java代码
//delete方法插入Product p=new Product();p.setId(2);session.delete("deleteProduct",p);//增删改需要commit提交到数据库中session.commit();
3.4 查
- 映射文件中的结点
<select id="getProduct" parameterType="int" resultType="Product">select * from product_ where id= #{id}</select><select id="listProduct" resultType="Product">select * from product_</select>
- Java代码
/selectOne获取单个查询结果,获得结果集的第一个结果Product p= session.selectOne("getProduct",1);System.out.println(p.getName()+" "+p.getPrice());System.out.println("------------------------");//selectList获取所有查询List<Product> ps = session.selectList("listProduct");for(Product p1:ps) {System.out.println(p1.getName()+" "+p1.getPrice());}
3.5 改
- 映射文件中的结点
<update id="updateProduct" parameterType="Product" >update product_ set name=#{name},price=#{price} where id=#{id}</update>
- Java代码
//update方法更新Product p=new Product();p.setId(1);p.setName("新的编号为1的Product");p.setPrice((float)10.5);session.update("updateProduct",p);//增删改需要commit提交到数据库中session.commit();
4 原理图
5 总结
5.1 基本文件结构
- 主配置文件mybatis-config.xml.
- 映射文件在主配置文件中注册。
- 模型文件。
- 基本模板
String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession session = sqlSessionFactory.openSession();//增删改需要commit提交到数据库中session.commit();session.close();
5.2 使用映射文件
- mapper结点,insert/delete/select/update结点。
- id属性,parameterType属性,resultType属性。
- 使用增删改查insert/delete/select/update(id,指定类型的参数)
