public interface EmployeeMapper { /* * 增删改查方法 * */ public Employee getEmployeeById(Integer id); public void insertEmp(Employee employee); }
<select id="getEmployeeById" resultType="employee" databaseId="mysql"> select * from student where id = #{id} </select> <insert id="insertEmp" parameterType="com.neuedu.entity.Employee" useGeneratedKeys="true" keyProperty="id"> insert into student(name,password,email) values(#{name},#{password},#{email}) </insert>
编写测试单元:java
private EmployeeMapper mapper = null; private SqlSession session = null; @Before public void testBefore(){ //1.获取sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); //2.利用sqlSessionFactory建立一个session对象,表示和数据库的一次会话 session = sqlSessionFactory.openSession(); //3.用session对象获取mapper接口的代理对象 //由于sql映射文件给相应的接口建立了一个代理对象,因此mapper接口类不须要实现类 mapper = session.getMapper(EmployeeMapper.class); } @Test public void testSelect(){ mapper = session.getMapper(EmployeeMapper.class); //4.经过mapper接口的代理对象就能够对数据库进行增删改查操做 Employee employee = mapper.getEmployeeById(4); System.out.println(employee); } @Test public void testInsert(){ Employee emp = new Employee("zhangsan", "1234567", "zhangsan@q.com"); mapper.insertEmp(emp); int id = emp.getId(); System.out.println(id); } @After public void testAfter(){ //增删改须要提交事务 session.commit(); session.close(); } //@Before、@After自动在@Test以前和以后运行 //查询不须要提交事务,增删改都须要提交事务
2.获取自增主键值【当向数据库中插入一条数据的时候,默认是拿不到主键的值的, 须要设置以下两个属性才能够拿到主键值!】mysql
<!--设置userGeneratedKeys属性值为true:使用自动增加的主键。使用keyProperty设置把主键值设置给哪个属性--> <insert id="addEmp" parameterType="com.neuedu.mybatis.bean.Employee" useGeneratedKeys="true" keyProperty="id" databaseId="mysql"> insert into tbl_employee(last_name,email,gender) values(#{lastName},#{gender},#{email}) </insert>
<sql id="npe"> name,password,email </sql> <insert id="insertEmp" parameterType="com.neuedu.entity.Employee" useGeneratedKeys="true" keyProperty="id"> insert into student(<include refid="npe"></include>) values(#{name},#{password},#{email}) </insert>
public void updateEmp(@Param("id")Integer id, @Param("name")String name, @Param("password")String password, @Param("email")String email);
<update id="updateEmp"> update student set name=#{name},password=#{password},email=#{email} where id=#{id} </update>
- POJO参数:若是多个参数正好是咱们业务逻辑的数据模型,咱们就能够直接传入POJOsql
#{属性名}:取出传入的POJO的属性值数据库
public void insertEmp(Employee employee);
<sql id="npe"> name,password,email </sql> <insert id="insertEmp" parameterType="com.neuedu.entity.Employee" useGeneratedKeys="true" keyProperty="id"> insert into student(<include refid="npe"></include>) values(#{name},#{password},#{email}) </insert>
@Test public void testReturnVal(){ Employee employee = mapper.getEmployeeById(30); System.out.println(employee); }
- Map:若是多个参数不是业务模型中的数据,没有对应的pojo,不常常使用,为了方便,咱们也能够传入Map缓存
#{key}:根据 key 取出map中对应的值安全
public void updateName(Map<String, Object> map);
<update id="updateName"> update student set name=#{name} where id=#{id} </update>
@Test public void testMap(){ Map<String, Object> map = new HashMap<>(); map.put("id", 33); map.put("name", "刘德华"); mapper.updateName(map); }
<update id="updateEmp"> update student set name=#{name},password=#{password},email=#{email} where id=#{id} </update>
${}:取出的值直接拼装在sql语句中,会有安全问题session
<update id="updateEmp"> update student set name='${name}',password='${password}',email='${email}' where id='${id}' </update>
public List<Employee> getEmps();
<select id="getEmps" resultType="com.neuedu.entity.Employee"> select * from student </select>
@Test public void testReturnList(){ List<Employee> emps = mapper.getEmps(); for (Employee employee : emps) { System.out.println(employee); } }
2.返回记录为一个Mapmybatis
只能查询单条数据,若是多条的话,多个key 值,找不到app
public Map<String, Object> getEmpInfoById(Integer id);
resultType 是 Map 的全类名函数
<select id="getEmpInfoById" ="java.util.Map"> select * from student where id = #{id} </select>
key:列名;value:值
@Test public void testReturnMap(){ Map<String, Object> emp = mapper.getEmpInfoById(30); Set<Entry<String,Object>> entrySet = emp.entrySet(); for (Entry<String, Object> entry : entrySet) { System.out.println(entry.getKey()+":"+entry.getValue()); } }
<settings> <!-- setting标签负责每个属性的设置 --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
3.利用ResultMap:
public Employee getEmpInfoById(Integer id);
<resultMap type="com.neuedu.entity.Employee" id="getEmployByIdMap"> <!-- 主键映射能够用 id 字段,mybatis在底层会作优化,主键有索引,加快查询速度 --> <id column="id" property="id"/> <!-- 普通列的映射使用result --> <result column="name" property="name"/> <result column="password" property="password"/>//相同的也能够不写,但由于规范建议写 <result column="email" property="email"/> </resultMap> <select id="getEmpInfoById" resultMap="getEmployByIdMap"> select * from student where id = #{id} </select>
@Test public void testReturnMap(){ Employee emp = mapper.getEmpInfoById(30); System.out.println(emp); }