MyBatis 学习笔记

一、MyBatis Hello World

1. 添加 jar 包:mybatis-x.x.x.jar(如 mybatis-3.4.4.jar)。

2. 建数据表:

CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT);
INSERT INTO users(NAME, age) VALUES('Tom', 12);
INSERT INTO users(NAME, age) VALUES('Jack', 11);

 

3. 定义表所对应的实体类。

public class User {
  private int id;
  private String name;
  private int age;
  //get,set方法
}

 

4. 添加 Mybatis 的配置文件 conf.xml。

建议使用类路径下的资源文件进行配置。但是也可以使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者 file:// 的 URL 形式的文件路径来配置。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,可使从 classpath 或其他位置加载资源文件更加容易(参考第7步中的代码)。

<?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>
  <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" />
        <property name="username" value="root" />
        <property name="password" value="root" />
      </dataSource>
    </environment>
  </environments>
</configuration>

 

5. 定义操作 users 表的 sql 映射文件 userMapper.xml。

MyBatis 的 SQL 映射文件应该与其所映射的实体类在同一个包下。例如 userMapper.xml 应该在类 User 所在的包中。

<?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="com.ldj.mybatis_test.test1.userMapper"> 
  <select id="getUser" parameterType="int" resultType="com.ldj.mybatis_test.test1.User">
    select * from users where id=#{id}
  </select>
</mapper>

 

MyBatis 是针对 SQL 构建的,真正强大在于它的映射语句。SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):

    cache – 给定命名空间的缓存配置。

    cache-ref – 其他命名空间缓存配置的引用。

    resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。

    parameterMap – 已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除。

    sql – 可被其他语句引用的可重用语句块。

    insert – 映射插入语句。

    update – 映射更新语句。

    delete – 映射删除语句。

    select – 映射查询语句。

6. 在 conf.xml 文件中注册 userMapper.xml 文件。

<mappers>
    <mapper resource="com/ldj/mybatis_test/test1/userMapper.xml"/>
</mappers>

 

7. 编写测试代码:执行定义的 select 语句。

public class Test {
  public static void main(String[] args) throws IOException {
    String resource = "conf.xml"; 
    //加载mybatis的配置文件(它也加载关联的映射文件)
    Reader reader = Resources.getResourceAsReader(resource); 
    //构建sqlSession的工厂
    SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
    //创建能执行映射文件中sql的sqlSession
    SqlSession session = sessionFactory.openSession();
    //映射sql的标识字符串
    String statement = "com.ldj.mybatis.bean.userMapper"+".selectUser";
    //执行查询返回一个唯一user对象的sql
    User user = session.selectOne(statement, 1);
    System.out.println(user);
  }
}

 

二、MyBatis 的 CRUD

2.1 XML 的实现方式

(1)定义sql映射xml文件:

<insert id="insertUser" parameterType="com.ldj.mybatis_test.test2.bean.User">
  insert into users(name, age) values(#{name}, #{age});
</insert><delete id="deleteUser" parameterType="int">
  delete from users where id=#{id}
</delete>

<update id="updateUser" parameterType="com.ldj.mybatis_test.test2.bean.User">
  update users set name=#{name},age=#{age} where id=#{id}
</update>

<select id="selectUser" parameterType="int" resultType="com.ldj.mybatis_test.test2.bean.User">
  select * from users where id=#{id}
</select>

<select id="selectAllUsers" resultType="com.ldj.mybatis_test.test2.bean.User">
  select * from users
</select>

 

 (2)在config.xml中注册这个映射文件:

<mapper resource="com/ldj/mybatis_test/test2/bean/userMapper.xml"/>

 

(3)在 DAO 中调用:

public User getUserById(int id) {
  SqlSession session = sessionFactory.openSession();
  User user = session.selectOne(URI+".selectUser", id);
  return user;
}

 

2.2 注解的实现方式
(1)定义sql映射的接口

public interface UserMapper {
  @Insert("insert into users(name, age) values(#{name}, #{age})")
  public int insertUser(User user);
​​
  @Delete("delete from users where id=#{id}")
  public int deleteUserById(int id);

  @Update("update users set name=#{name},age=#{age} where id=#{id}")
  public int updateUser(User user);
​​
  @Select("select * from users where id=#{id}")
  public User getUserById(int id);
​​
  @Select("select * from users")
  public List<User> getAllUser();
}

 

(2)在config中注册这个映射接口

<mapper class="com.ldj.mybatis_test.test2.crud.ano.UserMapper"/>

 

(3)在dao类中调用

public User getUserById(int id) {
  SqlSession session = sessionFactory.openSession();
  UserMapper mapper = session.getMapper(UserMapper.class);
  User user = mapper.getUserById(id);
  return user;
}

 

 三、几个可以优化的地方

4.1. 连接数据库的配置单独放在一个properties文件中

## db.properties

<properties resource="db.properties"/>
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />

 

4.2. 为实体类定义别名,简化sql映射xml文件中的引用

<typeAliases>
  <typeAlias type="com.atguigu.ibatis.bean.User" alias="_User"/>
</typeAliases>

 

4.3. 可以在src下加入log4j的配置文件,打印日志信息

1. 添加jar:log4j-1.2.16.jar。

2.1. log4j.properties(方式一)

log4j.properties,
log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

 

2.2. log4j.xml(方式二)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" />
    </layout>
  </appender>
  <logger name="java.sql">
    <level value="debug" />
  </logger>
  <logger name="org.apache.ibatis">
    <level value="debug" />
  </logger>
  <root>
    <level value="debug" />
    <appender-ref ref="STDOUT" />
  </root>
</log4j:configuration>

 

posted @ 2020-09-24 22:25  少司命  阅读(186)  评论(0编辑  收藏  举报