2017.12.20 MyBatis

来源:互联网 发布:视频转换格式软件 编辑:程序博客网 时间:2024/06/15 10:40

一、MyBatis
1.解决问题(需要完成的配置):
1)实体映射(字段与属性的映射)
通过domain下的属性类(@Data注解和lombok的依赖、插件)和resources下的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.test.server.repository.mapper.UserMapper"><resultMap id="BaseResultMap" type="com.test.server.domain.City">    <id column="id" jdbcType="INTEGER" property="id"/>    <result column="province_id" jdbcType="INTEGER" property="provinceId"/>    <result column="city_name" jdbcType="VARCHAR" property="cityName"/>    <result column="description" jdbcType="VARCHAR" property="description"/></resultMap><sql id="Base_Column_List">    id, province_id,city_name,description</sql><select id = "getAll" resultMap="BaseResultMap">    SELECT    <include refid="Base_Column_List" />    FROM city</select></mapper>

要注意 XML 头部的声明,用来验证 XML 文档正确性。

2)SQL绑定(将SQL语句绑定到接口上)
repository.mapper下的mapper作为接口(@Repository),并通过Repository类来调用(@Repository)

3)执行环境(运行时的环境)
①数据源交给spring
在resouces下的.properties文件中配置

#mybatis.config-location=mybatis.xmlmybatis.mapperLocations=classpath:mapper/*.xmlspring.datasource.driverClassName=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxx?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC&allowMultiQueries=truespring.datasource.username=xxxxspring.datasource.password=xxxx

数据库、账号、密码

②其他配置
mybatis.xml完成其他配置

2.SqlSession和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="org.mybatis.example.BlogMapper">  <select id="selectBlog" resultType="Blog">select * from Blog where id = #{id}  </select></mapper>

在命名空间“org.mybatis.example.BlogMapper”中定义了一个名为“selectBlog”的映射语句,这样它就允许你使用指定的完全限定名“org.mybatis.example.BlogMapper.selectBlog”来调用映射语句,就像上面的例子中做的那样:

Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);

进一步可以完成如下使用:

BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog = mapper.selectBlog(101);

结合spring boot将repository下的mapper用注解@Repository注册为Bean,然后在使用时用@Autowired注入,直接调用实例。
因此在使用的时候可以直接:

@Autowiredprivate CityMapper cityMapper;List<City> cityList = cityMapper.getAll();

3.所以,在搭建时,resources下的文件:
①.properties文件把数据源交给spring处理。

②mapper.xml中完成映射
命名空间(namespace)就是之后的Repository下的Mapper接口

<mapper namespace="com.test.server.repository.mapper.UserMapper">

resultMap和domain下的属性类完成映射
sql的id和Repository下的Mapper接口的方法完成映射

③可以创建mybatis.xml完成一起其他的配置。

项目中需要一个属性的类和一个接口的类。

4.SqlSessionFactory
可以自己设置SqlSessionFactory,SqlSessionFactory产生SqlSession完成数据会话。

@Bean(name = "sqlSessionFactory")public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {    SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();    factoryBean.setDataSource(dataSource);    factoryBean.setConfigLocation(new ClassPathResource(MYBATIS_CONFIG_PATH));    factoryBean.setTypeAliasesPackage(DOMAIN_PATH);    factoryBean.setMapperLocations(getResources(MAPPER_PATHS));    return factoryBean.getObject();}

5.使用
①基本操作

<select id="selectPerson" parameterType="int" resultType="hashmap">  SELECT * FROM PERSON WHERE ID = #{id}</select><insert id="insertAuthor">  insert into Author (id,username,password,email,bio)  values (#{id},#{username},#{password},#{email},#{bio})</insert><update id="updateAuthor">  update Author set    username = #{username},    password = #{password},    email = #{email},    bio = #{bio}  where id = #{id}</update><delete id="deleteAuthor">  delete from Author where id = #{id}</delete>

插入时用foreach可以完成多条插入
②sql标签
这个元素可以被用来定义可重用的 SQL 代码段,可以包含在其他语句中。它可以被静态地(在加载参数) 参数化. 不同的属性值通过包含的实例变化. 比如:

<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>

这个 SQL 片段可以被包含在其他语句中,例如:

<select id="selectUsers" resultType="map">  select    <include refid="userColumns"><property name="alias" value="t1"/></include>,    <include refid="userColumns"><property name="alias" value="t2"/></include>  from some_table t1    cross join some_table t2</select>

用include、refid = “”、/include插入

6.动态sql
①if

<if test="title != null">    AND title like #{title}</if>

②where、set标签
只有在where /where之间有条件 where才会有,不然会存在如下问题:

<select id="findActiveBlogLike"     resultType="Blog">  SELECT * FROM BLOG   WHERE   <if test="state != null">    state = #{state}  </if>   <if test="title != null">    AND title like #{title}  </if>  <if test="author != null and author.name != null">    AND author_name like #{author.name}  </if></select>SELECT * FROM BLOGWHERE

set标签同理

③trim

<trim prefix="WHERE" prefixOverrides="AND |OR ">  ... </trim>

前缀加入WHERE并覆盖AND或OR
http://www.mybatis.org/mybatis-3/zh/getting-started.html

原创粉丝点击