MyBatis的基本用法和配置方式
demo目录
mybatis_helloworld/├── pom.xml
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── demo/
│ │ │ ├── bean/
│ │ │ │ ├── Emp.java
│ │ │ │ ├── Dog.java
│ │ │ │ └── User.java
│ │ │ └── dao/
│ │ │ └── EmpDao.java
│ │ └── resources/
│ │ ├── com/
│ │ ├── db.properties
│ │ ├── log4j.properties
│ │ └── mybatis-config.xml└── test/└── java/├── MyTest.java├── MyTest2.java└── Test.java
这是一个基于MyBatis框架的简单Java项目,主要用于演示MyBatis的基本用法,包括实体类映射、SQL操作等。项目使用Maven进行依赖管理和构建。
核心配置文件
1. pom.xml
项目的Maven配置文件,管理项目依赖:
- MyBatis 3.5.4
- MySQL Connector Java 8.0.19
- JUnit 4.13
- Log4j 1.2.17
2. mybatis-config.xml
MyBatis的核心配置文件:
- 引入外部属性文件 db.properties
- 开启驼峰命名映射
- 配置类型别名,指定实体类包路径
- 配置环境(开发环境),使用JDBC事务管理器和POOLED数据源
- 配置数据库厂商标识
- 配置Mapper接口扫描包
3. db.properties
数据库连接配置:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
username=root
password=1234
实体类设计
项目包含3个实体类,位于 bean
包下:
1. Emp.java
员工实体类,对应数据库emp表:
- empno: 员工编号
- ename: 员工姓名
- job: 职位
- mgr: 上级编号
- hiredate: 雇佣日期
- sal: 薪水
- comm: 佣金
- deptno: 部门编号
2. Dog.java
狗狗实体类:
- id: 编号
- name: 名称
- age: 年龄
- gender: 性别
3. User.java
用户实体类:
- id: 编号
- userName: 用户名
DAO层设计
数据访问层接口位于 dao
包下:
EmpDao.java
员工数据访问接口,包含员工的CRUD操作方法:
- save: 保存员工
- update: 更新员工
- delete: 删除员工
- selectEmpByEmpno: 根据编号查询员工
- selectAll: 查询所有员工
- 以及多种条件查询方法
测试类
测试类位于 test
目录下:
- MyTest.java
- MyTest2.java
- Test.java
这些测试类用于测试MyBatis的各项功能。
总结
该项目是一个基础的MyBatis示例项目,展示了MyBatis的核心功能,包括:
- 实体类与数据库表的映射
- 使用Mapper接口进行数据库操作
- 配置文件的使用
- 事务管理
- 数据源配置
通过这个项目,可以学习MyBatis的基本用法和配置方式。
用到的sql
CREATE TABLE emp (empno INT PRIMARY KEY,ename VARCHAR(255) NOT NULL,job VARCHAR(255),mgr INT,hiredate DATE,sal DOUBLE,comm DOUBLE,deptno INT
);CREATE TABLE user (id INT PRIMARY KEY,user_name VARCHAR(255) NOT NULL
);CREATE TABLE dog (id INT PRIMARY KEY,name VARCHAR(255) NOT NULL,age INT,gender VARCHAR(255)
);
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--在填写标签的时候一定要注意相关配置的顺序-->
<configuration><!--当需要引入外部的配置文件的时候,可以使用这样的方式类似于<context:property-placeholder location>resource:表示从当前项目的类路径中进行加载,如果用的是idea指的是resource资源目录下的配置文件url:可以从当前文件系统的磁盘目录查找配置,也可以从网络上的资源进行引入--><properties resource="db.properties" ></properties><!--可以影响mybatis运行时的行为,包含N多个属性,需要什么引入什么--><settings><!--开启驼峰标识验证--><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!--typeAliases:表示在引入实体类的名称时候,可以使用别名,而不需要写完全限定名--><typeAliases><!--每一个具体的类都需要单独来写,如果有100个类呢?--><!--再配-->
<!-- <typeAlias type="com.demo.bean.Emp" alias="aaa"></typeAlias>--><!--可以指定具体的包来保证实体类不需要写完全限定名--><package name="com.demo.bean"/></typeAliases><!--设置定义自己的类型处理器,mybatis中默认内置了很多类型处理器,一般不需要自己来实现-->
<!-- <typeHandlers>-->
<!-- <typeHandler handler="" ></typeHandler>-->
<!-- <package name=""/>-->
<!-- </typeHandlers>-->
<!--当需要自定义对象工厂的时候实现此标签,完成结果集到java对象实例化的过程-->
<!-- <objectFactory type=""></objectFactory>--><!--在项目开发过程中,会包含开发环境,测试环境,生产环境,有可能会使用不同的数据源进行连接操作,在此配置文件中可以指定多个环境default:表示选择哪个环境作为运行时环境--><environments default="development"><!--配置具体的环境属性id:表示当前环境的名称--><environment id="development"><!--事务管理器,每一种数据源都需要配置具体的事务管理器type:表示事务管理器的类型jdbc:使用jdbc原生的事务控制managed:什么都没做--><transactionManager type="JDBC"/><!--配置具体的数据源的类型type:表示数据源的类型pooled:使用数据库连接池unpooled:每次都打开和关闭一个链接--><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>
<!--提供了不同的数据库厂商的标识,当有数据库移植的需求的时候,可以根据不同的数据库来执行不同的sql语句
用来扩展数据库的移植性
--><databaseIdProvider type="DB_VENDOR"><property name="MySQL" value="mysql"/><property name="SQL Server" value="sqlserver"/><property name="Oracle" value="oracle"/></databaseIdProvider><!--是来将mapper映射文件引入到配置文件中,方便程序启动的时候进行加载每次在进行填写的时候需要注意,写完xml映射之后一定要添加到mybatis-config文件中resource:从项目的类路径下加载对应的映射文件url:从本地磁盘目录或者网络中引入映射文件class:可以直接引入类的完全限定名,可以使用注解的方式进行使用,如果不想以注解的方式引入呢?如果想要class的方式引入配置文件,可以将xml文件添加到具体的类的同级目录下1、 如果是maven的项目的话,需要添加如下配置,因为maven默认只会编译java文件,需要把xml文件也添加到指定目录中<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources></build>2、在resource资源目录下,创建跟dao层一样的同级目录即可,将配置文件放到指定的目录--><mappers>
<!-- <mapper resource="EmpDao.xml" />-->
<!-- <mapper resource="UserDao.xml"/>-->
<!-- <mapper class="com.demo.dao.UserDaoAnnotation"></mapper>-->
<!-- <mapper class="com.demo.dao.UserDao"></mapper>--><!--如果需要引入多个配置文件,可以直接定义包的名称resource目录下配置的映射文件必须要具体相同的目录--><package name="com.demo.dao"/></mappers>
</configuration>
测试类
import com.demo.bean.Emp;
import com.demo.bean.User;
import com.demo.dao.EmpDao;
import com.demo.dao.UserDao;
import com.demo.dao.UserDaoAnnotation;
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 java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class MyTest {SqlSessionFactory sqlSessionFactory = null;//在执行任意方法之前,先执行这个@Beforepublic void init() {String resource = "mybatis-config.xml";InputStream in = null;try {in = Resources.getResourceAsStream(resource);} catch (IOException e) {e.printStackTrace();}sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);}@Testpublic void test01() {//获取与数据库相关的会话SqlSession sqlSession = sqlSessionFactory.openSession(true);//获取对应的映射接口对象EmpDao mapper = sqlSession.getMapper(EmpDao.class);//执行具体的sql语句Emp emp = mapper.selectEmpByEmpno(1111);System.out.println(emp);//关闭会话sqlSession.close();}@Testpublic void test045() {//获取与数据库相关的会话SqlSession sqlSession = sqlSessionFactory.openSession();//获取对应的映射接口对象EmpDao mapper = sqlSession.getMapper(EmpDao.class);//执行具体的sql语句List<Emp> emps = mapper.selectAll();for (Emp emp : emps) {System.out.println(emp);}//关闭会话sqlSession.close();}@Testpublic void test02() {
// true为自动提交SqlSession sqlSession = sqlSessionFactory.openSession(true);EmpDao mapper = sqlSession.getMapper(EmpDao.class);Emp emp = new Emp();emp.setEmpno(null);emp.setEname("zhangsan");emp.setJob("gongzuo");emp.setMgr(1963);emp.setHiredate(new Date());emp.setSal(1222.00);emp.setComm(222.00);emp.setDeptno(55);Integer save = mapper.save(emp);
// System.out.println(save);
// 提交sqlSession.commit();sqlSession.close();}@Testpublic void test03() {SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);Emp emp = new Emp();emp.setEmpno(1111);emp.setEname("zhangsan");emp.setJob("gongzuo");emp.setMgr(1963);emp.setHiredate(new Date());emp.setSal(1222.00);emp.setComm(222.00);emp.setDeptno(595);Integer update = mapper.update(emp);
// System.out.println(update);sqlSession.commit();sqlSession.close();}@Testpublic void test04() {SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);Integer delete = mapper.delete(3333);System.out.println(delete);sqlSession.commit();sqlSession.close();}@Testpublic void test05() throws IOException {//获取与数据库相关的会话SqlSession sqlSession = sqlSessionFactory.openSession(true);//获取对应的映射接口对象UserDao mapper = sqlSession.getMapper(UserDao.class);//执行具体的sql语句User user = mapper.selectUserById(1);System.out.println(user);//关闭会话sqlSession.close();}@Testpublic void test055() throws IOException {//获取与数据库相关的会话SqlSession sqlSession = sqlSessionFactory.openSession(true);//获取对应的映射接口对象UserDaoAnnotation mapper = sqlSession.getMapper(UserDaoAnnotation.class);//执行具体的sql语句User user = mapper.selectUserById(1);System.out.println(user);//关闭会话sqlSession.close();}@Testpublic void test06() {SqlSession sqlSession = sqlSessionFactory.openSession();UserDao mapper = sqlSession.getMapper(UserDao.class);User user = new User();user.setUserName("lisi");Integer save = mapper.saveUser(user);System.out.println(save);System.out.println(user);sqlSession.commit();sqlSession.close();}@Testpublic void test07() {SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);List<Emp> list = mapper.selectAll();for (Emp emp : list) {System.out.println(emp);}sqlSession.commit();sqlSession.close();}@Testpublic void test077() {SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);Map<String, Emp> stringEmpMap = mapper.selectAll2();for (String key : stringEmpMap.keySet()) {System.out.println("key::" + key + "value::" + stringEmpMap.get(key));}sqlSession.commit();sqlSession.close();}@Testpublic void test0777() {SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);Map<Integer, Emp> stringEmpMap = mapper.selectAll3();for (Integer key : stringEmpMap.keySet()) {System.out.println("key::" + key + "value::" + stringEmpMap.get(key));}sqlSession.commit();sqlSession.close();}@Testpublic void test07777() {SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);Emp emp = mapper.selectbyno4("emp", 1111);System.out.println(emp);sqlSession.commit();sqlSession.close();}@Testpublic void test8() {SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);Emp emp = new Emp();emp.setEmpno(1111);emp.setSal(122.00);List<Emp> emps = mapper.selectEmpByEmpnoAndSal(emp);for (Emp emp1 : emps) {System.out.println(emp1);}sqlSession.commit();sqlSession.close();}@Testpublic void test88() {SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);List<Emp> list = mapper.selectEmpByEmpnoAndSal2(1111,12.0);for (Emp emp : list) {System.out.println(emp);}sqlSession.commit();sqlSession.close();}@Testpublic void test08() {SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);Map<String, Object> map = new HashMap<String, Object>();map.put("empno", 1111);map.put("sal", 1222.0);List<Emp> list = mapper.selectEmpByEmpnoAndSal3(map);for (Emp emp : list) {System.out.println(emp);}sqlSession.commit();sqlSession.close();}@Testpublic void test09() {SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);Map<Object, Object> objectObjectMap = mapper.selectEmpByEmpnoReturnMap(1111);System.out.println(objectObjectMap);sqlSession.commit();sqlSession.close();}@Testpublic void test10() {SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);Map<String, Emp> stringEmpMap = mapper.selectAll2();System.out.println(stringEmpMap);sqlSession.commit();sqlSession.close();}@Testpublic void test100() {SqlSession sqlSession = sqlSessionFactory.openSession();EmpDao mapper = sqlSession.getMapper(EmpDao.class);Map<Integer, Emp> stringEmpMap = mapper.selectAll3();System.out.println(stringEmpMap);sqlSession.commit();sqlSession.close();}
}import com.demo.bean.Dog;
import com.demo.bean.Emp;
import com.demo.bean.User;
import com.demo.dao.DogDao;
import com.demo.dao.EmpDao;
import com.demo.dao.UserDao;
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 java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class MyTest2 {SqlSessionFactory sqlSessionFactory = null;@Beforepublic void init(){String resource = "mybatis-config.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);} catch (IOException e) {e.printStackTrace();}sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void test01() throws IOException {//获取与数据库相关的会话SqlSession sqlSession = sqlSessionFactory.openSession();//获取对应的映射接口对象DogDao mapper = sqlSession.getMapper(DogDao.class);//执行具体的sql语句Dog dog = mapper.selectDogById(1);System.out.println(dog);//关闭会话sqlSession.close();}}public class Test {public static void main(String[] args) {for (int row = 0; row < 5; row++) {for (int col = 1; col <= 2 * row - 1; col++) {System.out.print("*");}System.out.println();}for (int row = 0; row < 5; row++) {for (int col = 4; col >= 2 * row ; col--) {System.out.print("*");}System.out.println();}}
}
dao层
import com.demo.bean.User;
import org.apache.ibatis.annotations.Select;public interface UserDaoAnnotation {@Select("select * from user where id = #{id}")public User selectUserById(Integer id);
}
import com.demo.bean.Emp;
import com.demo.bean.User;
import org.omg.PortableInterceptor.Interceptor;
import java.util.List;
public interface UserDao {public User selectUserById(Integer id);public Integer saveUser(User user);
}package com.demo.dao;import com.demo.bean.Emp;
import com.sun.tracing.dtrace.ProviderAttributes;
import org.apache.ibatis.annotations.*;import java.util.List;
import java.util.Map;
//批量增加 insert into emp(empno,ename) values(1,1),(2,2),(3,3)public interface EmpDao {
// @Select()
// @Delete()
// @Update()
// @Insert()public Integer save(Emp emp);
@Update("update emp set " +"ename=#{ename},job=#{job},mgr=#{mgr},hiredate=#{hiredate},sal=#{sal},comm=#{comm},deptno=#{deptno} " +"where empno = #{empno}")public Integer update(Emp emp);public Integer delete(Integer empno);public Emp selectEmpByEmpno(Integer empno);public Map<Object,Object> selectEmpByEmpnoReturnMap(Integer empno);public List<Emp> selectAll();@MapKey("ename")public Map<String,Emp> selectAll2();@MapKey("empno")public Map<Integer,Emp> selectAll3();public Emp selectbyno4(String T,Integer empno);public List<Emp> selectEmpByEmpnoAndSal(Emp emp);public List<Emp> selectEmpByEmpnoAndSal2(@Param("empno") Integer empno, @Param("sal") Double sal);public List<Emp> selectEmpByEmpnoAndSal3(Map<String,Object> map);}import com.demo.bean.Dog;
import org.omg.PortableInterceptor.Interceptor;public interface DogDao {public Dog selectDogById(Integer id);
}
实体类
public class Dog {private Integer id;private String name;private Integer age;private String gender;
}public class Emp {private Integer empno;private String ename;private String job;private Integer mgr;private Date hiredate;private Double sal;private Double comm;private Integer deptno;
}public class User {private Integer id;private String userName;
}
mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--在使用mybatis的时候,有些情况下需要我们封装结果集,一般情况下mybatis会帮我们自动封装(字段名跟属性值必须一一对应),但是如果字段的值和类中的值
不匹配的时候,怎么处理?1、可以在sql语句中添加别名字段,来保证赋值成功,但是太麻烦了,而且不可重用2、resultMap:
--><mapper namespace="com.demo.dao.DogDao"><!--自定义结果集id:表示当前结果集的唯一标识type:表示当前结果集的类型--><resultMap id="myDog" type="com.demo.bean.Dog"><!--id:表示指定对应的主键property:实体类中对应的属性值column:表中字段的名称--><id property="id" column="id"></id><!--除主键外的其他字段映射--><result property="name" column="dname"></result><result property="age" column="dage"></result><result property="gender" column="dgender"></result></resultMap><select id="selectDogById" resultMap="myDog">select * from dog where id = #{id}</select>
</mapper><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.dao.EmpDao"><!--在mybatis中,会包含非常多的查询操作,因此查询的参数比较麻烦id:用来设置当前sql语句匹配的dao接口的方法,必须要跟方法的名字统一resultType:表示返回的结果的类型,一般使用的并不多,此类型只能返回单一的对象,而我们在查询的时候特别是关联查询的时候,需要自定义结果集当返回的结果是一个集合的时候,并不需要resultmap,只需要使用resulttype指定集合中的元素类型即可resultMap:当进行关联查询的时候,在返回结果的对象中还包含另一个对象的引用时,此时需要自定义结果集合,使用resultmap--><!--参数的获取值的方式:每次在向sql语句中设置结果值的时候,可以使用#{},还可以使用${}这样的方式,那么哪种比较好?#{}:select * from emp where empno = ?${}: select * from emp where empno = 7369通过sql语句可以得出结论:#{}的处理方式是使用了参数预编译的方式,不会引起sql注入的问题${}的处理方式是直接拼接sql语句,得到对应的sql语句,会有sql注入的危险因此,我们推荐大家使用#{}的方式但是要注意,${}也是有自己的使用场景的?当需要传入动态的表名,列名的时候就需要使用${},就是最直接的拼接字符串的行为--><!--当查询语句中包含多个参数的时候,我们应该如何获取需要的参数1、如果是单个参数,基本数据类型:那么可以使用#{}随便获取引用数据类型:使用#{}获取值的是必须要使用对象的属性名2、如果是多个参数:我们在获取参数值的时候,就不能简单的通过#{}来获取了,只能通过arg0,arg1,param1,param2...这样的方式来获取参数的值原因在于,mybatis在传入多个参数的时候,会讲这些参数的结果封装到map结构中,在map中key值就是(arg0,arg1,...)(param1,param2...),这种方式非常不友好,没有办法根据属性名来获取具体的参数值如果想要使用参数的话,可以进行如下的设置:public List<Emp> selectEmpByEmpnoAndSal2(@Param("empno") Integer empno, @Param("sal") Double sal);这样的方式其实是根据@Param来进行参数的获取3、自定义map结构--><select id="selectEmpByEmpnoAndSal3" resultType="com.demo.bean.Emp">select * from emp where empno = #{empno} and sal >#{sal}</select><select id="selectEmpByEmpnoAndSal2" resultType="com.demo.bean.Emp">select * from emp where empno = #{empno} and sal >#{sal}</select>
<!-- select * from emp where empno = #{aaa} and sal >#{ccc} 俩参数就不能瞎写了--><select id="selectEmpByEmpnoAndSal" resultType="com.demo.bean.Emp">select * from emp where empno = #{empno} and sal >#{sal}</select><select id="selectEmpByEmpno" resultType="com.demo.bean.Emp">select * from emp where empno = #{empno} and sal >#{sal}</select><!--当返回值是map结构的时候,会把查询结构的字段值作为key,结果作为value--><select id="selectEmpByEmpnoReturnMap" resultType="map">select * from emp where empno = #{empno}</select><!--当需要返回的结果是一个map的集合的时候,同时map中包含多个对象,那么此时必须要在dao的方法上添加@MapKey注解,来标识到底是哪一个属性值作为key--><select id="selectbyno4" resultType="Emp">select * from ${arg0} where empno=#{arg1}</select><select id="selectAll3" resultType="Emp">select * from emp</select><select id="selectAll2" resultType="Emp">select * from emp</select><select id="selectAll" resultType="Emp">select * from emp</select><!--insert delete update分别用来标识不同类型的sql语句id:用来标识跟dao接口中匹配的方法,必须与方法的名字一一对应上flushCache:用来标识当前sql语句的结果是否进入二级缓存statementType:用来选择执行sql语句的方式statement:最基本的jdbc的操作,用来表示一个sql语句,不能防止sql注入PREPARED: preareStatement:采用预编译的方式,能够防止sql注入,设置参数的时候需要该对象来进行设置CALLABLE:调用存储过程useGeneratedKeys:放完成插入操作的时候,可以将自增生成的主键值返回到具体的对象keyProperty:指定返回的主键要赋值到哪个属性中在编写sql语句的过程中,无论你是否配置了驼峰标识的识别settting,都需要在sql语句中写具体的表的属性名,不能写对象名称--><insert id="save" >insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(#{empno},#{ename},#{job},#{mgr},#{hiredate},#{sal},#{comm},#{deptno})</insert>
<!-- <update id="update">-->
<!-- update emp set ename=#{ename},job=#{job},mgr=#{mgr},hiredate=#{hiredate},sal=#{sal},comm=#{comm},deptno=#{deptno} where empno = #{empno}-->
<!-- </update>--><delete id="delete">delete from emp where empno = #{empno}</delete><!--===============================================================================--><!--如果需要定义一个自定义结果集,那么该如何进行处理resultMap--></mapper><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.dao.UserDao"><select id="selectUserById" resultType="com.demo.bean.User">select * from user where id = #{id}</select>
<!-- useGeneratedKeys:放完成插入操作的时候,可以将自增生成的主键值返回到具体的对象keyProperty:指定返回的主键要赋值到哪个属性中
在编写sql语句的过程中,无论你是否配置了驼峰标识的识别settting,都需要在sql语句中写具体的表的属性名,不能写对象名称--><insert id="saveUser" useGeneratedKeys="true" keyProperty="id">insert into user(user_name) values(#{userName})</insert>
</mapper>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.demo</groupId><artifactId>mybatis_helloworld</artifactId><version>1.0-SNAPSHOT</version><dependencies>
<!-- mybatis--><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.4</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<!-- 连接数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version></dependency><!-- https://mvnrepository.com/artifact/junit/junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency>
<!-- 日志文件的jar--><!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies>
<!-- <build>-->
<!-- <resources>-->
<!-- <resource>-->
<!-- <directory>src/main/java</directory>-->
<!-- <includes>-->
<!-- <include>**/*.xml</include>-->
<!-- </includes>-->
<!-- </resource>-->
<!-- </resources>-->
<!-- </build>-->
</project>