MyBatis入门
一、下载地址
GitHub:
https://github.com/mybatis/mybatis-3/releases
Maven: <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency>
二、入门级别程序案例
1、创建Java工程,导入mybatis基本jar包与数据库驱动
asm-7.1.jar
cglib-3.3.0.jar
commons-logging-1.2.jar
javassist-3.27.0-GA.jar
log4j-1.2.17.jar
log4j-api-2.13.3.jar
log4j-core-2.13.3.jar
mybatis-3.5.5.jar
mysql-connector-java-8.0.16.jar
ognl-3.2.14.jar
slf4j-api-1.7.30.jar
slf4j-log4j12-1.7.30.jar
2、src下创建sqlMapConfig.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" > <configuration> <!-- 和spring整合后 environments配置将废除 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理 --> <transactionManager type="JDBC" /> <!-- 数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/dbname?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=UTC" /> <property name="username" value="root" /> <property name="password" value="1234" /> </dataSource> </environment> </environments> <!-- 引入实体对应的映射文件 --> <mappers> <mapper resource="entity/User.xml"/> </mappers> </configuration>
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
数据表
对应的实体类
package entity; import java.util.Date; //mybatis使用得POJO实体类 public class User { private Integer id; private String username; private Date birthday; private String sex; private String Address; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return Address; } public void setAddress(String address) { Address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", Address=" + Address + "]"; } }
Mabatis与实体类对应的配置文件
<?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="test"> <select id="queryUserById" parameterType="int" resultType="entity.User"> select * from user where id=#{id} </select> <select id="userList" parameterType="string" resultType="entity.User"> select * from user where username like'%${value}%' </select> <insert id="addUser" parameterType="entity.User"> <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="entity.User"> update user set username=#{username} where id=#{id} </update> <delete id="rmUser" parameterType="int"> delete from user where id=#{id} </delete> </mapper>
junit测试类
import static org.junit.Assert.*; import java.io.InputStream; import java.util.Date; import java.util.List; 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 org.junit.Test; import entity.User; public class MytaitsTest { //查询单个结果 @Test public void fun1() throws Exception { //读取配置文件 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //构建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //开启session SqlSession session = sqlSessionFactory.openSession(); User user = session.selectOne("test.queryUserById", 10); System.out.println(user); //关闭session session.close(); } //查询多个结果 @Test public void fun2() throws Exception { //读取配置文件 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //构建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //开启session SqlSession session = sqlSessionFactory.openSession(); List<User> list = session.selectList("test.userList", "王"); for (User user : list) { System.out.println(user); } //关闭session session.close(); } //插入数据 @Test public void fun3() throws Exception { //读取配置文件 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //构建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //开启session SqlSession session = sqlSessionFactory.openSession(); User user = new User(); user.setUsername("张三"); user.setBirthday(new Date()); user.setAddress("北京"); user.setSex("男"); int num = session.insert("test.addUser", user); if(num==1) { System.out.println("成功添加数据"); System.out.println("新插入资料的ID:"+user.getId()); } //如果不提交事务,则不会添加进数据库 session.commit(); //关闭session session.close(); } //修改资料 @Test public void fun4() throws Exception { //读取配置文件 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //构建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //开启session SqlSession session = sqlSessionFactory.openSession(); User user = new User(); user.setUsername("张1"); user.setId(29); int num = session.update("test.updateUser", user); if(num==1) { System.out.println("修改成功"); } //如果不提交事务,则不会添加进数据库 session.commit(); //关闭session session.close(); } //删除用户 @Test public void fun5() throws Exception { //读取配置文件 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //构建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //开启session SqlSession session = sqlSessionFactory.openSession(); int num = session.delete("test.rmUser", 25); if(num==1) { System.out.println("删除成功"); } //如果不提交事务,则不会添加进数据库 session.commit(); //关闭session session.close(); } }
说明
一、流程
1、Mybatis核心sqlMapConfig.xml配置文件的配置
2、实体类的Mapper 及上面User.xml的创建
3、在sqlMapConfig引入POJO类对应的XML映射文件
核心基础代码
参数说明:
param1:配置文件中的 namespace.id
param2:sql语句需要的参数
//读取配置文件 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //构建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //开启session SqlSession session = sqlSessionFactory.openSession(); //此处操作DB //session.selectOne("test.queryUserById", 10); //session.selectList("test.userList", "王"); //session.insert("test.addUser", user); //session.update("test.updateUser", user); //session.delete("test.rmUser", 25); //如果不提交事务,则不会添加进数据库 session.commit(); //关闭session session.close();
使用Mapper动态代理的方式
Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),
由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
Mapper接口开发需要遵循以下规范:4个相同
1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
UserMapper.xml
补充说明: #{}为插值表达式,${}为字符串拼接
不同版本的Insert返回的ID有区别,有的是设置 keyColumn=”id‘’ 有的是设置resultType="int"
<?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"> <!-- namespace要与接口的全路径相同 --> <mapper namespace="mapper.UserMapper"> <select id="findUserById" parameterType="int" resultType="entity.User"> select * from user where id=#{id} </select> <select id="findUserByStr" parameterType="string" resultType="entity.User"> select * from user where username like "%"#{str}"%" </select> <insert id="addUser" parameterType="entity.User"> <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="entity.User"> update user set username=#{username},address=#{address},sex=#{sex} where id=#{id} </update> <delete id="rmUser" parameterType="int" > delete from user where id=#{id} </delete> </mapper>
UserMapper.java
package mapper; import java.util.List; import entity.User; public interface UserMapper { /** *根据id获取单个用户 * @param id * @return */ public User findUserById(int id); /** * @param str 模糊查询,输入需要查询的字符 * @return 返回查询的user集合 */ public List<User> findUserByStr(String str); /** * 会将加入的主键返回赋值给User对象 * @param user 添加用户对象 * @return 返回添加笔数 */ public int addUser(User user); /** * @param user 更新的User对象 * @return 返回更新的笔数 */ public int updateUser(User user); /** * 根据id删除用户 * @param id * @return 删除笔数 */ public int rmUser(int id); }
测试类
package mapperTest; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; 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 org.junit.Before; import org.junit.Test; import entity.User; import mapper.UserMapper; public class MapperTest { SqlSessionFactory sqlSessionFactory=null; //在测试前的准备项,初始化sqlSessionFactory @Before public void setMybatis() throws IOException { //获取配置文件 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //建立sessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); } //测试查询一个 @Test public void func1() { //打开session SqlSession sqlSession = this.sqlSessionFactory.openSession(); //让mabatis为我们创建接口的代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //执行查询方法 方法名就是配置文件中的id User user = mapper.findUserById(28); System.out.println(user); sqlSession.close(); } /** * 测试模糊查询多个用户 */ @Test public void func2() { //打开session SqlSession sqlSession = this.sqlSessionFactory.openSession(); //让mabatis为我们创建接口的代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //执行查询方法 方法名就是配置文件中的id List<User> list = mapper.findUserByStr("王"); for (User user : list) { System.out.println(user); } sqlSession.close(); } /** * 测试插入资料 */ @Test public void func3() { //打开session SqlSession sqlSession = this.sqlSessionFactory.openSession(); //让mabatis为我们创建接口的代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //执行查询方法 方法名就是配置文件中的id User user = new User(); user.setUsername("李四"); user.setAddress("上海"); user.setBirthday(new Date()); user.setSex("男"); int num = mapper.addUser(user); System.out.println("成功插入:"+num+"笔资料:------------"); System.out.println("新插入的用户的主键ID是:"+user.getId()); //必须提交事务 sqlSession.commit(); sqlSession.close(); } /** * 测试更新资料 */ @Test public void func4() { //打开session SqlSession sqlSession = this.sqlSessionFactory.openSession(); //让mabatis为我们创建接口的代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //执行查询方法 方法名就是配置文件中的id User user = new User(); user.setUsername("王五"); user.setAddress("北京"); user.setId(32); user.setSex("男"); int num = mapper.updateUser(user); System.out.println("成功更新一笔资料:"+num+"笔资料:------------"); //必须提交事务 sqlSession.commit(); sqlSession.close(); } /** * 测试更新资料 */ @Test public void func5() { //打开session SqlSession sqlSession = this.sqlSessionFactory.openSession(); //让mabatis为我们创建接口的代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); int rmNum = mapper.rmUser(16); System.out.println("删除了:"+rmNum+" 笔资料"); //必须提交事务 sqlSession.commit(); sqlSession.close(); } }
核心代码
SqlSessionFactory sqlSessionFactory=null; //在测试前的准备项,初始化sqlSessionFactory @Before public void setMybatis() throws IOException { //获取配置文件 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //建立sessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); } //打开session SqlSession sqlSession = this.sqlSessionFactory.openSession(); //让mabatis为我们创建接口的代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //执行查询方法 方法名就是配置文件中的id User user = mapper.findUserById(28); List<User> list = mapper.findUserByStr("王"); int num = mapper.addUser(user); int num = mapper.updateUser(user); int rmNum = mapper.rmUser(16); //必须提交事务 sqlSession.commit(); sqlSession.close();
sqlMapConfig.xml配置说明
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
在sqlMapConfig.xml中使用 properties 文件
<?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> <!-- 是用resource属性加载外部配置文件 --> <properties resource="db.properties"> <!-- 在properties内部用property定义属性 --> <!-- 如果外部配置文件有该属性,则内部定义属性被外部属性覆盖 --> <property name="jdbc.username" value="root123" /> <property name="jdbc.password" value="root123" /> </properties> <!-- 和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> <mapper resource="sqlmap/User.xml" /> <mapper resource="mapper/UserMapper.xml" /> </mappers> </configuration>
MyBatis 将按照下面的顺序来加载属性:
在 properties 元素体内定义的属性首先被读取。
然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。
别名
mybatis支持别名:
别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
map Map
自定义类别名
<typeAliases> <!-- 单个别名定义 --> <typeAlias alias="user" type="cn.itcast.mybatis.pojo.User" /> <!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) --> <package name="cn.itcast.mybatis.pojo" /> <package name="其它包" /> </typeAliases>
mappers映射器
使用相对于类路径的资源(现在的使用方式) 如:<mapper resource="sqlmap/User.xml" /><mapper class=" " /> 使用mapper接口类路径 如:<mapper class="cn.itcast.mybatis.mapper.UserMapper"/> 注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。 <package name=""/> 注册指定包下的所有mapper接口 如:<package name="cn.itcast.mybatis.mapper"/> 注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。