MyBatis入门

MyBatis入门

maven依赖

  • junit 4.11 测试用
  • mysql-connector-java 5.1.17 连接mysql
  • mybatis 3.2.7 框架
  • log4j 1.2.17 日志记录
<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.17</version>
    </dependency>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.2.7</version>
    </dependency>

    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
  </dependencies>

依赖相关的配置

log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

mybatis 核心配置

<?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>

	<!-- 先加载内部标签,再加载外部文件,名称一致时,会替换内容 -->
	<properties resource="jdbc.properties">
		<property name="jdbc.username" value="root1"/>
		<property name="jdbc.password" value="root"/>
	</properties>
	
	<typeAliases>
		<!-- 单个别名定义,别名的使用,不区分大小写 -->
		<!-- <typeAlias type="com.itheima.mybatis.pojo.User" alias="user"/> -->
		<!-- 别名包扫描器:别名是类的全称,不区分大小写,推荐方式 -->
		<package name="com.itheima.mybatis.pojo"/>
	</typeAliases>
	
	<!-- 和spring整合后 environments配置将废除 -->
	<environments default="development">
		<environment id="development">
			<!-- 使用jdbc事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 加载映射文件 -->
	<mappers>
		
		<!-- 映射文件包扫描,推荐方式:
			 1、接口文件必须与映射文件同一目录下
			 2、接口文件名称必须与映射文件的名称一致 -->
		<package name="com.itheima.mybatis.mapper"/>
	</mappers>
</configuration>

user.xml映射查询xml

首先创建好User的pojo类(domain/bean)

<?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="user">
    <!--
        id是之后java中唯一标识
        parameterType:之后调用要传回的参数类型
        resultType:返回的结果类型(如果是list也是用list中每个单一的元素

        变量的使用: #{id}  如果参数类型是普通值,大括号中的变量名可以任意命名
                    '${value}' 如果参数是String,则一定要用${value},用单引号'',前后可自由增加字符串如'%${value}%'
                    
        关于在插入数据中,将自动生成的主键返回给对象的用法
        1. <insert (省略id/parameterType) useGeneratedKeys="true" keyProperty="id">          
        2. 增加以下语块,赋值是调用mysql中的函数LAST_INSERT_ID(),order表示执行顺序,after为在插入执行完之后再操作,如果是主动设置UUID,则要改为before
            <selectKey keyProperty="id" resultType="int" order="AFTER">
                SELECT LAST_INSERT_ID()
            </selectKey>
    -->
    <select id="getUserById" parameterType="int" resultType="cn.edu.zju.mybaits.pojo.User">
        SELECT 	`id`,
                `username`,
                `birthday`,
                `sex`,
                `address`
        FROM
                `user`
        WHERE   id = #{id}
    </select>

    <select id="getUserByUserName" parameterType="string" resultType="cn.edu.zju.mybaits.pojo.User">
        SELECT 	`id`,
                  `username`,
                  `birthday`,
                  `sex`,
                  `address`

        FROM `user`
        WHERE username LIKE '%${value}%'
    </select>

    <!--插入用户-->
    <insert id="insertUser" parameterType="cn.edu.zju.mybaits.pojo.User" useGeneratedKeys="true" keyProperty="id">
        <!--<selectKey keyProperty="id" resultType="int" order="AFTER">-->
            <!--SELECT LAST_INSERT_ID()-->
        <!--</selectKey>-->
        INSERT INTO `user`
                (`username`,
                 `birthday`,
                 `sex`,
                 `address`
                )
        VALUES
                (#{username},
                 #{birthday},
                 #{sex},
                 #{address}
                );
    </insert>

    <update id="updateUser" parameterType="cn.edu.zju.mybaits.pojo.User">
        UPDATE
            `user`
        SET
            `username` = #{username}
            WHERE `id` = #{id}
    </update>

    <delete id="deleteUser" parameterType="int">
        DELETE FROM `user`
        WHERE
            `id` = #{Id} ;
    </delete>
</mapper>

java类

工具类 SqlSessionFactoryUtils

//不把SqlSession放进来是因为官方推荐SqlSession单独线程
public class SqlSessionFactoryUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            //创建SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            //创建核心配置文件的输入流
            InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
            //通过输入流创建SqlSessionFactory对象
            sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory getSqlSessionFactory() {
        //sqlSessionFactory单例
        return sqlSessionFactory;
    }
}

增删改查代码

public class UserDaoImpl implements UserDao {
  @Override
  public User getUserById(Integer id) {
    SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
    User user = sqlSession.selectOne("user.getUserById", id);
    sqlSession.close();
    return user;
  }

  @Override
  public List<User> getUserByUserName(String userName) {
    SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
    List<User> list = sqlSession.selectList("user.getUserByUserName", userName);
    sqlSession.close();
    return list;
  }

  @Override
  public void insertUser(User user) {
    /*
     * SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession()
     * openSession()里面没写true,则最后要提交事件    sqlSession.commit()
     */
    SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
    sqlSession.insert("user.insertUser", user);
    sqlSession.close();
  }
}
原文地址:https://www.cnblogs.com/richardwlee/p/10455748.html