• 半自动ORM—mybatis


    开篇:

    ORM  框架 :

    jdbc取出来的是记录集 ResultSet, 遍历 (同时取字段),  new对象,制作集合
    ORM框架:取出来的直接就是对象(集合)。 配置(表book<----->实体类Book)
    

    开发步骤:

    1.github下载   mybatis-3.4.4.zip
    2.准备com.qq.model  实体类--------------model模型
    3.Mybatis 基础配置文件  mybatis-config.xml   编写 
    	一、db.properties
    		(1)driver
    		(2)url
    		(3)user
    	        (4)password
    	二、映射文件所在的路径
    		sql语句,要写到一个文件中, 映射文件BookMapper.xml	
    		
    			com/qq/mapper/BookMapper.xml
    	三、驼峰转换
    		
    		类的属性名<---->表字段
    		personName	person_name
    	四、日志组件 设置
    		
    4.映射文件的编写
    5.写java代码:
    	一般流程
    		(1)加载 mybatis-config.xml   
    		(2)去执行xxxMapper.xml文件中的某个sql语句
    
    	三种:
    		(一) SqlSession.方法()  selectAll(),selectOne()
    		(二)接口的方式(常用)
    			抽象方法,都对应了映射文件中的sql语句
    			包com.hqyj.mapper
    			interface BookMapper
    			{
    				List selectAll(); 
    				Book		selectOne();
    			}		
    		(三)注解的方式:sql语句标记在接口的方法上面
    

    一、文件的编写

    1.基础配置文件的编写

    1.1、配置文件—mybatis-config.xml

    顺序:

    mybatis-config.xml

    1. driver
    2. url
    3. user
    4. password
    1. <environments default="development">
    2. <environment id="development">
    3. <transactionManager type="JDBC"/>
    4. <dataSource type="POOLED">
    5. <property name="drvier" value="com.mysql.jdbc.Driver"/>
    6. <property name="url" value="jdbc:mysql://localhost:3306/shop?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai"/>
    7. <property name="user" value="root"/>
    8. <property name="password" value="123456"/>
    9. dataSource>
    10. environment>
    11. environments>
    12. <mappers>
    13. <mapper resource="com.hqyj.mapper.BookMapper.xml"/>
    14. mappers>

    1.2、隐射文件的所在的路径

    要写到一个文件之中,映射文件,BookMapper.xml

    设置映射文件所在的路径

    1. <mappers>
    2. <mapper resource="com.hqyj.mapper.BookMapper.xm"/> //方法一
    3. <package name="com.hqyj.mapper"/> //批量导入法,直接用
    4. mappers>

    1.3、驼峰转换

     类的属性名  --------------表字段名

      personName  -----------person_name

    1. <settings>
    2. <setting name="mapUnderscoreToCamelCase" value="true"/>
    3. settings>

    日志组件的选择

    1. <settings>
    2. <setting name="mapUnderscoreToCamelCase" value="true"/>
    3. <setting name="logImpl" value="STDOUT_LOGGING"/>
    4. settings>

    1.4  mapper路径的写法

    1. <mappers>
    2. <package name="com.hqyj.mapper"/>
    3. mappers>
       
    
    

    2.映射文件的编写,BookMapper.xml文件

    2.1 头部编写

    1. "1.0" encoding="utf-8" ?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="mapper对">
    4. <resultMap id="map集合的名字" type="对应的实体类>
    5. 主键名" column="数据库的列名" >id>
    6. <result column="数据库列名" property="实体类对应的名字">
    7. resultMap>
    8. mapper>

    2.2 sql语句编写

    如果数据库的列名与实体类的不一致,需要使用resultMap来转换

    1.getcount():查询表中的数据条数

    2.selectAll:查询全部的book

    3.findUserAuthor:不管大小写模糊查询tom的author的记录

    4.selectOne:查询单个book

    5.insertOne:插入一条记录,行内配置模式

    6.insertOne3:插入一条记录,全局模式

    7.modify:修改记录,并且判断是否为空或者“”,是则不修改

    8.deleteById:根据id删除记录

    9.selectByAuthor:根author查询记录,不同的写法

    10.queryOrder:根据price排序显示

    1. <mapper namespace="com.hqyj.mapper.BookMapper">
    2. <resultMap id="bookMap" type="com.hqyj.model.Book">
    3. <id property="id" column="id" >id>
    4. <result column="name" property="name">result>
    5. <result column="author" property="author">result>
    6. <result column="price" property="price">result>
    7. resultMap>
    8. <select id="getCount" resultType="java.lang.Integer">
    9. select count(1) from book
    10. select>
    11. <select id="selectAll" resultMap="bookMap">
    12. SELECT id,name,author,price from Book where lower(author) like lower("%#{author}%")
    13. select>
    14. <select id="findUserAuthor" parameterType="String" resultMap="bookMap">
    15. select * from book where upper(author) like upper("%${author}%")
    16. select>
    17. <select id="selectOne" resultType="com.hqyj.model.Book" >
    18. SELECT * from Book where id = #{id}
    19. select>
    20. <insert id="insertOne" keyProperty="id" parameterType="com.hqyj.model.Book">
    21. insert into book(name,author,price) values (#{name},#{author},#{price})
    22. insert>
    23. <insert id="insertOne3" >
    24. insert into book(name,author,price) values (#{name},#{author},#{price})
    25. insert>
    26. <update id="modify" parameterType="com.hqyj.model.Book">
    27. update book set name=#{name},
    28. <if test="author!=null and author!=''">
    29. author=#{author},
    30. if>
    31. <if test="price!=null">
    32. price=#{price}
    33. if>
    34. where id=#{id}
    35. update>
    36. <delete id="deleteById">
    37. DELETE From book Where id = #{id}
    38. delete>
    39. <select id="selectByAuthor" resultType="com.hqyj.model.Book">
    40. -- select * from book where name like '%${author}%';
    41. -- select * from book where name like '%${value}%';
    42. -- select * from book where name like #{author}
    43. select * from book where name like concat('%',#{author},'%');
    44. -- select * from book where name like '%' #{author} '%';
    45. select>
    46. <select id="queryOrder" parameterType="com.hqyj.model.Book">
    47. select * from book order by #{price} desc
    48. select>
    49. mapper>

    3.编写Java代码

    1. 加载mybatis-config.xml
    2. 去执行XXXmapper.xml文件中的猫扑个SQL语句

    1. public class BookTest {
    2. public static void main(String[] args) {
    3. String resource = "mybatis-config.xml";
    4. InputStream is = BookTest.class.getClassLoader().getResourceAsStream(resource);
    5. //创建sqlsession
    6. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
    7. //打开会话
    8. SqlSession sqlSession = sessionFactory.openSession();
    9. 1.查询单个
    10. Book book = sqlSession.selectOne("com.hqyj.mapper.BookMapper.selectOne",1);
    11. System.out.println(book.getAuthor());
    12. 2.查询全部
    13. List bookList = sqlSession.selectList("com.hqyj.mapper.BookMapper.selectAll");
    14. for (Book one:bookList) {
    15. System.out.println(one.getAuthor());
    16. }
    17. 3.插入一条记录
    18. Book book = new Book("爱的守护","明世隐",100);
    19. int res = sqlSession.insert("com.hqyj.mapper.BookMapper.insertOne",book);
    20. System.out.println(res);
    21. sqlSession.commit();
    22. sqlSession.close();
    23. }
    24. }

    4.编写方式

    4.1  SqlSession.方法()

    1. public class BookTest {
    2. public static void main(String[] args) {
    3. String resource = "mybatis-config.xml";
    4. InputStream is = BookTest.class.getClassLoader().getResourceAsStream(resource);
    5. //创建sqlsession
    6. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
    7. //打开会话
    8. SqlSession sqlSession = sessionFactory.openSession();
    9. 1.查询单个
    10. Book book = sqlSession.selectOne("com.hqyj.mapper.BookMapper.selectOne",1);
    11. System.out.println(book.getAuthor());
    12. 2.查询全部
    13. List bookList = sqlSession.selectList("com.hqyj.mapper.BookMapper.selectAll");
    14. for (Book one:bookList) {
    15. System.out.println(one.getAuthor());
    16. }
    17. 3.插入一条记录
    18. Book book = new Book("爱的守护","明世隐",100);
    19. int res = sqlSession.insert("com.hqyj.mapper.BookMapper.insertOne",book);
    20. System.out.println(res);
    21. sqlSession.commit();
    22. sqlSession.close();
    23. }
    24. }

    4.2 接口的方式

    抽象方法

    1. com.hqyj.mapper
    2. interface BookMapper{
    3. List selectAll();
    4. Book selectOne();
    5. }
    6. public interface BookMapper {
    7. List selectAll();
    8. Book selectOne(int id);
    9. int insertOne(Book book);
    10. }
    1. <mapper namespace="com.hqyj.mapper.BookMapper">
    2. <select id="selectAll" resultType="com.hqyj.model.Book">
    3. SELECT * from Book
    4. select>
    5. <select id="selectOne" resultType="com.hqyj.model.Book">
    6. SELECT * from Book where id = #{id}
    7. select>
    8. <insert id="insertOne" parameterType="com.hqyj.model.Book">
    9. insert into book(name,author,price)
    10. values (#{name},#{author},#{price})
    11. insert>
    12. mapper>

    4.3 sql语句标记在接口的方法上面

    1. package com.hqyj.mapper;
    2. import com.hqyj.model.Book;
    3. import org.apache.ibatis.annotations.Insert;
    4. import org.apache.ibatis.annotations.Select;
    5. import java.util.List;
    6. public interface BookMapper {
    7. @Select("select * from book")
    8. List selectAll();
    9. @Select("select * from book where id = #{id}")
    10. Book selectOne(int id);
    11. @Insert("insert into book(name,author,price) values (#{name},#{author},#{price})")
    12. int insertOne(Book book);
    13. }

    1. public class BookTest2 {
    2. public static void main(String[] args) throws IOException {
    3. //法二:
    4. // InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    5. // SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
    6. // SqlSession session = sessionFactory.openSession();
    7. //
    8. // BookMapper bookMapper = session.getMapper(BookMapper.class);
    9. //法三:
    10. Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
    11. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
    12. SqlSession session = sessionFactory.openSession();
    13. BookMapper bookMapper = session.getMapper(BookMapper.class);
    14. List books = bookMapper.selectAll();
    15. for (Book b:books) {
    16. System.out.println(b.getAuthor());
    17. }
    18. Book book = bookMapper.selectOne(4);
    19. System.out.println(book);
    20. int num = bookMapper.insertOne(new Book("太难起","zs",10));
    21. System.out.println(num);
    22. session.commit();
    23. session.close();
    24. }
    25. }

    4.4  以后编程实现

    使用第二种接口的方式

         思想:

    Book-------->MyTest----->BookMapper.java接口定义方法------->BookMapper.xml文件进行sql操作------>返回数据给MyTest并打印。

    5.db.properties编写

    user = root
    password=123456

    5.1 自动扫描实体类编写

    方式一:

    方式二:

    mapper.xml文件:

    6.日志:级别

    6.1 Logger{}接口:

    interface   Logger{

    warn():警告

    error():致命提示

    info():

    falte():

    }

    6.2 实现者

    1. log4J
    2. log4j2

    二、sql——增删改查

    parameterType,数据类型

    java    jdbc   mysql(int)

    c#      jdbc   oracle(int)

    int ------->interger

    1.添加

    1.2数据反填回实体类中

    方法一:
    
    1. <insert id="insertOne" useGeneratedKeys="true" keyProperty="id" parameterType="com.hqyj.model.Book">
    2. insert into book(name,author,price)
    3. values (#{name},#{author},#{price})
    4. insert>
    方法二:
    
    1. <insert id="insertOne4" parameterType="com.qq.model.Book">
    2. <selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">
    3. SELECT LAST_INSERT_ID()
    4. selectKey>
    5. Insert Into book(name,author,price) value(#{name},#{author},#{price})
    6. insert>

    1.2问题

            如果不用框架来反填,使用纯粹的jdbc,但有的数据库不支持自增

    原生jdbc写法:

    第一种:Statement.RETURN_GENERATED_KEYS

    使用Statement.RETURN_GENERATED_KEYS回旋自增主键,stmt.getGeneratedKeys()获取自增主键,然后进行遍历,找出最大的自增主键

    如果表ID不是自动增长,想返回ID

    1. <insert id="addUserBackUUID" parameterType="com.hqyj.system.model.User2">
    2. <selectKey keyProperty="id" keyColumn="id" order="BEFORE" resultType="String">
    3. SELECT uuid()
    4. <lectKey>
    5. INSERT INTO user2 (id,username,birthday,sex,address) VALUES (#{id},#{username},#{birthday},#{sex},#{address});
    6. insert>

    1.3设置回填为全局配置

    1. <settings>
    2. <setting name="mapUnderscoreToCamelCase" value="true"/>
    3. <setting name="logImpl" value="STDOUT_LOGGING"/>
    4. <setting name="useGeneratedKeys" value="true"/>
    5. settings>

    1.4全局后有些用不着

    1.5 解决多参数问题

    1. mybatis使用了arg0、arg1、arg2.....对应传过来的参数
    1. Book book = new Book("天气预报", "zs", 10);
    2. System.out.println("最初的id="+book.getId());
    3. int num = bookMapper.insertOne(book);
    4. <insert id="insertOne2" >
    5. insert into book(name,author,price) values (#{arg0},#{arg1},#{arg2})
    6. insert>

    2.使用@Param

    1. 测试:
    2. int num = bookMapper.insertOne2("爱的供养","杨幂", (double) 100);
    3. 接口:
    4. int insertOne2(@Param("name") String name, @Param("author") String author,@Param("price") Double price);
    5. xml:
    6. <insert id="insertOne3" >
    7. insert into book(name,author,price) values (#{name},#{author},#{price})
    8. insert>

    3.传递Map

    Map  map = new HashMap();

    map.put("name","...");

    map.put("author","...");

    map.put("price","...");

    测试:  
    
    1. //方法三:
    2. HashMap map = new HashMap<>();
    3. map.put("name","成功的秘诀");
    4. map.put("author","何梦");
    5. map.put("price","111");
    6. int num = bookMapper.insertOne3(map);
    接口:
    
    1. int insertOne3(Map map);
    2. xml:
    3. <insert id="insertOne3" >
    4. insert into book(name,author,price) values (#{name},#{author},#{price})
    5. insert>

    2.修改功能-----if判断

    测试:
    
    1. public class modifybook {
    2. public static void main(String[] args) throws IOException {
    3. Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
    4. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
    5. SqlSession session = sessionFactory.openSession();
    6. BookMapper bookMapper = session.getMapper(BookMapper.class);
    7. Book book = new Book(1, "我的爱", "lily", 200);
    8. int num = bookMapper.modify(book);
    9. System.out.println("结果="+num);
    10. session.commit();
    11. session.close();
    12. }
    13. }
    mapper:
    
    int modify(Book book);
    XML:  
     
    1. <update id="modify" parameterType="com.hqyj.model.Book">
    2. update book set name=#{name},author=#{author} ,price=#{price} where id=#{id}
    3. update>

    当输入错误,作者为空时,不修改:

    需要使用

    1. <if test="条件">if>
    2. <update id="modify" parameterType="com.hqyj.model.Book">
    3. update book set name=#{name},
    4. <if test="author!=null and author!=''">
    5. author=#{author},
    6. if>
    7. <if test="price!=null">
    8. price=#{price}
    9. if>
    10. where id=#{id}
    11. update>

    3.删除功能

    1. <delete id="deleteById">
    2. DELETE From book Where id = #{id}
    3. delete>
    1. //删除
    2. int num1 = bookMapper.deleteById(18);
    3. System.out.println("删除的结果num="+num1);
    4. int deleteById(int Id);

    4.模糊查询

    4.1   concat拼接

     select * from book  where name like concat('%',#{author},'%');

    4.2底层拼接

    1. List books = bookMapper.selectByAuthor("%中%");
    2. select * from book where name like #{author}

    4.3  value功能

    select * from book  where name like '%${value}%';

    4.4 拼接

    select * from book  where name like '%' #{author} '%';

    4.5 传入参数用法

    select * from book  where name like '%${author}%';

    4.6 #和$的区别

    1 #表示sql模板的占位符,

    2 #可以防止sql注入,一般能用#
    3 ${}内部的参数名必须写value。

    5.查询并排序

    5.1单个字段排序

    1. //查询并排序
    2. List books = bookMapper.queryOrder("price");
    3. for (Book one:books) {
    4. System.out.println(one.getName()+":"+one.getAuthor());
    5. }
    6. session.commit();
    7. session.close();
    8. List queryOrder(String xxx);

    6.表字段和实体类属性的对应

    6.1 使用mapUnderscoreToCamelCase

    1. <settings>
    2. <setting name="mapUnderscoreToCamelCase" value="false"/>
    3. <setting name="logImpl" value="STDOUT_LOGGING"/>
    4. settings>

    数据库中的price字段名为:book_price

    实体类中的price为:bookprice

    6.2  As  别名

    mysql数据库定别名可以不写AS

    sqlserver必须写AS

    1. <select id="selectAll" resultType="com.hqyj.model.Book">
    2. SELECT id,name,author,price money from Book
    3. select>
    4. SELECT id,name,author,price as money from Book
     
    

    6.3   resultMap(常用)

    1. <resultMap id="" type="实体类">
    2. <id property="" column="">id>
    3. <result column="数据库字段名" property="实体类的变量">.....
    4. resultMap>
    5. <resultMap id="bookMap" type="com.hqyj.model.Book">
    6. <id property="id" column="id">id>
    7. <result column="name" property="name">result>
    8. <result column="author" property="author">result>
    9. <result column="price" property="money">result>
    10. resultMap>

  • 相关阅读:
    Leetcode—34.在排序数组中查找元素的第一个和最后一个位置【中等】
    实用的Visual Studio插件
    Java定时任务实现优惠码
    leetcode 547.省份数量 并查集
    定义现代化实时数据仓库,SelectDB 全新产品形态全面发布
    C++入门(二)
    C语言结构体
    【第四篇】商城系统-品牌管理实现
    流式DMA映射实践1:先写一个misc驱动框架
    java计算机毕业设计HTML5互动游戏新闻网站设计与实现源码+mysql数据库+系统+lw文档+部署
  • 原文地址:https://blog.csdn.net/weixin_46048259/article/details/126433229