增删改查对应Mapper配置文件里的标签。
select、update、delete、insert
1.封装MyBatisUtils工具类
public class MybatisUtils {
public static final SqlSessionFactory sessionFactory;
static {
//1.sqlSessionFactoryBuilder 加载配置文件
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//2.读取配置文件
InputStream resourceAsStream = null;
try {
resourceAsStream = Resources.getResourceAsStream("SqlMappingConfig.xml");
} catch (IOException e) {
e.printStackTrace();
}
//3.获取session工厂
sessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
}
public static SqlSession openSession(){
return sessionFactory.openSession();
}
}
2.编写Mapper文件
<?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="myTest">
<!--根据cust_id查询客户-->
<select id="queryCustomerById" parameterType="Int"
resultType="com.hbuas.sw.entity.Customer">
SELECT * FROM `customer` WHERE cust_id = #{cust_id}
</select>
<!--查询所有-->
<select id="queryAllCustomer" resultType="com.hbuas.sw.entity.Customer">
SELECT * FROM `customer`
</select>
<!--根据用户名模糊查询客户-->
<select id="querytCustomerByName" parameterType="String" resultType="com.hbuas.sw.entity.Customer.Customer">
select * from customer where cust_name like #{name};
</select>
<!--添加-->
<insert id="insertCustom" parameterType="com.hbuas.sw.entity.Customer.Customer">
/*获取插入的最后一个id*/
<selectKey keyColumn="cust_id" keyProperty="cust_id" resultType="Integer" order="AFTER">
select last_insert_id()
</selectKey>
insert into `customer`(cust_name,cust_profession,cust_phone,email)
values (#{cust_name},#{cust_profession},#{cust_phone},#{email})
</insert>
<!--更新-->
<update id="updateCustomer" parameterType="com.hbuas.sw.entity.Customer.Customer">
update `customer` set cust_name=#{cust_name} where cust_id=#{cust_id}
</update>
<!--删除操作-->
<delete id="deleteCustomer" parameterType="com.hbuas.sw.entity.Customer.Customer">
delete from `customer` where cust_id=#{cust_id}
</delete>
</mapper>
3.测试
//增
public void insert(){
SqlSession sqlSession = MybatisUtils.openSession();
Customer customer = new Customer();
customer.setCust_name("司马懿");
customer.setCust_phone("18912344331");
sqlSession.insert("insertCustom",customer);
//当要改动数据库当中的记录时,执行sql时要自己提交事务
//手动提交事务
sqlSession.commit();
System.out.println(customer);
sqlSession.close();
}
//删
public void delete(){
SqlSession sqlSession = MybatisUtils.openSession();
//删除之前要先看看有没有这条数据
Customer customer = sqlSession.selectOne("queryCustomerById", 12);
sqlSession.delete("deleteCustomer",customer);
sqlSession.commit();
sqlSession.close();
}
//改
public void update(){
SqlSession sqlSession = MybatisUtils.openSession();
Customer customer = sqlSession.selectOne("queryCustomerById", 12);
customer.setCust_name("曹操");
sqlSession.update("updateCustomer",customer);
sqlSession.commit();
sqlSession.close();
}
//查(模糊查询)
public void test3(){
SqlSession sqlSession = MybatisUtils.openSession();
List<Customer> customers = sqlSession.selectList("querytCustomerByName", "%李%");
for (Customer customer : customers) {
System.out.println(customer);
}
sqlSession.close();
}
名词解释
parameterType:指定输入参数类型,mybatis从输入对象中获取参数值拼接在sql中
resultType: 指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为
#{}和${}
#{}
- 表示一个占位符号,通过#{}可以实现向占位符中设置值
- 自动进行java类型和jdbc类型转换
- #{}可以有效防止sql注入
- #{}可以接收简单类型值或pojo属性值
- 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称
${}
- 表示拼接sql串
- 通过${}可以将parameterType传入的内容拼接在sql中,不进行jdbc类型转换
- ${}可以接收简单类型值或pojo属性值
- 如果parameterType传输单个简单类型值,${}括号中只能是“value”
/* #{}
mapper: select * from customer where cust_name like '%#{name}%';
解析后: select * from customer where cust_name like '%?%';
表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值
***********************************************************************
${}
mapper: select * from customer where cust_name like '%${value}%';
解析后: select * from customer where cust_name like '%李%';
表示拼接sql串
* */
=====================分割线==========================
原始的Dao方式进行CRUD已经结束,下面接触一个新的概念Mapper动态代理
我们要新建一个DAO包;然后新建一个接口文件:
1.要求
- namespace必须和DAO接口类路径一致
- id必须和DAO接口方法名一致
- parameterType必须和接口方法参数类型一致
- resultType必须和接口方法返回值类型一致
所以 我们新建一个CustomerMapping.java的接口文件
/*
mapper接口编写规则:
1.namespace必须和Mapper接口类路径一致
2.id必须和Mapper接口方法名一致
3.parameterType必须和接口方法参数类型一致
4.resultType必须和接口方法返回值类型一致
**/
public interface CustomerMapper {
/*
* 根据cust_id查询客户
* */
public Customer queryCustomerById(Integer id);
/*
* 查询所有
* */
public List<Customer>queryAllCustomer();
/*
* 根据用户名模糊查询客户
* */
public List<Customer>querytCustomerByName(String name);
/*
* 添加
* */
public void insertCustom(Customer customer);
/*
* 更新
* */
public void updateCustomer(Customer customer);
/*
* 删除
* */
public void deleteCustomer(Customer customer);
}
修改我们的mapper配置文件的namespace
<?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.hbuas.sw.mapper.CustomerMapper">
......
</mapper>
匹配的过程:(约定的过程)
1.根据 接口名 找到 mapper.xml文件(根据的是namespace=接口全类名)
2.根据 接口的方法名 找到 mapper.xml文件中的SQL标签 (方法名=SQL标签Id值)
以上2点可以保证: 当我们调用接口中的方法时,
程序能自动定位到 某一个Mapper.xml文件中的sqL标签
Test.java
SqlSession sqlSession = MybatisUtils.openSession();
CustomerMapper mapper = sqlSession.getMapper(CustomerMapper.class);
Customer customer = mapper.getCustomerWithID(2,"李白");
System.out.println(customer);
sqlSession.close();
通过session对象获取接口,再调用该接口中的方法,程序会自动执行该方法对应的SQL。