Mybatis
介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
作用
Mybatis 可以帮你整合service的数据
执行流程
环境搭建
如果使用jar包
1.导入
2.创建mybatis-conf.xml(SSM形式,是springBoot则可以忽略)
<?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>
<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/day01?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--指向mapper配置文件-->
<mapper resource="com/ujiuye/mapper/PersonMapper.xml"></mapper>
</mappers>
</configuration>
3.创建dao接口
public interface PersonDao {
/**添加
* @param p
* @return
*/
int add(PersonBean p);
/**根据主键删除
* @param pid
* @return
*/
int del(int pid);
/**修改
* @param p
* @return
*/
int update(PersonBean p);
/**查询所有
* @return
*/
List<PersonBean> getAll();
}
4.书写dao接口的mapper文件
代码置于resource文件夹下,可单独创建一个文件夹放置
在Mapper文件中 开头的mapper标签中的nameSpace指向该Mapper文件对应的DAO接口文件的路径
<?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.ujiuye.dao.PersonDao">
<!--添加 id对应的dao中的方法名,parameterType对应的是参数类型-->
<insert id="add" parameterType="com.ujiuye.bean.PersonBean">
insert person (pname,address) values(#{pname},#{address})
</insert>
<!--删除-->
<delete id="del" parameterType="int">
delete from person where pid=#{0}
</delete>
<!--修改-->
<update id="update" parameterType="com.ujiuye.bean.PersonBean">
update person set pname = #{pname} ,address=#{address} where pid=#{pid}
</update>
<select id="getAll" resultType="com.ujiuye.bean.PersonBean">
select * from person;
</select>
</mapper>
5.测试
@Test
public void test1() throws IOException {
//读取mybatis的配置文件
InputStream is=Resources.getResourceAsStream("mybatis-conf.xml");
//创建SqlSessionFactory
SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(is);
//创建sqlsession
SqlSession session=ssf.openSession();
//获取接口实例
PersonDao mapper = session.getMapper(PersonDao.class);
PersonBean p=new PersonBean(0,"李留","中州");
//添加
//int i=mapper.add(p);
//删除
//int i=mapper.del(3);
//修改
// int i=mapper.update(new PersonBean(4,"zhangsan","驻马店"));
// System.out.println("影响了"+i);
//查询
List<PersonBean> list = mapper.getAll();
System.out.print(list);
session.commit();//。需要手动提交修改数据库
session.close();
}
多个参数传递问题
1.如果传递的是对象
int add(PersonBean p);
Mapper中
<!--修改-->
<update id="update" parameterType="com.ujiuye.bean.PersonBean">
update person set pname = #{pname} ,address=#{address} where pid=#{pid}
</update>
2.使用map传参
List<PersonBean> getByCondition1(Map map);
Mapper
<select id="getByCondition1" parameterType="java.util.Map" resultType="com.ujiuye.bean.PersonBean">
select * from person where pname=#{name} and address=#{address}
</select>
3.根据方法中参数列表的索引值
List<PersonBean> getByCondition2(String name,String address);
Mapper
<select id="getByCondition2" resultType="com.ujiuye.bean.PersonBean">
select *from person where pname=#{0} and address=#{1}
</select>
4.给参数起别名
List<PersonBean> getByCondition3(@Param("pn") String name, @Param("ad") String address);
Mapper
<select id="getByCondition3" resultType="com.ujiuye.bean.PersonBean">
select *from person where pname=#{pn} and address=#{ad}
</select>
Mybatis返回主键
<insert id="add" parameterType="person">
/*插入数据获取自动增长的主键
keyProperty 对象的字段名
keyColumn 表中的字段名
resultType 返回值类型
order 插入之后获取主键
*/
<selectKey keyProperty="id" keyColumn="pid" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert person (pname,address) values(#{pname},#{address})
</insert>
Sql片段
在mapper中可能sql中有一些重复的片段,将公共的sql片段独立出来,直接调用
<sql id="se">
select *from person <!--公共片段-->
</sql>
用法
<include refid=”se”/>
自定义的结果类型
resultMap
当实体类与表中的列名不对应,需要自定义一个结果类型
typeAliases别名
放在mybatis配置文件的第一位
注意:只能有一个 标签
<!--给类名起别名-->
<typeAliases>
<typeAlias type="com.ujiuye.bean.PersonBean" alias="person"/>
<typeAlias type="com.ujiuye.bean.PeopleBean" alias="people"/>
</typeAliases>
在mapper中直接使用别名
${}和#{}的区别
$ sql语句的字符串拼接,不取参数的值 拼接sql
造成sql注入攻击
#直接去参数的值 prepareStatement 避免sql注入攻击
总结
Mybatis的环境搭建
1.导包
2.Mybatis-conf.xml整体的环境配置
Mysql
读取的mapper文件
别名的使用
3.测试
1>读取配置文件
2>SqlsessionFactory
3>获取sqlsession
4>Session.getMapper(**Dao.class)
5>执行接口方法
参数传递
1.如果方法中只有一个参数#{任意的字符串}或者#{0}
2.多个参数
#{参数列表的索引}
传对象
#{对象属性名}
传map
#{map中的key}
别名@Param(“参数别名”)
返回主键
Sql片段
表中的字段名和对象的属性名不一致
ResultMap
对象别名
#, $