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>