第一步:导入需要的jar包和依赖包然后进行配置
第二步:配置
MyBatis-Config.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:配置(xml的一个根)-->
<configuration>
<!--引入jdbc.propeties文件-->
<properties resource="jdbc.properties" />
<typeAliases>
<package name="cn.itsource.domain"></package>
<package name="cn.itsource.Test"></package>
</typeAliases>
<!--
environments:环境(多个环境)
default="development":多个环境中默认使用的是哪一个环境
-->
<environments default="development">
<!--
environment:某一个环境 id:就是这个环境的名称
-->
<environment id="development">
<!--
transactionManager:事务管理(ACID)
type="JDBC|MANAGED" jdbc:简单jdbc事务 MANAGED:啥都不做
-->
<transactionManager type="JDBC"/>
<!-- 数据源(连接池) POOLED:mybatis内置的连接池 -->
<dataSource type="POOLED">
<!--四大金刚:驱动,地址,用户名,密码-->
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--引入(找到)写SQL的XML-->
<mapper resource="cn/itsource/domain/ProductMapper.xml"/>
</mappers>
</configuration>
因为里面配置信息需要数据源所以我们在配置一个jdbc的配置文件
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql:///test
db.username=root
db.password=123456
最后配置一个写sql的xml
ProductMapper.xml
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.itsource.domain.Product">
<select id="selectOne" parameterType="long" resultType="cn.itsource.domain.Product">
select * from Product where id=#{id}
</select>
</update>
这是查询一条数据的sql
测试代码:
//查询
@Test
public void testName() throws Exception{
SqlSession session = null;
//1 准备配置文件 ok
//2 创建SqlSessionFactory
Reader resourceAsReader = Resources.getResourceAsReader("MyBatis-Config.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsReader);
//3 获取sqlSession做操作
session = build.openSession();
//表示调用那句sql(namespace+.+id)-拷贝,传入参数,接收得到返回值
Product product = session.selectOne("cn.itsource.domain.ProductMapper.selectOne", 1l);
System.err.println(product);
//提交事物-增删改,数据库存储引擎不能是myIsam,它不支持事务
session.commit();
session.close();
}
查询全部:
<select id="selectAll" resultType="cn.itsource.domain.Product">
select * from Product
</select>
测试代码:
//查询全部
@Test
public void testselectAll() throws Exception{
SqlSession session = null;
//1 准备配置文件 ok
//2 创建SqlSessionFactory
Reader resourceAsReader = Resources.getResourceAsReader("MyBatis-Config.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsReader);
//3 获取sqlSession做操作
session = build.openSession();
//表示调用那句sql(namespace+.+id)-拷贝,传入参数,接收得到返回值
List<Product> product = session.selectList("Product.selectAll");
product.forEach(e-> System.err.println(e));
//提交事物-增删改,数据库存储引擎不能是myIsam,它不支持事务
session.commit();
session.close();
}
由于其中有许多重复的代码,为了提高效率我们抽取一下:
package cn.itsource.domain;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.Reader;
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
//创建一个工厂对象
try {
Reader resourceAsReader = Resources.getResourceAsReader("MyBatis-Config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsReader);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
在配置文件中我们可以去一个别名,这样不用每次都写一长串
配置别名有两种方式:
第一种就是单个的配:
第二种就是扫包,不过配置扫包之后要修改ProductMapper.xml中的中的namespace属性
<typeAliases>
<!-- 单个配置:练习 -->
<typeAlias type="cn.itsource.mybatis.a_crud.Dept" alias="Dept" />
<!-- 包的配置:项目,添加了包之后,类名就是别名 -->
<package name="cn.itsource.mybatis.a_crud" />
</typeAliases>
添加:
<insert id="sava" parameterType="cn.itsource.domain.Product" useGeneratedKeys="true"
keyColumn="id" keyProperty="id">
insert into product
(productName,dir_id,salePrice,supplier,brand,cutoff,costPrice)
value (#{productName},#{dir_id},#{salePrice},#{supplier},#{brand},#{cutoff},#{costPrice})
</insert>
测试代码:
//保存
@Test
public void testsave() throws Exception{
SqlSession session = null;
//3 获取sqlSession做操作
session = MybatisUtil.getSession();
//表示调用那句sql(namespace+.+id)-拷贝,传入参数,接收得到返回值
Product product = new Product();
product.setProductName("胡漫");
session.insert("Product.sava",product);
//product.forEach(e-> System.err.println(e));
//提交事物-增删改,数据库存储引擎不能是myIsam,它不支持事务
session.commit();
session.close();
}
添加多条(拼接sql)
<insert id="batchsave" parameterType="list" >
insert into Product
(productName,dir_id,salePrice,supplier,brand,cutoff,costPrice)values
<foreach collection="list" item="e" separator=",">
(#{e.productName},#{e.dir_id},#{e.salePrice},#{e.supplier},#{e.brand},#{e.cutoff},#{e.costPrice})
</foreach>
</insert>
//批量保存
@Test
public void testsaveAll() throws Exception{
SqlSession session = null;
//3 获取sqlSession做操作
session = MybatisUtil.getSession();
//表示调用那句sql(namespace+.+id)-拷贝,传入参数,接收得到返回值
Product product = new Product();
List list =new ArrayList();
for (int i=0;i<10;i++){
product.setProductName(i+"胡漫");
list.add(product);
}
session.insert("Product.batchsave",list);
//product.forEach(e-> System.err.println(e));
//提交事物-增删改,数据库存储引擎不能是myIsam,它不支持事务
session.commit();
session.close();
}
修改
<update id="update" parameterType="cn.itsource.domain.Product" >
update product set
productName=#{productName},
dir_id=#{dir_id},
salePrice=#{salePrice},
supplier=#{supplier},
brand=#{brand},
cutoff=#{cutoff},
costPrice=#{costPrice}
where id=#{id}
</update>
测试代码:
//修改
@Test
public void testupdate() throws Exception{
SqlSession session = null;
//3 获取sqlSession做操作
session = MybatisUtil.getSession();
//表示调用那句sql(namespace+.+id)-拷贝,传入参数,接收得到返回值
Product product = new Product();
product.setProductName("余杭");
product.setId(2l);
session.update("Product.batchupdate",product);
//product.forEach(e-> System.err.println(e));
//提交事物-增删改,数据库存储引擎不能是myIsam,它不支持事务
session.commit();
session.close();
}
修改时会有一个问题就是你没有修改的字段会因为上面发出的sql而修改为空,所以我们需要判断一下有哪些需要修改的字段,哪些不需要修改,把他们区分出来。
<update id="batchupdate" parameterType="cn.itsource.domain.Product">
update product
<set>
<if test="productName!=null and productName!=''">
productName=#{productName},
</if>
<if test="dir_id!=null ">
dir_id=#{dir_id},
</if>
<if test="salePrice!=null ">
salePrice=#{salePrice},
</if>
<if test="supplier!=null ">
supplier=#{supplier},
</if>
<if test="brand!=null ">
brand=#{brand},
</if>
<if test="cutoff!=null ">
cutoff=#{cutoff},
</if>
<if test="cutoff!=null ">
costPrice=#{costPrice}
</if>
</set>
where id=#{id}
</update>
删除:
<delete id="delete" parameterType="cn.itsource.domain.Product">
delete from Product where id=#{id}
</delete>
测试代码:
//删除
@Test
public void testdelete() throws Exception{
SqlSession session = null;
//3 获取sqlSession做操作
session = MybatisUtil.getSession();
//表示调用那句sql(namespace+.+id)-拷贝,传入参数,接收得到返回值
session.delete("Product.delete",22l);
//product.forEach(e-> System.err.println(e));
//提交事物-增删改,数据库存储引擎不能是myIsam,它不支持事务
session.commit();
session.close();
}
批量删除:
<delete id="batchdelete" parameterType="list">
delete from Product where id in
<foreach collection="list" item="item" separator="," open="(" close=")" index="index">
#{item}
</foreach>
</delete>
测试代码:
//删除
@Test
public void testdelete2() throws Exception{
SqlSession session = null;
//3 获取sqlSession做操作
session = MybatisUtil.getSession();
//表示调用那句sql(namespace+.+id)-拷贝,传入参数,接收得到返回值
session.delete("Product.batchdelete",Arrays.asList(30, 31, 32));
//product.forEach(e-> System.err.println(e));
//提交事物-增删改,数据库存储引擎不能是myIsam,它不支持事务
session.commit();
session.close();
}