找回密码
 立即注册
首页 业界区 业界 MyBatis-mybatis入门与增删改查

MyBatis-mybatis入门与增删改查

窝酴 昨天 15:15
了解Mybatis

Mybatis是一个持久层框架,半自动化ORM(Hibernate属于全自动化ORM)。
Mybatis的特点:

  • 支持定制化sql、存储过程、基本映射以及高级映射
  • 避免了几乎所有的JDBC代码中手动设置参数以及获取结果集
  • 支持XML开发,也支持注解式开发
  • 将接口和Java的pojo映射成数据库中的记录
  • 体积小,易上手
  • 完全做到sql解耦
  • 提供了基本映射标签和高级映射标签
  • 提供XML标签、支持动态sql
Mybatis入门程序


  • 引入依赖
    1.         <dependency>
    2. <settings>
    3.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    4. </settings>  <groupId>org.mybatis</groupId>
    5. <settings>
    6.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    7. </settings>  mybatis</artifactId>
    8. <settings>
    9.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    10. </settings>  <version>3.5.14</version>
    11.         </dependency>
    12.         <dependency>
    13. <settings>
    14.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    15. </settings>  <groupId>mysql</groupId>
    16. <settings>
    17.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    18. </settings>  mysql-connector-java</artifactId>
    19. <settings>
    20.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    21. </settings>  <version>8.0.30</version>
    22.         </dependency>
    复制代码
  • 从XML中构建SqlSessionFactory
    SqlSessionFactory是mybatis中一个重要的对象。
    SqlSessionFactory对象的创建需要xml
    编写mybatis-config.xml文件(mybatis的核心配置文件)
    文件不是必须叫mybatis-config.xml,可以采用其他名字
    文件存放路径不是固定的,一般放在类的根路径下,一般放在resources文件夹下
    mybatis中有两个主要的配置文件:

    • mybatis-config.xml是核心配置文件,主要配置连接数据库的信息
      1. <?xml version="1.0" encoding="UTF-8" ?>
      2. <!DOCTYPE configuration
      3.         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      4.         "http://mybatis.org/dtd/mybatis-3-config.dtd">
      5. <configuration>
      6.     <environments default="development">
      7.         <environment id="development">
      8. <settings>
      9.         <setting name="logImpl" value="STDOUT_LOGGING"/>
      10. </settings>  <transactionManager type="JDBC"/>
      11. <settings>
      12.         <setting name="logImpl" value="STDOUT_LOGGING"/>
      13. </settings>  <dataSource type="POOLED">
      14. <settings>
      15.         <setting name="logImpl" value="STDOUT_LOGGING"/>
      16. </settings>      <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
      17. <settings>
      18.         <setting name="logImpl" value="STDOUT_LOGGING"/>
      19. </settings>      <property name="url" value="jdbc:mysql://localhost:3306/spring6"/>
      20. <settings>
      21.         <setting name="logImpl" value="STDOUT_LOGGING"/>
      22. </settings>      <property name="username" value="root"/>
      23. <settings>
      24.         <setting name="logImpl" value="STDOUT_LOGGING"/>
      25. </settings>      <property name="password" value="root"/>
      26. <settings>
      27.         <setting name="logImpl" value="STDOUT_LOGGING"/>
      28. </settings>  </dataSource>
      29.         </environment>
      30.     </environments>
      31.     <mappers>
      32.         <mapper resource="CarMapper.xml"/>
      33.         
      34.     </mappers>
      35. </configuration>
      复制代码
    • xxxxMapper.xml是用来编写SQL的配置文件
      1. <?xml version="1.0" encoding="UTF-8" ?>
      2. <!DOCTYPE mapper
      3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      5. <mapper namespace="carMapper">
      6.     <insert id="insertCar" >
      7.         INSERT INTO t_car (id, car_num, brand,guide_price,produce_time,car_type)
      8.         VALUES (null, '1003', '丰田霸道',30.0,'2000-10-11','燃油车')
      9.     </insert>
      10. </mapper>
      复制代码
    在mybatis当中,负责执行sql语句的那个对象叫做SqlSession。
    SqlSession是专门执行sql语句的,是一个Java程序和数据库之间的一次会话。
    要想获取SqlSession对象,需要先获取SqlSessionFactory对象,通过SqlSessionFactory来创建SqlSession对象。
    怎么获取SqlSessionFactory对象?
    ​      需要先获取SqlSessionFactoryBuilder对象。
    ​      通过SqlSessionFactoryBuilder对象的build方法来获取SqlSessionFactory对象。
    所以mybatis的核心对象包括:

    • SqlSessionFactoryBuilder
    • SqlSessionFactory
    • SqlSession
    SqlSessionFactoryBuilder--》SqlSessionFactory--》SqlSession
    编写测试程序:
    1. public class MyBatisTes {
    2.         public static void main(String[] args) throws IOException {
    3. <settings>
    4.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    5. </settings>  // 获取 SqlSessionFactoryBuilder 对象
    6. <settings>
    7.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    8. </settings>  SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    9. <settings>
    10.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    11. </settings>  // 获取 SqlSessionFactory 对象
    12. <settings>
    13.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    14. </settings>  // Resources.getResourceAsStream默认从类路径下加载资源文件
    15. <settings>
    16.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    17. </settings>  InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
    18. <settings>
    19.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    20. </settings>  // 一般情况下,一个数据库对应一个SqlSessionFactory对象
    21. <settings>
    22.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    23. </settings>  SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
    24. <settings>
    25.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    26. </settings>  // 获取 SqlSession 对象
    27. <settings>
    28.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    29. </settings>  SqlSession sqlSession = sqlSessionFactory.openSession();
    30. <settings>
    31.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    32. </settings>  int insertCar = sqlSession.insert("insertCar");
    33. <settings>
    34.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    35. </settings>  System.out.println("插入了" + insertCar + "条数据");
    36. <settings>
    37.         <setting name="logImpl" value="STDOUT_LOGGING"/>
    38. </settings>  sqlSession.commit();
    39.         }
    40. }
    复制代码
