龙空技术网

Mybatis框架

Celinf 294

前言:

而今你们对“联合主键sql”大体比较着重,兄弟们都需要剖析一些“联合主键sql”的相关文章。那么小编在网络上搜集了一些关于“联合主键sql””的相关文章,希望你们能喜欢,朋友们快快来学习一下吧!

什么是框架

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;简而言之:框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。

MyBatis

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。简单说程序员只需要通过注解或配置文件的方式提供需要执行的SQL语句,框架会自动根据SQL语句生成出JDBC代码,从而提高执行效率

Mybatis通过xml注解的方式将要执行的各种statement(statement、preparedStatemnt)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

框架图

MyBatis-作用

跟数据库交互完成增删改查。

MyBatis-优点

MyBatis 是免费且开源的。与 JDBC 相比,减少了 50% 以上的代码量。MyBatis 是最简单的持久化框架,小巧并且简单易学。MyBatis 相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL 写在 XML 中,和程序逻辑代码分离,降低耦合度,便于同一管理和优化,提高了代码的可重用性。提供 XML 标签,支持编写动态 SQL 语句。提供映射标签,支持对象与数据库的 ORM 字段关系映射。支持存储过程。MyBatis 以存储过程的形式封装 SQL,可以将业务逻辑保留在数据库之外,增强应用程序的可移植性、更易于部署和测试。

MyBatis-缺点

编写 SQL 语句工作量较大,对开发人员编写 SQL 语句的功底有一定要求。SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

MyBatis-使用场景

MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案。适用于性能要求高,且需求变化较多的项目,如互联网项目。

如何使用Mybatis框架?

创建工程 , 创建工程时需要勾选3个内容分别是:Web->Spring WebSQL-> Mybatis FrameworkSQL-> MySQL Driver

myBatis依赖

在application.properties配置文件中书写连接数据库的信息spring.datasource.username=rootspring.datasource.password=rootspring.datasource.url=jdbc:mysql://localhost:3306/empdb?characterEncoding=ut

使用Mybatis

第一步:在resources/static/写个html页面

<body><h1>商品标题</h1><div>    <input type="text" v-model="product.title" placeholder="商品标题">    <input type="text" v-model="product.price" placeholder="价格">    <input type="text" v-model="product.saleCount" placeholder="销量">    <input type="button"  value="添加商品" @click="add"></div><script src="js/vue.js"></script><script src="js/axios.min.js"></script><script>  let v = new Vue({    el:"div",    data:{      product:{        title:"",        price:"",        saleCount:"",      }    },    methods:{      add(){        alert("111")        axios.post("/add",v.product).then(function (response) {          alert(response.data)        })      }    }  })</script></body>

第二步:控制层写个类

@RestControllerpublic class ProductController {    //mapper 接口实例化    @Autowired(required = false)    ProductMapper mapper;	 //添加    @RequestMapping("/add")    public String add(@RequestBody Product product){        mapper.insert(product);        return "添加成功";    }		//查询    @RequestMapping("/select")    public List<Product> select(){        List<Product> list=mapper.select();        return list;    }		//删除    @RequestMapping("/delete")    public int delete(Integer id){        mapper.delete(id);        return 1;    }		//查询一条    @RequestMapping("/selectId")    public Product selectId(Integer id){        return mapper.selectById(id);    }		//修改    @RequestMapping("/update")    public String update(@RequestBody Product product){        mapper.update(product);        return "修改成功!";    }}

第三步:写Mapper

@Mapperpublic interface ProductMapper {    @Insert("insert into product values (null,#{title},#{price},#{saleCount})")    void insert(Product product);    @Select("select * from product")    @Result(column = "sale_count",property = "saleCount")    List<Product> select();    @Select("select * from product where id = #{id}")    @Result(column = "sale_count",property = "saleCount")    Product selectById(Integer id);    @Delete("delete from product where id = #{id}")    void delete(Integer id);    @Update("update product set title=#{title},price=#{price},sale_count=#{saleCount} where id=#{id}")    void  update(Product product);}

SQL 语句映射

@Insert:实现新增功能

@Insert("insert into user(id,name) values(#{id},#{name})")public int insert(User user);

@Select:实现查询功能

@Select("Select * from user")@Results({    @Result(id = true, column = "id", property = "id"),    @Result(column = "name", property = "name"),    @Result(column = "sex", property = "sex"),    @Result(column = "age", property = "age")})List<User> queryAllUser();

@SelectKey:插入后,获取id的值

@Insert("insert into user(id,name) values(#{id},#{name})")@SelectKey(statement = "select last_insert_id()", keyProperty = "id", keyColumn = "id", resultType = int,before = false)public int insert(User user);//各个属性含义如下。statement:表示要运行的 SQL 语句;keyProperty:可选项,表示将查询结果赋值给代码中的哪个对象;keyColumn:可选项,表示将查询结果赋值给数据表中的哪一列;resultType:指定 SQL 语句的返回值;before:默认值为 true,在执行插入语句之前,执行 select last_insert_id()。值为 flase,则在执行插入语句之后,执行 select last_insert_id()。

@Update:实现更新功能

@Update("update user set name= #{name},sex = #{sex},age =#{age} where id = #{id}")void updateUserById(User user);

@Delete:实现删除功能

@Delete("delete from  user  where id =#{id}")void deleteById(Integer id);

@Param:映射多个参数

//@Param 用于在 Mapper 接口中映射多个参数。int saveUser(@Param(value="user") User user,@Param("name") String name);//@Param 中的 value 属性可省略,用于指定参数的别名。

@Result、@Results结果映射

@Select({"select id, name, class_id from student"})@Results(id="studentMap", value={    @Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),    @Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),    @Result(column="class_id ", property="classId", jdbcType=JdbcType.INTEGER)})List<Student> selectAll();//单个@Select({"select id, name, class_id from student"})@Result(column="class_id ", property="classId", jdbcType=JdbcType.INTEGER)Student selectOne();

