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 configuration
PUBLIC "-//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 stub
String 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 block
System.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 mapper
PUBLIC "-//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,指定类型的参数)