mybatis的事务管理机制


  • 在mybatis-config.xml文件中,可以通过以下配置进行mybatis的事务管理
    ​     
    type属性值包括JDBC和MANAGED
    在mybatis中提供了2中事务管理机制

    • jdbc事务管理器:mybatis框架自己管理事务,自己采用原生的jdbc代码去管理事务
      conn.setAutoCommit(false); // 开启事务
      。。。。业务处理。。。。
      conn.commit();// 手动提交事务
      如果设置了自动提交(sqlSessionFactory.openSession(true);)。那么就没有开启事务,这是不推荐的
      如果没有开启事务,那么就会自动提交
    • MANAGED事务管理器:mybatis不负责事务管理,事务管理交给其他容器来负责,例如Spring

mybatis程序完善版:
  1. public static void main(String[] args) {
  2.     SqlSession sqlSession = null;
  3.     try {
  4.         // 获取 SqlSessionFactoryBuilder 对象
  5.         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  6.         // 获取 SqlSessionFactory 对象
  7.         // Resources.getResourceAsStream默认从类路径下加载资源文件
  8.         InputStream  resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
  9.         SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
  10.         // 获取 SqlSession 对象,底层会开启事务
  11.         sqlSession = sqlSessionFactory.openSession();
  12.         int insertUser = sqlSession.insert("insertCar");
  13.         System.out.println("插入了" + insertUser + "条数据");
  14.         sqlSession.commit();
  15.     } catch (IOException e) {
  16.         if (sqlSession != null) {
  17. <settings>
  18.         <setting name="logImpl" value="STDOUT_LOGGING"/>
  19. </settings>  sqlSession.rollback();
  20.         }
  21.         throw new RuntimeException(e);
  22.     }finally {
  23.         if (sqlSession != null) {
  24. <settings>
  25.         <setting name="logImpl" value="STDOUT_LOGGING"/>
  26. </settings>  sqlSession.close();
  27.         }
  28.     }
  29. }
复制代码
mybatis开启日志

在mybatis-config.xml中配置如下:
  1. <settings>
  2.         <setting name="logImpl" value="STDOUT_LOGGING"/>
  3. </settings>
复制代码
集成logback日志框架

logback实现了slf4j标准。

  • 引入logback依赖
  1. <dependency>
  2.     <groupId>ch.qos.logback</groupId>
  3.     logback-classic</artifactId>
  4.     <version>1.4.5</version>
  5. </dependency>
复制代码

  • 引入logback的xml配置文件
配置文件名字必须叫做logback.xml或者logback-test.xml,不能是其他名字。
配置文件必须放在类的根路径下,不能是其他位置。
内容如下:
  1. <settings>
  2.         <setting name="logImpl" value="STDOUT_LOGGING"/>
  3. </settings> <settings>
  4.         <setting name="logImpl" value="STDOUT_LOGGING"/>
  5. </settings>    %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n <settings>
  6.         <setting name="logImpl" value="STDOUT_LOGGING"/>
  7. </settings> <settings>
  8.         <setting name="logImpl" value="STDOUT_LOGGING"/>
  9. </settings> <settings>
  10.         <setting name="logImpl" value="STDOUT_LOGGING"/>
  11. </settings> <settings>
  12.         <setting name="logImpl" value="STDOUT_LOGGING"/>
  13. </settings> <settings>
  14.         <setting name="logImpl" value="STDOUT_LOGGING"/>
  15. </settings>
复制代码
MyBatis工具类
  1. public class SqlSessionUtil {    // 构造方法私有化,防止外部创建实例    private SqlSessionUtil(){}    private static SqlSessionFactory sqlSessionFactory;    // 类加载时执行,初始化 SqlSessionFactory    static {        try { <settings>
  2.         <setting name="logImpl" value="STDOUT_LOGGING"/>
  3. </settings>  sqlSessionFactory =new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));        } catch (Exception e) { <settings>
  4.         <setting name="logImpl" value="STDOUT_LOGGING"/>
  5. </settings>  throw new RuntimeException("初始化 SqlSessionFactory 失败", e);        }    }    // 提供一个公共的静态方法,获取 SqlSession 对象    public static SqlSession openSqlSession(){        return sqlSessionFactory.openSession();    }}