@ResultMap 来引用映射结果集,其中 value 可省略

@Select({"select id, name, class_id from student where id = #{id}"})@ResultMap(value="studentMap")Student selectById(Integer id);

@one:用于一对一关系映射

@Select("select * from student") @Results({     @Result(id=true,property="id",column="id"),     @Result(property="name",column="name"),     @Result(property="age",column="age"),     @Result(property="address",column="address_id",one=@One(select="net.biancheng.mapper.AddressMapper.getAddress")) }) public List<Student> getAllStudents();  

@many:用于一对多关系映射

@Select("select * from t_class where id=#{id}") @Results({     @Result(id=true,column="id",property="id"),     @Result(column="class_name",property="className"),     @Result(property="students", column="id", many=@Many(select="net.biancheng.mapper.StudentMapper.getStudentsByClassId"))     }) public Class getClass(int id); 

resultMap元素的构成(XML)

<resultMap id="" type="">    <constructor><!-- 类再实例化时用来注入结果到构造方法 -->        <idArg/><!-- ID参数,结果为ID -->        <arg/><!-- 注入到构造方法的一个普通结果 -->     </constructor>    <id/><!-- 用于表示哪个列是主键 -->    <result/><!-- 注入到字段或JavaBean属性的普通结果 -->    <association property=""/><!-- 用于一对一关联 -->    <collection property=""/><!-- 用于一对多、多对多关联 -->    <discriminator javaType=""><!-- 使用结果值来决定使用哪个结果映射 -->        <case value=""/><!-- 基于某些值的结果映射 -->    </discriminator></resultMap>
<resultMap> 元素的 type 属性表示需要的 POJO,id 属性是 resultMap 的唯一标识。子元素 <constructor> 用于配置构造方法。当一个 POJO 没有无参数构造方法时使用。子元素 <id> 用于表示哪个列是主键。允许多个主键,多个主键称为联合主键。子元素 <result> 用于表示 POJO 和 SQL 列名的映射关系。子元素 <association>、<collection> 和 <discriminator> 用在级联的情况下。

属性

select标签

