前言:
而今你们对“联合主键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
在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>
分页
<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