MyBatis 入门Demo
新建数据库my_db,新建表student_tb
id为主键,不自动递增。
不必插入数据。
下载MyBatis
https://github.com/mybatis/mybatis-3/releases
解压。
新建Java项目,什么都不用勾选(如果要在IDEA中操作数据库,可勾选SQL Support)。
勾选后,IDEA右侧会有一个Database的工具,可在IDEA中直接操作数据库。
导入mybatis所有的jar包、数据库驱动
mybatis.jar是必需的。
lib是mybatis依赖的第三方jar包,根据需要选择,嫌麻烦或者小白,可全部导入lib中的jar。
pdf是mybatis的文档。
设置MyBatis的日志
在src下新建文件 log4j.properties ,内容如下:
# Global logging configuration log4j.rootLogger=DEBUG, stdout,D # MyBatis logging configuration... log4j.logger.org.mybatis.example.BlogMapper=TRACE # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout # log4j.appender.stdout.Threshold = ERROR log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n # File output... log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = D:/log.txt log4j.appender.D.Append = true log4j.appender.D.Threshold = ERROR log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n log4j.appender.D.encoding=UTF-8
可到 mybatis.pdf 8.1.1.2小节复制来修改。
这个配置会在控制台输出DEBUG级的日志,我们可以看到程序的执行过程,如果觉得打印的东西太多看着烦,可以把红色部分的#去掉,这样只打印错误信息。
log4j的配置可参考:
https://www.cnblogs.com/chy18883701161/p/12117192.html
src下新建包com.chy.pojo,包下新建POJO类Student:
package com.chy.pojo; public class Student { private Integer id; private String name; private Integer age; private Integer score; 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; } public Integer getScore() { return score; } public void setScore(Integer score) { this.score = score; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", score=" + score + '}'; } }
src下新建包com.chy.mapper,mapper下创建实体-数据表的映射文件 StudentMapper.xml:
<?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.chy.mapper.StudentMapper"> <insert id="insertStudent" parameterType="com.chy.pojo.Student"> INSERT INTO student_tb(id,name,age,score)VALUES (#{id},#{name},#{age},#{score}) </insert> <select id="queryById" parameterType="Integer" resultType="com.chy.pojo.Student"> SELECT * FROM student_tb WHERE id=#{id} </select> <update id="updateStudent" parameterType="com.chy.pojo.Student"> UPDATE student_tb SET name=#{name},age=#{age},score=#{score} WHERE id=#{id} </update> <delete id="deleteStudent" parameterType="Integer"> DELETE FROM student_tb WHERE id=#{id} </delete> </mapper>
可以到mybatis.pdf 2.1.5小节复制来修改。
我们把映射文件都放在mapper包下,映射文件常以 实体类名+Mapper 命名。
<mapper>的namespace常设置为 包名.映射文件名。
通过namepace和id调用相应的sql语句,这两者组合起来要唯一。
parameterType指定参数类型,resultType指定要把查询结果映射到哪种数据类型。如果数据类型是pojo类,尽量写全限定类名,这样Ctrl+B可以转到定义处。
映射文件的写法可参考:
https://www.cnblogs.com/chy18883701161/p/12122079.html
src下新建数据库配置文件mysql.properties:
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/my_db?serverTimezone=GMT username=chy password=abcd
对应信息要换为自己的。
src下新建mybatis的核心(全局)配置文件mybatis-config.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> <!--指定数据库配置文件的位置--> <properties resource="mysql.properties"></properties> <!--指定日志实现使用的是log4j--> <settings> <setting name="logImpl" value="LOG4J"/> </settings> <!--指定实体类--> <typeAliases> <typeAlias type="com.chy.pojo.Student" alias="Student"/> </typeAliases> <!--指定数据库配置文件中的变量名--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!--指定映射文件的位置--> <mappers> <mapper resource="com/chy/mapper/StudentMapper.xml"/> </mappers> <!-- Continue going here --> </configuration>
可到mybatis.pdf 2.1.2小节复制来改。
<configuration>的子元素是有一定顺序的,顺序不对会报红。
mybatis全局配置文件的写法可参考:
https://www.cnblogs.com/chy18883701161/p/12120023.html
src下新建包com.chy.test,包下新建测试类Test:
package com.chy.test; import com.chy.pojo.Student; 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 Test { public static void main(String[] args) throws IOException { //加载mybatis的全局配置文件 String resources="mybatis-config.xml"; Reader reader = Resources.getResourceAsReader(resources); //根据配置文件构建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); //通过SqlSessionFactory创建SqlSession SqlSession sqlSession=sqlSessionFactory.openSession(); //增 Student student = new Student(); student.setId(1); student.setName("chy"); //第一个参数对应映射文件中的namespace+id,通过namespace+id调用相应的sql语句,第二个参数是传给sql语句的参数 sqlSession.insert("com.chy.mapper.StudentMapper.insertStudent", student); //修改数据库(增、删、改)后,需要commit()提交给数据库,才会同步本次会话做的修改。只有查询的,可以不commit()。 sqlSession.commit(); //关闭会话 sqlSession.close(); } }
//改 Student student = new Student(); student.setId(1); student.setName("chenghongyong"); sqlSession.update("updateStudent", student);
//查 Student student=sqlSession.selectOne("queryById", 1); System.out.println(student);
如果本次session期间,只有查询,可以不用commit()。
//删 sqlSession.delete("deleteStudent", 1);
可参考:https://www.cnblogs.com/chy18883701161/p/12150758.html
说明
(1)版本声明部分,最好不要复制其他人的,如果你和ta用的mybatis库版本不同,会出错。最好到mybatis.pdf中去复制。
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
(2)配置文件的文件名问题
log4j.properties这个文件名是约定的,不能自己取。
映射文件、数据库配置文件需要在mybatis全局配置文件中指定,它们的文件名可以自己取。
mybatis全局配置文件要在程序中指定,文件名可以自己取。
(3)配置文件的位置问题
配置文件必须放在资源根目录下。常见的做法有2种:
- 在项目的根目录下新建文件夹resource,右键标识为资源根目录
注意是Resource Root,不是Source Root。
在里面放配置文件:
- 也可以像demo中一样放置在src下,因为src就是默认的资源根目录。
mapper中的映射文件放哪儿都行,只要路径配置对得上就ok。
log4j.properties必须直接放在资源根目录下(不能放在子文件夹里)。