准备:
JDK1.8Eclipsemybatis所需jar包MySQL驱动jar比起hibernate,mybatis要轻量得多(看jar包就知道[偷笑])
第一步:建立web项目,这里因为后期整合,就直接建立web项目。再就是导入上面提到的包了。建立测试数据库。这里就以mall的PRoducts和category为例了。 字段如下了: category: products
建立对应实体类(省略getter和setter):
第二步:在src下配置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><!-- 环境配置,默认为development,有详细的错误信息 --> <environments default="development"> <!-- id不是绝对,可以区分多个环境配置,如不同平台数据库 --> <environment id="development"> <!-- 事务管理配置,可选参数"JDBC"/"MANAGED",JDBC事务管理机制或者spring类型的web容器管理 --> <transactionManager type="JDBC"/> <!-- type可选参数,POOLED为连接池连接,UNPOOLED为非连接池链接 --> <dataSource type="POOLED"> <!-- 数据库的连接配置 --> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mall"/> <property name="username" value="root"/> <property name="passWord" value="123456"/> </dataSource> </environment> </environments> <!-- 指定数据库操作映射文件 --> <mappers> <mapper resource="mapper/products-mapper.xml"/> </mappers></configuration>第三步:配置数据库操作的映射文件以及dao接口
<?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="products_dao.ProductsDao"> <!-- 添加数据 --> <insert id="insertProducts" parameterType="entity.Products"> insert into products(pname,price,unitsOnStack) values(#{pname},#{price},#{unitsOnStack}) </insert> <!-- 删除数据 --> <delete id="deleteProduct" parameterType="int"> delete from products where pid = #{pid} </delete> <!-- 更新数据 --> <update id="updateProduct" parameterType="entity.Products"> update products set pname = #{pname} where pid=#{pid} </update> <!-- 定义一个结果映射,这里包含了products和category的多对一关系 --> <resultMap type="entity.Products" id="product"> <id column="pid" property="pid" javaType="java.lang.Integer" /> <result column="pname" property="pname" javaType="java.lang.String" /> <result column="price" property="price" javaType="java.lang.Double" /> <result column="unitsOnStack" property="unitsOnStack" javaType="java.lang.Double" /> <!--association配置多对一多方,实体内包含类型类--> <association property="category" column="cid" select="queryCategoryByID"> </association> </resultMap> <!-- 这是category的结果映射,这里包含了category与products的一对多关系 --> <resultMap type="entity.Category" id="category"> <id column="cid" property="cid" /> <result column="cname" property="cname" /> <!--collection配置多对一一方,实体内包含商品集合--> <collection property="products" column="cid" select="queryProductsByID"></collection> </resultMap> <!-- 包含两个表的联合结果映射product1 --> <resultMap type="entity.Products" id="product1"> <id column="pid" property="pid" /> <result column="pname" property="pname" /> <association property="category" javaType="entity.Category"> <id column="cid" property="cid" /> <result column="cname" property="cname" /> <collection property="products" resultMap="product1"></collection> </association> </resultMap> <!-- 通过id查询的结果映射到category --> <select id="queryCategoryByID" parameterType="int" resultMap="category"> select * from category where cid=#{cid} </select> <!-- 通过id查询的结果映射到product --> <select id="queryProductsByID" resultMap="product" parameterType="int"> select * from products where cid=#{cid} </select> <!-- 将查询的内容映射到product对应的结果映射 --> <select id="queryProducts" resultMap="product"> select * from products </select> <!-- 将查询的内容映射到category对应的结果映射 --> <select id="queryCategory" resultMap="category"> select * from category </select> <!-- 最后通过两个表的结果映射所得到的结果 --> <select id="queryProductsByUnion" resultMap="product1"> select * from mall.products a left join mall.category b on a.cid=b.cid; </select> <!-- 动态查询 --> <select id="queryProductsByCondition" parameterType="entity.Products" resultType="entity.Products"> select * from products <!-- trim加where前缀和去掉重复的and --> <trim prefix="where" suffixOverrides="and"> <if test="pname != null"> pname = #{pname} and </if> <if test="price != null"> price = #{price} and </if> <if test="unitsOnStack != null"> unitsOnStack = #{unitsOnStack} </if> </trim> </select></mapper>dao接口:
package products_dao;import java.util.List;import entity.Products;public interface ProductsDao { List<Products> queryProducts(); int insertProducts(Products pro); int deleteProduct(int pid); int updateProduct(Products pro); List<Products> queryProductsByUnion(); List<Products> queryProductsByCondition(Products pro);}当 查询的数据不是实体类中存在,而是一些特殊业务场景,如联表统计销售额等等,使用返回值类型为map集合就很适合此时的业务,从而没有必要去建立一个实体类
第四步:测试
package test;import java.io.IOException;import java.io.Reader;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import entity.Products;import products_dao.ProductsDao;public class PrdouctTest { public static void main(String[] args) throws IOException { String configPath = "mybatis-config.xml"; // 读取配置 Reader reader = Resources.getResourceAsReader(configPath); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(reader); SqlSession session = factory.openSession(); // 查询 // 通过接口映射所对应执行的sql语句 ProductsDao dao = session.getMapper(ProductsDao.class); List<Products> list = dao.queryProducts(); for (Products products : list) { System.out.println(products.getPname()); } // 添加 Products pro = new Products(); pro.setPname("嘻嘻"); pro.setPrice(4.0); pro.setUnitsOnStack(100.0); int rs = dao.insertProducts(pro); if(rs>0) { System.out.println("恭喜你插入成功"); }else{ System.out.println("恭喜你插入失败"); } session.commit(); // 删除 int rs1 = dao.deleteProduct(9); if(rs1>0) { System.out.println("恭喜你删除成功"); }else{ System.out.println("恭喜你删除失败"); } session.commit(); // 更新 Products pro1 = new Products(); pro1.setPid(8); pro1.setPname("辣条"); int rs2 = dao.updateProduct(pro1); if(rs2>0) { System.out.println("恭喜你修改成功"); }else{ System.out.println("恭喜你修改失败"); } session.commit(); // 联表查询 List<Products> list1=dao.queryProductsByUnion(); for(Products pro2:list1){ System.out.println(pro2.getPid()+" "+pro2.getCategory().getCname()); } // 动态查询 Products pro3 = new Products(); pro.setPname("辣条"); List<Products> list2=dao.queryProductsByCondition(pro3); System.out.println(list2.size()); }}写的比较仓促,基本用法都有了。有时间再补充一下。
新闻热点
疑难解答