复制代码
mybatis中增删改查

新增

在mybatis中使用#{}来代替jdbc当中?占位符
  1. @Test
  2. public void TestInsertCar() {
  3.     SqlSession sqlSession = SqlSessionUtil.openSqlSession();
  4.     Map<String, Object> map = new HashMap<String, Object>();
  5.     map.put("k1", "1111");
  6.     map.put("k2", "比亚迪汉");
  7.     map.put("k3", 10.0);
  8.     map.put("k4", "2024-06-01");
  9.     map.put("k5", "新能源");
  10.     sqlSession.insert("insertCar", map);
  11.     sqlSession.commit();
  12.     sqlSession.close();
  13. }
复制代码
  1. <insert id="insertCar" >
  2.     INSERT INTO t_car (id, car_num, brand,guide_price,produce_time,car_type)
  3.     VALUES (null, #{k1}, #{k2},#{k3},#{k4},#{k5})
  4. </insert>
复制代码
使用pojo类传值
  1. @Test
  2. public void TestInsertCarByPojo() {
  3.     SqlSession sqlSession = SqlSessionUtil.openSqlSession();
  4.     Car car = new Car(null, "3333", "比亚迪秦", 30.0,"2020-10-11","新能源");
  5.     sqlSession.insert("insertCar", car);
  6.     sqlSession.commit();
  7.     sqlSession.close();
  8. }
复制代码
  1. <insert id="insertCar" >
  2.     INSERT INTO t_car (id, car_num, brand,guide_price,produce_time,car_type)
  3.     VALUES (null, #{carNum}, #{brand},#{guidePrice},#{produceTime},#{carType})
  4. </insert>
复制代码
#{carNum}中的carNum实际上是pojo类中的get方法getCarNum() 的方法名去掉get,然后首字母小写的字符串。不是属性名
删除
  1. @Test
  2. public void testDeleteCarById() {
  3.     SqlSession sqlSession = SqlSessionUtil.openSqlSession();
  4.     sqlSession.delete("deleteCarById", 1);
  5.     sqlSession.commit();
  6.     sqlSession.close();
  7. }
复制代码
  1. <delete id="deleteCarById" >
  2.     DELETE FROM t_car WHERE id = #{id}
  3. </delete>
复制代码
如果占位符只有一个。那么#{}里面可以随意写,最好见名知意
更新
  1. @Test
  2. public void testUpdateCarById() {
  3.     SqlSession sqlSession = SqlSessionUtil.openSqlSession();
  4.     Car car = new Car(2L, "3333", "比亚迪秦Pro", 30.0, "2020-10-11", "新能源");
  5.     sqlSession.update("updateCarById", car);
  6.     sqlSession.commit();
  7.     sqlSession.close();
  8. }
复制代码
  1. <update id="updateCarById" >
  2.     UPDATE t_car SET car_num = #{carNum}, brand = #{brand},guide_price = #{guidePrice},produce_time = #{produceTime},car_type = #{carType} WHERE id = #{id}
  3. </update>
复制代码
查一个
  1. @Test
  2. public void testSelectCarById() {
  3.     SqlSession sqlSession = SqlSessionUtil.openSqlSession();
  4.     // mybatis底层执行select后,会返回一个结果集对象:ResultSet
  5.     // jdbc中叫做ResultSet,在mybatis中叫做ResultMap
  6.     Car car = sqlSession.selectOne("selectCarById", 2);
  7.     System.out.println(car);
  8.     sqlSession.close();
  9. }
复制代码
  1. <settings>
  2.         <setting name="logImpl" value="STDOUT_LOGGING"/>
  3. </settings>  SELECT id, car_num AS carNum, brand, guide_price AS guidePrice, produce_time AS produceTime, car_type AS carType        FROM t_car        WHERE id = #{id}   
复制代码
查所有
  1. @Test
  2. public void testSelectAllCar() {
  3.     SqlSession sqlSession = SqlSessionUtil.openSqlSession();
  4.     // mybatis底层执行select后,会返回一个结果集对象:ResultSet
  5.     // jdbc中叫做ResultSet,在mybatis中叫做ResultMap
  6.     List<Car> cars = sqlSession.selectList("selectAllCar");
  7.     for (Car car : cars) {
  8.         System.out.println(car);
  9.     }
  10.     sqlSession.close();
  11. }
复制代码
  1. <select id="selectAllCar" resultType="com.ali.pojo.Car">
  2.     SELECT id, car_num AS carNum, brand, guide_price AS guidePrice, produce_time AS produceTime, car_type AS carType
  3.     FROM t_car
  4. </select>
复制代码
关于sql Mapper中的namespace

标签中的namespace 用来指定命名空间。用来防止id重复。
在Java程序中的写法(.):
List cars = sqlSession.selectList("carMapper.selectAllCar");

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册