<select id="selectAllWebsite" resultType="net.po.Website" parameterType="string">    SELECT id,NAME,url FROM website WHERE NAME LIKE CONCAT ('%',#{name},'%')</select>

查询常用属性

//使用 MyBatis 的注解 @Param() 传递参数,如下所示。<!-- 根据name和url模糊查询网站信息 --><select id="selectWebsiteByAn" resultType="net.biancheng.po.Website">    SELECT id,NAME,url FROM website    WHERE name LIKE CONCAT ('%',#{name},'%')    AND url LIKE CONCAT ('%',#{url},'%')</select>//WebsiteMapper 接口中方法如下。public List<Website> selectByAn(@Param("name") String name, @Param("url") String url);

insert 标签

<!-- 增加网站信息 --><insert id="addWebsite" parameterType="string">    insert into website(name) values(#{name})</insert>

插入语句常用标签

<!--接收 Map 参数--><insert id="addWebsiteByMap" parameterType="map">    insert into Website (name, url) values (#{name}, #{url})</insert>

update 标签

<!--update 标签--><update id="updateWebsite" parameterType="string">    update website set name = #{name}</update>

修改常用标签

<!--更新语句接收 Map 传递的参数--><update id="updateWebsiteByMap" parameterType="map">    update website set name = #{name},url= #{url} where id = #{id}</update>

delete 标签

<delete id="deleteWebsite" parameterType="string">    delete from website where name = #{name}</delete>

删除常用标签

<!--通过 Map 传递参数,执行删除操作--><delete id="deleteWebsiteByMap" parameterType="map">    delete    from website    where name = #{name}      and url = #{url}</delete>

写法Demo

<resultMap type="order" id="orderUserResultMap">    <id property="id" column="id" />    <result property="userId" column="user_id" />    <result property="number" column="number" />    <result property="createtime" column="createtime" />    <result property="note" column="note" />    <!-- association :配置一对一属性 -->    <!-- property:order里面的User属性名 -->        <!-- javaType:属性类型 -->    <association property="user" javaType="user">        <!-- id:声明主键,表示user_id是关联查询对象的唯一标识-->        <id property="id" column="user_id" />        <result property="username" column="username" />        <result property="address" column="address" />    </association></resultMap><!-- 一对一关联,查询订单,订单内部包含用户属性 --><select id="queryOrderUserResultMap" resultMap="orderUserResultMap">    SELECT    o.id,    o.user_id,    o.number,    o.createtime,    o.note,    u.username,    u.address    FROM    `order` o    LEFT JOIN `user` u ON o.user_id = u.id</select>

其他标签

if 语句使用方法简单,常常与 test 属性联合使用。

//语法<if test="判断条件">    SQL语句</if>//案例<select id="selectAllWebsite" resultMap="myResult">    select id,name,url from website    <if test="name != null">        where name like #{name}    </if></select>
动态语句 choose-when-otherwise
//语法<choose>    <when test="判断条件1">        SQL语句1    </when >    <when test="判断条件2">        SQL语句2    </when >    <when test="判断条件3">        SQL语句3    </when >    <otherwise>        SQL语句4    </otherwise></choose>//案例<mapper namespace="net.biancheng.mapper.WebsiteMapper">    <select id="selectWebsite"        parameterType="net.biancheng.po.Website"        resultType="net.biancheng.po.Website">        SELECT id,name,url,age,country        FROM website WHERE 1=1        <choose>            <when test="name != null and name !=''">                AND name LIKE CONCAT('%',#{name},'%')            </when>            <when test="url != null and url !=''">                AND url LIKE CONCAT('%',#{url},'%')            </when>            <otherwise>                AND age is not null            </otherwise>        </choose>    </select></mapper>
where 标签主要用来简化 SQL 语句中的条件判断,可以自动处理 AND/OR 条件
//语法<where>    <if test="判断条件">        AND/OR ...    </if></where>//案例<select id="selectWebsite" resultType="net.biancheng.po.Website">    select id,name,url from website    <where>        <if test="name != null">            AND name like #{name}        </if>        <if test="url!= null">            AND url like #{url}        </if>    </where></select>
Set标签
<!--使用set元素动态修改一个网站记录 -->    <update id="updateWebsite"        parameterType="net.biancheng.po.Website">        UPDATE website        <set>            <if test="name!=null">name=#{name}</if>            <if test="url!=null">url=#{url}</if>        </set>        WHERE id=#{id}    </update>
foreach 标签用于循环语句,它很好的支持了数据和 List、set 接口的集合,并对此提供遍历的功能
//语法<foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")">    参数值</foreach>//案例<select id="selectWebsite"    parameterType="net.biancheng.po.Website"    resultType="net.biancheng.po.Website">    SELECT id,name,url,age,country    FROM website WHERE age in    <foreach item="age" index="index" collection="list" open="("        separator="," close=")">        #{age}    </foreach></select>

foreach 标签主要有以下属性,说明如下。

item:表示集合中每一个元素进行迭代时的别名。index:指定一个名字,表示在迭代过程中每次迭代到的位置。open:表示该语句以什么开始(既然是 in 条件语句,所以必然以(开始)。separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以,作为分隔符)。close:表示该语句以什么结束(既然是 in 条件语句,所以必然以)开始)。

使用 foreach 标签时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况:

如果传入的是单参数且参数类型是一个 List,collection 属性值为 list。如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array。如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。bind 标签可以通过 OGNL 表达式自定义一个上下文变量

<select id="selectWebsite" resultType="net.biancheng.po.Website">    <bind name="pattern" value="'%'+_parameter+'%'" />    SELECT id,name,url,age,country    FROM website    WHERE name like #{pattern}</select>
rim 一般用于去除 SQL 语句中多余的 AND 关键字、逗号,或者给 SQL 语句前拼接 where、set 等后缀,可用于选择性插入、更新、删除或者条件查询等操作
//语法<trim prefix="前缀" suffix="后缀" prefixOverrides="忽略前缀字符"suffixOverrides="忽略后缀字符">    SQL语句</trim>//案例<select id="selectWebsite" resultType="net.biancheng.po.Website">    SELECT id,name,url,age,country    FROM website    <trim prefix="where" prefixOverrides="and">        <if test="name != null and name !=''">            AND name LIKE CONCAT ('%',#{name},'%')        </if>        <if test="url!= null">            AND url like concat ('%',#{url},'%')        </if>    </trim></select>

trim标签属性

分页

<select id="selectWebsite" resultType="net.biancheng.po.Website">    SELECT id,name,url,age,country    FROM website    <trim prefix="where" prefixOverrides="and">        <if test="site.name != null and site.name !=''">            AND name LIKE CONCAT ('%',#{site.name},'%')        </if>        <if test="site.url!= null and site.url !=''">            AND url LIKE CONCAT ('%',#{site.url},'%')        </if>        ORDER BY id limit #{from},#{pageSize}    </trim></select>

学习记录,如有侵权请联系删除

标签: #联合主键sql