mybatis笔记
1.mybatis的第一个helloworld
1建数据表
使用mysql数据库
DROP TABLE IF EXISTS `tbl_employee`; CREATE TABLE `tbl_employee` ( `id` int(11) NOT NULL AUTO_INCREMENT, `last_name` varchar(255) DEFAULT NULL, `gender` char(1) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of tbl_employee -- ---------------------------- INSERT INTO `tbl_employee` VALUES ('1', 'sujinran', '女', '[email protected]');
2导maven依赖包
在pom.xml中导入mybatis需要的依赖包
<!--mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.41</version> </dependency> <!--日志--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
mybatis的映射文件找不到解决方法如下:
<resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins>
3javaBean类
com.demo.bean.Employee 实体类
package com.demo.bean; public class Employee { private Integer id; //编号 private String lastName; //姓名 private String email; //邮箱 private String gender; //性别 public Employee(Integer id, String lastName, String email, String gender) { this. id = id; this. lastName = lastName; this. email = email; this. gender = gender; } public Employee() { } public Integer getId() { return id; } public void setId(Integer id) { this. id = id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this. lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this. email = email; } public String getGender() { return gender; } public void setGender(String gender) { this. gender = gender; } @Override public String toString() { return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]"; } }
4mybatis 配置文件
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> <!-- 1、 mybatis可以使用properties来引入外部properties配置文件的内容; resource:引入类路径下的资源 url:引入网络路径或者磁盘路径下的资源 --> <properties resource="dbconfig.properties"></properties> <!-- 2、 settings包含很多重要的设置项 setting:用来设置每一个设置项 name:设置项名 value:设置项取值 --> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!-- 3、 typeAliases:别名处理器:可以为我们的java类型起别名 别名不区分大小写 --> <typeAliases> <!-- 1、 typeAlias:为某个java类型起别名 type:指定要起别名的类型全类名;默认别名就是类名小写; employee alias:指定新的别名 --> <!-- <typeAlias type="com.atguigu.mybatis.bean.Employee" alias="emp"/> --> <!-- 2、 package:为某个包下的所有类批量起别名 name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名 (类名小写),) --> <package name="com.demo.bean"/> <!-- 3、批量起别名的情况下,使用@Alias注解为某个类型指定新的别名 --> </typeAliases> <!-- 4、 environments:环境们, mybatis可以配置多种环境 ,default指定使用某种环境。可以 达到快速切换环境。 environment:配置一个具体的环境信息;必须有两个标签; id代表当前环境的唯一标识 transactionManager:事务管理器; type:事务管理器的类 型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory) 自定义事务管理器:实现TransactionFactory接口.type指定为全类名 dataSource:数据源; type:数据源类型;UNPOOLED(UnpooledDataSourceFactory) |POOLED(PooledDataSourceFactory) |JNDI(JndiDataSourceFactory) 自定义数据源:实现DataSourceFactory接口, type是全类名 --> <environments default="dev_mysql"> <environment id="dev_mysql"> <transactionManager type="JDBC"></transactionManager> <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> <!-- 5、 databaseIdProvider:支持多数据库厂商的; type="DB_VENDOR": VendorDatabaseIdProvider 作用就是得到数据库厂商的标识(驱动getDatabaseProductName()), mybatis就能根据 数据库厂商标识来执行不同的sql; MySQL, Oracle, SQL Server,xxxx --> <databaseIdProvider type="DB_VENDOR"> <!-- 为不同的数据库厂商起别名 --> <property name="MySQL" value="mysql"/> </databaseIdProvider> <!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatisconfig.xml)中 --> <!-- 6、 mappers:将sql映射注册到全局配置中 --> <mappers> <!-- mapper:注册一个sql映射 注册配置文件 resource:引用类路径下的sql映射文件 mybatis/mapper/EmployeeMapper.xml url:引用网路路径或者磁盘路径下的sql映射文件 file:///var/mappers/AuthorMapper.xml 注册接口 class:引用(注册)接口, 1、有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录 下; 2、没有sql映射文件,所有的sql都是利用注解写在接口上; 推荐: 比较重要的,复杂的Dao接口我们来写sql映射文件 不重要,简单的Dao接口为了开发快速可以使用注解; --> <!--注册xml--> <!-- <mapper resource="mybatis/mapper/EmployeeMapper.xml"/> --> <!--注册接口:必须接口和映射文件同名同包--> <!-- <mapper class="com.atguigu.mybatis.dao.EmployeeMapperAnnotation"/> --> <!-- 批量注册:必须接口和映射文件同名同包 --> <package name="com.demo.dao"/> </mappers> </configuration>
5数据库配置文件
dbconfig.propertiesjdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis jdbc.username=root jdbc.password=123456
6mapper接口及映射文件
com.demo.dao.EmployeeMapper
package com.demo.dao; import com.demo.bean.Employee; public interface EmployeeMapper { public Employee getEmpById(Integer id); //查询 public Long addEmp(Employee employee); //增加 public boolean updateEmp(Employee employee); //更新 public void deleteEmpById(Integer id); //删除 }
com/demo/dao/EmployeeMapper.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.demo.dao.EmployeeMapper"> <!-- public Employee getEmpById(Integer id); namespace:名称空间;指定为接口的全类名 id:唯一标识 resultType:返回值类型 #{id}:从传递过来的参数中取出id值 last_name lastName :起别名 --> <select id="getEmpById" resultType="com.demo.bean.Employee"> select id,last_name,email,gender from tbl_employee where id = #{id} </select> <!-- public void addEmp(Employee employee); parameterType:参数类型,可以省略, 获取自增主键的值: mysql支持自增主键,自增主键值的获取, mybatis也是利用statement.getGenreatedKeys(); useGeneratedKeys="true";使用自增主键获取主键值策略 keyProperty;指定对应的主键属性,也就是mybatis获取到主键值以后,将这个值封装给 javaBean的哪个属性 --> <insert id="addEmp" parameterType="com.demo.bean.Employee" useGeneratedKeys="true" keyProperty="id" databaseId="mysql"> insert into tbl_employee(last_name,email,gender) values(#{lastName},#{email},#{gender}) </insert> <!-- public void updateEmp(Employee employee); --> <update id="updateEmp"> update tbl_employee set last_name=#{lastName},email=#{email},gender=#{gender} where id=#{id} </update> <!-- public void deleteEmpById(Integer id); --> <delete id="deleteEmpById"> delete from tbl_employee where id=#{id} </delete> </mapper>
7测试
MyBatisTest
import com.demo.bean.Employee; import com.demo.dao.EmployeeMapper; 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 java.io.IOException; import java.io.InputStream; public class MyBatisTest { public SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); } /** * 1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行 * 环境信息 * 2、 sql映射文件;配置了每一个sql,以及sql的封装规则等。 * 3、将sql映射文件注册在全局配置文件中 * 4、写代码: * 1)、根据全局配置文件得到SqlSessionFactory; * 2)、使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查 * 一个sqlSession就是代表和数据库的一次会话,用完关闭 * 3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。 sql都是保存在sql映射文件中的。 * * @throws IOException */ //************************************************************************************ // 查询测试 //************************************************************************************ @Test public void test01() throws IOException { // 1、获取sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); // 2、获取sqlSession对象 SqlSession openSession = sqlSessionFactory.openSession(); try { // 3、获取接口的实现类对象 //会为接口自动的创建一个代理对象,代理对象去执行增删改查方法 EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); Employee employee = mapper.getEmpById(1); System.out.println(mapper.getClass()); System.out.println(employee); } finally { openSession.close(); } } /** * 测试增删改 * 1、 mybatis允许增删改直接定义以下类型返回值 * Integer、 Long、 Boolean、 void * 2、我们需要手动提交数据 * sqlSessionFactory.openSession();===》手动提交 * sqlSessionFactory.openSession(true);===》自动提交 * * @throws IOException */ //************************************************************************************ // 添加测试 //************************************************************************************ @Test public void test02() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); //1、获取到的SqlSession不会自动提交数据 SqlSession openSession = sqlSessionFactory.openSession(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); /** * 测试添加 */ Employee employee = new Employee(null, "jerry4", null, "1"); mapper.addEmp(employee); System.out.println(employee.getId()); //2、手动提交数据 openSession.commit(); } finally { openSession.close(); } } //************************************************************************************ // 修改测试 //************************************************************************************ @Test public void test03() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); //1、获取到的SqlSession不会自动提交数据 SqlSession openSession = sqlSessionFactory.openSession(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); /** * 测试修改 */ Employee employee = new Employee(1, "Tom", "[email protected]", "0"); boolean updateEmp = mapper.updateEmp(employee); System.out.println(updateEmp); //2、手动提交数据 openSession.commit(); } finally { openSession.close(); } } //************************************************************************************ // 删除测试 //************************************************************************************ @Test public void test04() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); //1、获取到的SqlSession不会自动提交数据 SqlSession openSession = sqlSessionFactory.openSession(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); /** * 测试删除 */ mapper.deleteEmpById(2); //2、手动提交数据 openSession.commit(); } finally { openSession.close(); } } }
哈哈~~~~~~~~第一个mybatis的helloworld练习结束了
2.mybatis的映射文件
mybatis操作数据库都编写在映射文件中,再对外提供映射文件的接口给服务层调用,因此映射文件非常重要
1.映射文件参数处理
1.建数据库表
使用mysql数据库
DROP TABLE IF EXISTS `tbl_employee`; CREATE TABLE `tbl_employee` ( `id` int(11) NOT NULL AUTO_INCREMENT, `last_name` varchar(255) DEFAULT NULL, `gender` char(1) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of tbl_employee -- ---------------------------- INSERT INTO `tbl_employee` VALUES ('1', 'sujinran', '女', '[email protected]');
2.导包(maven)
在pom.xml中导入mybatis需要的依赖包
<!--mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.41</version> </dependency> <!--日志--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
mybatis的映射文件找不到解决方法如下:
<resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins>
3.javabean类
com.demo.bean.Employee 实体类
package com.demo.bean; public class Employee { private Integer id; //编号 private String lastName; //姓名 private String email; //邮箱 private String gender; //性别 public Employee(Integer id, String lastName, String email, String gender) { this. id = id; this. lastName = lastName; this. email = email; this. gender = gender; } public Employee() { } public Integer getId() { return id; } public void setId(Integer id) { this. id = id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this. lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this. email = email; } public String getGender() { return gender; } public void setGender(String gender) { this. gender = gender; } @Override public String toString() { return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]"; } }
4.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> <!-- 1、 mybatis可以使用properties来引入外部properties配置文件的内容; resource:引入类路径下的资源 url:引入网络路径或者磁盘路径下的资源 --> <properties resource="dbconfig.properties"></properties> <!-- 2、 settings包含很多重要的设置项 setting:用来设置每一个设置项 name:设置项名 value:设置项取值 --> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!-- 3、 typeAliases:别名处理器:可以为我们的java类型起别名 别名不区分大小写 --> <typeAliases> <!-- 1、 typeAlias:为某个java类型起别名 type:指定要起别名的类型全类名;默认别名就是类名小写; employee alias:指定新的别名 --> <!-- <typeAlias type="com.atguigu.mybatis.bean.Employee" alias="emp"/> --> <!-- 2、 package:为某个包下的所有类批量起别名 name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名 (类名小写),) --> <package name="com.demo.bean"/> <!-- 3、批量起别名的情况下,使用@Alias注解为某个类型指定新的别名 --> </typeAliases> <!-- 4、 environments:环境们, mybatis可以配置多种环境 ,default指定使用某种环境。可以 达到快速切换环境。 environment:配置一个具体的环境信息;必须有两个标签; id代表当前环境的唯一标识 transactionManager:事务管理器; type:事务管理器的类 型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory) 自定义事务管理器:实现TransactionFactory接口.type指定为全类名 dataSource:数据源; type:数据源类型;UNPOOLED(UnpooledDataSourceFactory) |POOLED(PooledDataSourceFactory) |JNDI(JndiDataSourceFactory) 自定义数据源:实现DataSourceFactory接口, type是全类名 --> <environments default="dev_mysql"> <environment id="dev_mysql"> <transactionManager type="JDBC"></transactionManager> <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> <!-- 5、 databaseIdProvider:支持多数据库厂商的; type="DB_VENDOR": VendorDatabaseIdProvider 作用就是得到数据库厂商的标识(驱动getDatabaseProductName()), mybatis就能根据 数据库厂商标识来执行不同的sql; MySQL, Oracle, SQL Server,xxxx --> <databaseIdProvider type="DB_VENDOR"> <!-- 为不同的数据库厂商起别名 --> <property name="MySQL" value="mysql"/> </databaseIdProvider> <!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatisconfig.xml)中 --> <!-- 6、 mappers:将sql映射注册到全局配置中 --> <mappers> <!-- mapper:注册一个sql映射 注册配置文件 resource:引用类路径下的sql映射文件 mybatis/mapper/EmployeeMapper.xml url:引用网路路径或者磁盘路径下的sql映射文件 file:///var/mappers/AuthorMapper.xml 注册接口 class:引用(注册)接口, 1、有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录 下; 2、没有sql映射文件,所有的sql都是利用注解写在接口上; 推荐: 比较重要的,复杂的Dao接口我们来写sql映射文件 不重要,简单的Dao接口为了开发快速可以使用注解; --> <!--注册xml--> <!-- <mapper resource="mybatis/mapper/EmployeeMapper.xml"/> --> <!--注册接口:必须接口和映射文件同名同包--> <!-- <mapper class="com.atguigu.mybatis.dao.EmployeeMapperAnnotation"/> --> <!-- 批量注册:必须接口和映射文件同名同包 --> <package name="com.demo.dao"/> </mappers> </configuration>
5.数据库配置文件
dbconfig.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis jdbc.username=root jdbc.password=123456
6.mapper接口及映射文件
com.demo.dao.EmployeeMapper
package com.demo.dao; import com.demo.bean.Employee; import org.apache.ibatis.annotations.Param; import java.util.Map; public interface EmployeeMapper { // 查询 //单个参数处理 public Employee getEmpById(Integer id); //多个参数处理 public Employee getEmpByIdAndLastName(@Param("id") Integer id, @Param("lastName") String lastName); //如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,我们也可以传入map public Employee getEmpByMap(Map<String, Object> map); }
com/demo/dao/EmployeeMapper.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.demo.dao.EmployeeMapper"> <!-- 单个参数处理 --> <select id="getEmpById" resultType="com.demo.bean.Employee"> select id,last_name,email,gender from tbl_employee where id = #{id} </select> <!--多个参数处理--> <!-- public Employee getEmpByIdAndLastName(Integer id,String lastName);--> <select id="getEmpByIdAndLastName" resultType="com.demo.bean.Employee"> select * from tbl_employee where id = #{id} and last_name=#{lastName} </select> <!--多个参数不是业务模型中的数据,没有对应的pojo--> <!-- public Employee getEmpByMap(Map<String, Object> map); --> <select id="getEmpByMap" resultType="com.demo.bean.Employee"> select * from tbl_employee where id=#{id} and last_name=#{lastName} </select> </mapper>
7.测试
import com.demo.bean.Employee; import com.demo.dao.EmployeeMapper; 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 java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; public class MyBatisTest { public SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources. getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); } //********************************************************************************* // 单个参数处理 //********************************************************************************* @Test public void test01() throws IOException { // 1、获取sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); // 2、获取sqlSession对象 SqlSession openSession = sqlSessionFactory.openSession(); try { // 3、获取接口的实现类对象 //会为接口自动的创建一个代理对象,代理对象去执行增删改查方法 EmployeeMapper mapper = openSession.getMapper(EmployeeMapper. class); Employee employee = mapper.getEmpById(1); System. out.println(employee); } finally { openSession.close(); } } //********************************************************************************* // 多个参数处理 //********************************************************************************* @Test public void test02() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); //1、获取到的SqlSession不会自动提交数据 SqlSession openSession = sqlSessionFactory.openSession(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper. class); Employee employee = mapper.getEmpByIdAndLastName(1, "tom"); System. out.println(employee); } finally { openSession.close(); } } //********************************************************************************* // 多个参数不是业务模型中的数据,没有对应的pojo //********************************************************************************* @Test public void test03() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); //1、获取到的SqlSession不会自动提交数据 SqlSession openSession = sqlSessionFactory.openSession(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper. class); Map<String, Object> map = new HashMap<>(); map.put("id", 1); map.put("lastName", "Tom"); map.put("tableName", "tbl_employee"); Employee employee = mapper.getEmpByMap(map); System. out.println(employee); } finally { openSession.close(); } } }