SSM框架–MyBatis
MyBatis简介
MyBatis是一个优秀的基于java的持久层框架,它内部封装了JDBC,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
MyBatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。
最后MyBatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc api底层访问细节,使我们不用与JDBC Api打交道,就可以完成对数据库的持久化操作。
MyBatis入门
可以在https://mvnrepository.com/官网寻找相应的配置文件。
1.导入MyBatis相关坐标
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
2.数据库中建立相应的数据表,并编写一个表中字段对应的(Brand)实体类
3.编写BrandMapper映射文件
<?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="mapper.BrandMapper">
//Mapper代理开发:
//定义与SQL映射文件同名的Mapper接口,
//并且将Mapper接口和SQL映射文件放置在同一目录下
//设置SQL映射文件的namespace属性为Mapper接口全限定名
//在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
<select id="selAll" resultType="sqlTest.Brand">
select * from mybatis;
</select>
</mapper>
4.编写封装查询结果对象的接口
public interface BrandMapper {
public List<Brand> selAll();
}
5.编写Mybatis核心配置文件
<?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="sqlTest"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/brand"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/userMapper.xml"/>
<mapper resource="mapper/BrandMapper.xml"/>
</mappers>
</configuration>
6.编写测试类,通过MyBatis实现查询功能
public class MybatisDemo {
public static void main(String[] args) throws IOException {
//加载mybatis的核心配置文件,获取sqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//获取sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlSession对象,来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取BrandMapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
List<Brand> brands =brandMapper.selAll();
System.out.println(brands);
//释放资源
sqlSession.close();
}
}
MyBatis映射文件
MyBatis架构:
输入映射(sql入参):parameterType
- 基础数据类型,包括string,long,double,int,boolean,float等
- pojo
- map
- 包装的pojo,即封装的VO类里包含POJO类
输出映射(输出的结果数据类型): resultType(自动配置列和属性的映射)
- 基础数据类型
- pojo
- list,注意的是规范规定在映射文件xxxMapper.xml中写:resultType=“pojo”;在java类中:List。list可以查询多条数据并返回
- map
输出映射(输出的结果数据类型): resultMap(手动配置列和属性的映射)
- 正式开发用的比较多;
- 当列和属性相同时可省略,但为了看起来方便,我们还是留着吧
<resultMap type="user" id="userResult"> <!--user是pojo的别名-->
<!--<id property="id" column="id" />--> <!--列名与属性相同可省略,但不省略为好-->
<result property="username" column="user_name"/>
<result property="sex" column="gender"/>
<!--<result property="birthday" column="birthday"/> --> <!--列名与属性相同可省略,但不省略为好-->
<!--<result property="address" column="address"/> --> <!--列名与属性相同可省略,但不省略为好-->
</resultMap>
注意:resultType和resultMap不能同时出现。
MyBatis的增删改查
添加操作
编写Mapper接口,写出添加的方法:
void add(Brand brand);
配置SQL映射文件:
<mapper>
<insert id="add" >
insert into mybatis(bracd_name,company_name,ordered,description,status)
values (#{bracdName},#{companyName},#{ordered},#{description},#{status});
</insert>
</mapper>
执行方法:
SqlSession sqlSession = sqlSessionFactory.openSession();
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
brandMapper.add(brand);
修改操作
编写Mapper接口,写出修改的方法:
void update(Brand brand);
编写映射文件:
<update id="update" parameterType="sqlTest.Brand">
update mybatis set bracd_name=#{bracdName},company_name=#{companyName},ordered=#{ordered},description=#{description},status=#{status}
</update>
执行方法:
SqlSession sqlSession = sqlSessionFactory.openSession();
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
int count= brandMapper.update(brand);
删除操作
编写Mapper接口,写出删除方法:
void deleteid(Brand brand);
编写映射文件:
<delete id="deleteid" parameterType="brand">
delete from mybatis where id=#{id}
</delete>
执行方法:
SqlSession sqlSession = sqlSessionFactory.openSession();
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
int count= brandMapper.deleteid(id);
MyBatis注解开发
1、查询
@Select("select * from mybatis where id = #{id}")
List<brand> selAll();
2、添加
@Insert("insert into mybatis values(#{brandName},#{companyName})")
void add(Brand brand);
3、修改
@Update("update mybatis set brand_name=#{brandName},comapany_name=#{companyName}")
int update(Brand brand)
4、删除
@Delete("delete from mybatis where id = #{id}")
void deleteById(@Param("ids") int[] ids)