MyBatis笔记(一) 最简单的select
小白学习MyBatis的第一天,学习资料包括MyBatis3的官方文档,以及孤傲苍狼大佬的博客。这里先致敬大佬。
· 首先,什么是MyBatis?
引用官网的一段话,“MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。”
MyBatis的一个强大之处在于,“避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集”。举个栗子,传统的JDBC在拼接SQL语句的过程中,经常会出现少加空格、多个逗号、多个AND/OR之类的错误,不胜其烦;MyBatis的动态SQL中的<if>,<choose>,<where>等语法很好的解决了这一问题。这段在后面动态SQL部分细说。
好了,闲话少说,进入正题。
· 建立Java项目,导入Jar包
首先展示一下工程目录。在classpath目录下,建立一个lib文件夹,导入以下三个jar包。
mybatis-3.4.6.jar即是MyBatis的jar包,要使用MyBatis, 只需将mybatis-x.x.x.jar文件置于 classpath 中即可;
mysql-connector-java即数据库驱动;
log4j用于显示日志,可以在调试过程中打印出SQL语句,便于学习。
【挖个坑:log4j的jar包和log4j.properties共同用于输出日志,至于原理……我也没搞懂】
——————————————————————————————————————————————————————————
数据库方面,建立一张user表,插入张三和李四两个用户。
· 先实现一个最简单的查询
先看一眼工程目录,建立如下的文件:
目前src下需要bean,dao,config和util四个包,分别存放JavaBean,配置文件,客户端代码(使用MyBatis执行各种操作),以及工具类(封装了获取SqlSession的方法)。
首先在src下的config文件下,写一个总的配置文件MyBatisConfiguration.xml。
<?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="UNPOOLED"> <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="Danny2036"/> </dataSource> </environment> </environments> </configuration>
这里先只需要环境配置,即environments中的driver,url,username和password四项。
driver为驱动,在mysql-connector-java 5中,值为"com.mysql.jdbc.Driver"; mysql-connector-java 6中,值为"com.mysql.cj.jdbc.Driver"。其他项包括url,username,password,根据自己的数据库进行配置。
在bean目录下建立JavaBean。(这里先不要管那个UID)
package com.alleymeowy.bean; import java.io.Serializable; public class User implements Serializable { private static final long serialVersionUID = 3305858088000394142L; private Integer id; private String name; private Integer age; // 快速生成构造函数 toString方法 以及get&set方法的快捷键 alt+insert public User() { } public User(String name, Integer age) { this.name = name; this.age = age; } public User(Integer id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age='" + age + '\'' + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getage() { return age; } public void setage(Integer age) { this.age = age; } }
在util包里添加一个获取SqlSession的方法。
package com.alleymeowy.util; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.Reader; public class DBUtil { public static SqlSession getSqlSession() throws IOException { // 1.reader Reader reader = Resources.getResourceAsReader("com/alleymeowy/config/MyBatisConfiguration.xml"); // 2.SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 3.SqlSession return sqlSessionFactory.openSession(); } }
在config包下建一个sql包,添加Users.xml文件,实现selectOne和selectAll方法。
<?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.alleymeowy.config.sql.Users"> <select id="selectOne" parameterType="int" resultType="com.alleymeowy.bean.User"> select id, name, age from user where id = #{id} </select> <select id="selectAll" resultType="com.alleymeowy.bean.User"> select id, name, age from user </select> </mapper>
【注意:这里需要在总配置文件里加上mappers的声明,放在<environments>标签之后。总配置文件的标签需要按顺序摆放,详见官方文档。】
<mappers> <mapper resource="com/alleymeowy/config/sql/Users.xml"/> <!--<mapper class="com.alleymeowy.annotation.UserMapper"/>--> <!--<mapper class="com.alleymeowy.mapper.BlogMapper"/>--> </mappers>
在dao包里写一个实现类。先实现一个最简单的selectOne和selectAll方法。
package com.alleymeowy.dao; import com.alleymeowy.bean.User; import com.alleymeowy.util.DBUtil; import org.apache.ibatis.session.SqlSession; import java.io.IOException; import java.util.List; public class UserDAO { /** * 根据id查询一条记录 * @param id * @throws IOException */ public static User selectOne(int id) throws IOException { SqlSession sqlSession = null; User user; try { sqlSession = DBUtil.getSqlSession(); user = sqlSession.selectOne("com.alleymeowy.config.sql.Users.selectOne", id); } finally { sqlSession.close(); } return user; } /** * 查询多条记录 * @throws IOException */ public static List<User> selectAll() throws IOException { SqlSession sqlSession = null; List<User> users; try { sqlSession = DBUtil.getSqlSession(); users = sqlSession.selectList("com.alleymeowy.config.sql.Users.selectAll"); } finally { sqlSession.close(); } return users; } public static void main(String[] args) throws IOException { System.out.println(selectOne(1)); System.out.println("************"); System.out.println(selectAll()); } }
最后给出查询结果(只给出查询结果,不显示日志等)
User{id=1, name='Zhang3', age='10'} ************[User{id=1, name='Zhang3', age='10'}, User{id=2, name='Li4', age='20'}, User{id=3, name='erha', age='10'}, User{id=4, name='NotUser', age='21'}, User{id=5, name='NotUser2', age='22'}] Process finished with exit code 0
完毕。