• 【框架】MyBatis


    MyBatis

    IDEA配置xml文件模板

    Settings --> Editor --> File and Code Templates --> Unnamed --> name=mybatis-mapper / mybatis-config

    • 建数据库表
    DROP DATABASE IF EXISTS mybatis;
    CREATE DATABASE mybatis;
    USE mybatis;
    CREATE TABLE t_user(
    	`id` INT PRIMARY KEY AUTO_INCREMENT,
    	`name` VARCHAR(30),
    	`password` VARCHAR(12)
    );
    INSERT INTO t_user(`name`,`password`) VALUE('zhangsan',1234);
    SELECT * FROM t_user;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 添加依赖
    
    <build>
        
        <resources>
            <resource>
                <directory>src/main/javadirectory>
                <includes>
                    <include>**/*.propertiesinclude>
                    <include>**/*.xmlinclude>
                includes>
                <filtering>falsefiltering>
            resource>     
        resources>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • mapper文件的配置
    <mappers>
        
        <mapper resource="com/jun/dao/UserDao.xml"/>
    mapper>
    
    <package name="com.jun.dao"/>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    返回对象List集合

    • 创建mybatis-config.xml配置文件
    • 使用mapper的resource属性指定mapper文件的路径,从类路径开始的路径信息。从target/classes(类路径)开启。
    • resource=“mapper文件的路径,使用 / 分割路径”
    
    DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false"/>
                    <property name="username" value="root"/>
                    <property name="password" value="hrj"/>
                dataSource>
            environment>
        environments>
        <mappers>
            <mapper resource="UserDAO.xml"/>
        mappers>
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 创建UserDAO接口和UserDAO.xml配置文件
    • namespace:命名空间,配置接口的包名+类名(要求使用dao接口的全限定名称)
    • id就是接口的方法名;resultType:返回值类型(包名+类名),是SQL语句执行后得到ResultSet,遍历这个ResultSet得到java对象的类型。
    • sqlSession.getMapper();使用的是MyBatis的动态代理机制,getMapper能获取dao接口对应的实现类对象。
    
    <mapper namespace="com.jun.dao.UserDAO">
        <select id="queryAllUsers" resultType="com.jun.pojo.User">
                select * from t_user;
        select>
    mapper>
    resultType:告诉Mybatis,执行sql语句,把数据赋值给哪个类型的java对象。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 测试程序
    public void test01() throws Exception {
       
        InputStream ins = Resources.getResourceAsStream("mybatis-config.xml"); //配置文件在类路径下
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ins);
        //产生一个SqlSession会话对象连接MySql数据库
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //创建一个接口:接口的方法名与Mapper文件名要一致
        //Mapper文件
        UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
        List<User> userList = userDAO.queryAllUsers();
        userList.forEach(user -> {
       
            System.out.println(user);
        });
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    重复代码提取:

    • @Before 注解表示任何的单元测试@Test在执行之前都要执行@Before (import org.junit.Before;)
    public class TestMybatis {
       
        private SqlSessionFactory sqlSessionFactory;
        //公共提取
        @Before
        public void beforeMybatis() throws Exception {
       
            InputStream ins = Resources.getResourceAsStream("mybatis-config.xml"); //配置文件在类路径下
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(ins);
        }
    //方式二:
    public class MyBatisUtils{
       
        private static SqlSessionFactory sqlSessionFactory;
        static{
       
            InputStream ins = Resources.getResourceAsStream("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(ins);    
        }
        //获取SqlSession的方法
        public static SqlSession getSqlSession(){
       
            SqlSession sqlSession = null;
            if(sqlSessionFactory != null){
       
                sqlSession=sqlSessionFactory.openSession();//非自动提交事务
            }
            return sqlSession;
        }
    }    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    返回单个对象

    • UserMapper.xml文件
    public User queryUserById(Integer id);
    parameterType:形参的类型(自定义JavaBean必须加:包名+类名),可以省略不写
    #{}是Mybatis的占位符,相当于jdbc的?
    <select id="queryUserById" parameterType="Integer" resultType="com.jun.pojo.User">
            select `id`,`name`,`password` from t_user where id = #{id}
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • UserMapper接口,增加功能

    openSession():无参数/参数为false,获取的是非自动提交事务的SqlSession对象

    public interface UserMapper {
       
        //查询所有用户信息
        public List<User> queryAllUsers();
        //根据用户ID查询一个用户信息
        public User queryUserById(Integer id);
    }
    public void test2() {
       
        SqlSession sqlSession = null;
        try {
       
            sqlSession = sqlSessionFactory.openSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User user = mapper.queryUserById(1);
            System.out.println(user);
        } catch (Exception e) {
       
            e.printStackTrace();
        } finally {
       
            if (sqlSession != null) {
       
                sqlSession.close();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    更改用户信息

    • UserMapper接口:public void updateUser(User user);
    <mapper>
        <update id="updateUser">
        update t_user set `name` = #{name}, `password` = #{password} where id = #{id}
    	update>
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    插入记录并返回主键

    insert标签配置insert的sql语句:id配置唯一标识;

    • parameterType配置方法的参数 类型(它是可选的,一般情况下,一个参数,且是JavaBean的时候。建议写上,提高可写性)
    • useGeneratedKeys=“true”: 开启获取自增主键的策略
    • keyColumn: 指定数据库主键的列名
    • keyProperty: 指定对应的主键属性, ps(获取到主键值后, 将这个值封装给javaBean的哪个属性)
    
    <insert id="addUser" parameterType="com.jun.pojo.User" useGeneratedKeys="true" keyProperty="id">
            insert into t_user(name,password) values (#{name},#{password})
    insert>
    
    • 1
    • 2
    • 3
    • 4

    扩展:

    • selectKey: 配置查询主键的sql语句
    • keyProperty:查出的主键值封装给javaBean的哪个属性
    • order:
    • BEFORE:当前sql在插入sql之前运行;AFTER:当前sql在插入sql之后运行
    扩展二:
    <insert id="addUser" parameterType="com.jun.pojo.User">
        
        <selectKey keyProperty="id" resultType="Integer" order="AFTER">
        	select LAST_INSERT_ID()
        selectKey>
        insert into t_user()values()
    insert>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • MyBatis默认不是自动提交事务的,所以在insert、update、delete后要手工提交事务。
    public void test5() {
       
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setName("root");
        user.setPassword("huawei");
        int count =
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    记录一次htonl和ntohl的使用方法和差别
    解决Hadoop集群hdfs无法启动DataNode的问题
    Servlet规范之Web应用
    centos8安装rabbitmq(rpm包)
    CUDA学习笔记3——图像卷积实现
    设备监理师证书含金量怎样?值得考吗?
    命令行下使用百度网盘(bypy)
    Spring Boot发送邮件
    最新接口自动化面试题
    git_note
  • 原文地址:https://blog.csdn.net/qq_48687155/article/details/126880788