Mybatis 概述
1.MyBatis 本是 apache(tomcat) 的一个开源项目 iBatis,实质上 Mybatis 是对 ibatis 进行一些了改进。
2.MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。
3.Mybatis是一个orm框架(Object relation Mapping),持久层技术,支持动态sql调用,存储过程调用(数据库编程 for if in out),sql和java代码显示分离。(高内聚 低耦合)提高程序的扩展性和维护性。
Mybatis 环境搭建
1.引入当前框架的主体结构(***.jar)
1.mybatis.jar: mybatis 的核心包
2.mysql.jar: 驱动包
3.mydatis相关的依赖包
2: 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>
<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/1028db?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="com/ujiuye/mybatis/mapper/PersonMapper.xml"/>
</mappers>
</configuration>
3.日志log4j.properties
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
4.配置mapper.xml
public interface PersonMapper {
int save(Person person);
int update(Person person);
int remove(int id);
}
5.定义一个和接口名称相同的配置文件***Mapper.xml
<?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.mybatis.mapper.PersonMapper">
<!--执行单元 parameterType:参数类型 resultType="int":返回值类型 -->
<insert id="save" parameterType="com.ujiuye.mybatis.pojo.Person">
INSERT INTO `person`(`id`, `name`, `bir`, `address`)
VALUES (#{id},#{name},#{bir},#{address});
</insert>
</mapper>
mybatis的执行流程
@Test
public void selectAll(){
try {
//定义配置文件路径
String fileName = "mybatis-config.xml";
//通过配置文件创建输入流对象
InputStream inputStream = Resources.getResourceAsStream(fileName);
//读取配置文件 实例化工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//获取Session 对象
SqlSession session = factory.openSession();
//通过反射获取接口对象
StudentMapper mapper = session.getMapper(StudentMapper.class);
//调用接口的方法
List<Student> list = mapper.selectAll();
//进行遍历
for (Student s:list){
System.out.println(s);
}
session.close();
} catch (IOException e) {
e.printStackTrace();
}
}
多个参数传递的问题
1: @Param (“名称”) 就是在我们sql语句中使用的变量名(推荐)
#{名称}
2: 使用map集合的传参
#{key}
3: 使用参数的下标
#{arg0}:下标从0开始
#{param1} 下标从1开始
//@Param(“名称”) 就是在我们sql语句中使用的变量名
int saveByParam(@Param("id") int id, @Param("name") String name,@Param("bir") Date bir, @Param("address") String address);
//使用map集合的传参 key-value 执行单元#{key名称}
int saveByMap(Map<String,Object> map);
//使用参数的下标
int saveByIndex(int id,String name,Date bir,String address);
<!-- 通过参数下标 @Param(“名称”)属性不需要设置 #{名称} 推荐-->
<insert id="saveByParam" parameterType="com.ujiuye.mybatis.pojo.Person">
INSERT INTO `person`(`id`, `name`, `bir`, `address`)
VALUES (#{id},#{name},#{bir},#{address});
</insert>
<!-- #{key名称} -->
<insert id="saveByMap" parameterType="java.util.Map">
INSERT INTO `person`(`id`, `name`, `bir`, `address`)
VALUES (#{id},#{name},#{bir},#{address});
</insert>
<insert id="saveByIndex" parameterType="java.util.Map">
INSERT INTO `person`(`id`, `name`, `bir`, `address`)
VALUES (#{param1},#{param2},#{param3},#{param4});
</insert>
主键值
keyProperty: 类中的主键字段匹配的属性
keyColumn: 表中的那个字段是主键字段
order: BEFORE(先获取主键然后再插入数据) AFTER(先插入数据,在获取主键)
resultType: 主键的类型是什么
<insert id="save" parameterType="com.ujiuye.mybatis.pojo.Person">
<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">
select LAST_INSERT_ID();
</selectKey>
INSERT INTO `person`(`id`, `name`, `bir`, `address`)
VALUES (#{id},#{name},#{bir},#{address});
</insert>
查询操作
//单个对象查询
Person getById(int id);
//查集合
List<Person> list();
//查数值
int count();
<!-- resultType 指的是返回值类型
要求:实体中的属性名要与表的中字段名要一致
确保返回的结果<=1条-->
<select id="getById" resultType="com.ujiuye.mybatis.pojo.Person" parameterType="int">
SELECT * FROM `person` WHERE `id`=#{id}
</select>
<select id="list" resultType="com.ujiuye.mybatis.pojo.Person" >
SELECT * FROM `person`
</select>
<select id="count" resultType="int" >
SELECT COUNT(*) FROM `person`
</select>
增删改操作
//新增学员信息
int save(Student student);
//通过id删除学员信息
int deleteById(int id);
//通过id修改学员信息
int updateById(Student student);
<!-- 新增学员信息 -->
<insert id="save" parameterType="com.ujiuye.mybatis.pojo.Student">
insert into student(id,name,sex,age,address,tel,email)
values (#{id},#{name},#{sex},#{age},#{address},#{tel},#{email});
</insert>
<!-- 通过id删除学员信息 -->
<delete id="deleteById" parameterType="com.ujiuye.mybatis.pojo.Student">
delete from student where id = #{id};
</delete>
<!-- 通过id修改学员信息 -->
<update id="updateById" parameterType="com.ujiuye.mybatis.pojo.Student">
update student set name=#{name},sex=#{sex},age=#{age},address=#{address},tel=#{tel},email=#{email} where id = #{id};
</update>
Sql片段
针对在mybatis配置文件中重复书写的sql内容,我们可以采用sql片段封装的方式完成,如果在其他的sql中使用,我们只需导入这个公共sql段
Sql片段格式
<sql id="select_user_where">
<if test="userExt != null">
<if test="userExt.sex != null and userExt.sex != ''">
AND sex = #{userExt.sex}
</if>
<if test="userExt.username != null and userExt.username != ''">
AND username LIKE '%${userExt.username}%'
</if>
</if>
</sql>
Sql段的使用
<select id="findUserList" parameterType="person" resultType="person">
SELECT * FROM person
<where>
<include refid="select_user_where"/>
</where>
</select>
自定义ResultMap(映射)
resultMap属性
Type: 当前的bean对象类型(数据模型的类型)
Id: 新的类型的标记 标识
resultMap子标签
标签:主键标签,配置的主键的映射关系
resultMap: 普通字段的映射关系
<resultMap type="com.ujiuye.bean.Person" id="newPerson">
<!-- 主键字段的配置 -->
<id property="id" column="id"></id>
<!-- 普通字段的配置 -->
<result property="names" column="name"></result>
<result property="bir" column="bir"/>
</resultMap>