数据库:
JavaBean
package cn.wyu.bean;
/**
* @author linwillen
* @create 2020-04-28-20:05
*/
public class Employee {
private Integer id;
private String empName;
private String email;
private Integer gender;
private String loginAccount;
public Employee() {
}
public Employee(Integer id, String empName, String email, Integer gender) {
this.id = id;
this.empName = empName;
this.email = email;
this.gender = gender;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public String getLoginAccount() {
return loginAccount;
}
public void setLoginAccount(String loginAccount) {
this.loginAccount = loginAccount;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", empName='" + empName + '\'' +
", email='" + email + '\'' +
", gender=" + gender +
", loginAccount='" + loginAccount + '\'' +
'}';
}
}
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">
<!-- mybatis主配置文件-->
<configuration>
<!--
resource="" :引用类路径下的properties文件
url="":引用磁盘或者网络的路径资源
-->
<properties resource="db.properties"></properties>
<!--settings:这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。-->
<settings>
<!--是否开启驼峰命名自动映射-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<!--typeAlias:为 JavaBean 起别名,默认是类名(不区分大小写)
alias:为JavaBean指定一个名字
-->
<!--<typeAlias type="cn.wyu.bean.Employee" alias="emp"/>-->
<!--批量起别名,name:指定包名,默认别名是类名-->
<package name="cn.wyu.bean"/>
</typeAliases>
<!--类处理器-->
<!--<typeHandlers>
<!–自定义类型处理器–>
<typeHandler handler=""/>
</typeHandlers>
-->
<!--default:默认使用哪个环境-->
<environments default="mysql">
<!--
environment:每一个environment配置一个具体的环境,都需要一个事务管理器和一个数据源
id:是每一个环境的唯一标识
以后数据源和事务管理器都用spring来配
-->
<environment id="mysql">
<transactionManager type="JDBC"/>
<!--配置数据库(连接池)-->
<dataSource type="POOLED">
<!--使用${}取出properties中的值-->
<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>
<!--做数据库移植,比如要切换成mysql数据库,oracle数据库,SQL server数据库-->
<databaseIdProvider type="DB_VENDOR">
<!--
name="":数据库厂商标识(固定的),value="":给这个标识起个名
-->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
<mappers>
<!--
resource:表示从类路径下查找资源
url:可以从磁盘或者网络路径引用资源
class:写接口的全类名
-->
<mapper resource="mapper/EmployeeDao.xml"/>
<!--<mapper class="cn.wyu.dao.EmployeeDao"/>-->
<!-- <package name="cn.wyu.dao"/>-->
</mappers>
</configuration>
EmployeeDao.java
package cn.wyu.dao;
import cn.wyu.bean.Employee;
import org.apache.ibatis.annotations.MapKey;
import java.util.Map;
/**
* @author linwillen
* @create 2020-04-28-20:05
*/
public interface EmployeeDao {
Employee getEmpById(Integer id);
Map<String,Object> getEmpByIdReturnMap(Integer id);
@MapKey("id")
Map<String,Employee> getAllEmpReturnMap();
Employee getEmpByIdAndEmpName(Integer id,String empName);
int updateEmployee(Employee employee);
int deleteEmployee(Integer id);
int insertEmployee(Employee employee);
}
EmployeeDao.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="cn.wyu.dao.EmployeeDao">
<!-- namespace:写接口的全类名
<cache/>:缓存有关
<cache-ref namespace=""/>:缓存有关
<parameterMap id="" type=""></parameterMap>:参数是map,废弃了
<resultMap id="" type=""/>:自定义封装结果集
<sql id=""/>:抽取可重用的SQL
-->
<!--Employee getEmpById(Integer id);参数类型不用写parameterType=""-->
<!--
select:用来定义一个查询操作
id:对应接口的方法名
resultType:用来指定方法运行后的返回值类型(查询操作必须指定)
#{属性名}:表示取出传递过来的某个参数的值
-->
<!--默认不区分环境-->
<select id="getEmpById" resultType="Employee">
select * from t_employee where id = #{id}
</select>
<!--Employee getEmpByIdAndEmpName(Integer id,String empName);-->
<!--
1、单个参数:
基本类型:取值:#{随便写}
传入pojo:
2、多个参数:
取值:#{参数名}是无效的,需要用:0,1,...或者parm1,parm2,...
原因:只要传入多个参数,mybatis会自动将数据封装成map,封装时用的key就是参数的索引和参数的第几个
使用@Parm注解自己手动指定key:我们可以告诉mybatis,封装数据时使用我们制定的key,不用1,2,..或parm1,parm2,...
3、传入map;
取值:#{key}
4、传入pojo:
取值:#{pojo属性名}
扩展:method01(@Param("id") Integer id,String empName,Employee employee)
取值:#{id},#{param2},取出employee中的email:#{param3.email}
取值方式:
#{}:参数预编译,参数位置都是用?代替,后来再把值放进去,安全,不会有SQL注入
${}:不是参数预编译,用字符串拼串的方式,
-->
<select id="getEmpByIdAndEmpName">
select * from t_employee where id = #{id} and empname=#{empName}
</select>
<!--查询返回一个map-->
<!--Map<String,Object> getEmpByIdReturnMap(Integer id);-->
<!--默认有别名是map,默认将列名作为key,值作为value-->
<select id="getEmpByIdReturnMap" resultType="map">
select * from t_employee where id = #{id}
</select>
<!--查询所有记录返回map-->
<!--Map<String,Employee> getAllEmpReturnMap();-->
<!--@MapKey("id"),指定id作为key,查询多个的情况下,resultType里面写元素的类型-->
<select id="getAllEmpReturnMap" resultType="Employee">
select * from t_employee
</select>
<!--是MySQL数据库就执行这个-->
<select id="getEmpById" resultType="Employee" databaseId="mysql">
select * from t_employee where id = #{id}
</select>
<!--是Oracle数据库就执行这个-->
<select id="getEmpById" resultType="Employee" databaseId="oracle">
select * from t_employee where id = #{id}
</select>
<!-- int updateEmployee(Employee employee);
增删改不用写返回值类型;增删改返回的是影响多少行,mybatis会自动判断并返回。
如果是boolean,影响0行mybatis会自动返回false,否则会返回true
-->
<update id="updateEmployee">
update t_employee
set empname=#{empName},gender=#{gender},email=#{email}
where id=#{id}
</update>
<!--int deleteEmployee(Integer id);-->
<delete id="deleteEmployee">
delete from t_employee where id=#{id}
</delete>
<!--int insertEmployee(Employee employee);-->
<!--当插入数据时,让mybatis自动的将自增id赋值给传入的employee对象的id
useGeneratedKeys="true":用原生jdbc获取自增主键的方法
keyProperty="":将刚才自增的id封装给哪个属性
-->
<insert id="insertEmployee" useGeneratedKeys="true" keyProperty="id">
/*在sql语句执行之前执行这个条语句,并把select到的值赋值给id这个属性*/
<!--<selectKey order="BEFORE" resultType="integer" keyProperty="id">
select max(id)+1 from t_employee
</selectKey>-->
insert into t_employee(empname,gender,email) values(#{empName},#{gender},#{email})
</insert>
</mapper>
测试类:
package cn.wyu.test;
import cn.wyu.bean.Employee;
import cn.wyu.dao.EmployeeDao;
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.Map;
/**
* @author linwillen
* @create 2020-04-28-23:04
*/
public class MybatisTest {
SqlSessionFactory sqlSessionFactory;
@Before
public void initSqlSessionFactory() throws IOException {
// 1.通过Resources加载配置好的mybatis.xml配置文件。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 2.获取SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test1() throws IOException {
// 3.获取SqlSession对象
//SqlSession sqlSession = sqlSessionFactory.openSession(true);//设置为自动提交
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
EmployeeDao employeeDao = sqlSession.getMapper(EmployeeDao.class);
Employee employee = new Employee(0, "tomcat2", "tomcat2@qq.com", 1);
int i = employeeDao.insertEmployee(employee);
System.out.println("影响条数--->"+i);
System.out.println("刚才插入的数据的id:"+employee.getId());
} finally {
//手动提交
sqlSession.commit();
sqlSession.close();
}
}
@Test
public void test2() throws IOException {
SqlSession sqlSession = sqlSessionFactory.openSession();
EmployeeDao employeeDao = sqlSession.getMapper(EmployeeDao.class);
Employee employee = employeeDao.getEmpById(1);
System.out.println(employee);
}
@Test
public void test3() throws IOException {
SqlSession sqlSession = sqlSessionFactory.openSession();
EmployeeDao employeeDao = sqlSession.getMapper(EmployeeDao.class);
Map<String,Object> map = employeeDao.getEmpByIdReturnMap(1);
System.out.println(map);
}
@Test
public void test4() throws IOException {
SqlSession sqlSession = sqlSessionFactory.openSession();
EmployeeDao employeeDao = sqlSession.getMapper(EmployeeDao.class);
Map<String,Employee> map = employeeDao.getAllEmpReturnMap();
System.out.println(map);
}
}