第二节 HelloWorld强化
1、加入日志
①目的
②操作
[1]加入依赖
[2]加入log4j的配置文件
③日志的级别
④STDOUT
⑤打印效果
2、关联外部属性文件
①需求
②做法
3、用上Mapper接口
①思路
②调整junit代码
③完成Mapper接口
④最终的junit测试方法
10、增删改操作
①insert
②delete
③update

第二节 HelloWorld强化

1、加入日志

①目的

在Mybatis工作过程中,通过打印日志的方式,将要执行的SQL语句打印出来。

②操作

[1]加入依赖



log4j
log4j
1.2.17

[2]加入log4j的配置文件

02.HelloWorld强化 - 图1

支持XML和properties属性文件两种形式。无论使用哪种形式,文件名是固定的:

  • log4j.xml
  • log4j.properties

<?xml version=”1.0” encoding=”UTF-8” ?>
<!DOCTYPE log4j:configuration SYSTEM “log4j.dtd”>

  1. <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"><br /> <param name="Encoding" value="UTF-8" /><br /> <layout class="org.apache.log4j.PatternLayout"><br /> <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" /><br /> </layout><br /> </appender><br /> <logger name="java.sql"><br /> <level value="debug" /><br /> </logger><br /> <logger name="org.apache.ibatis"><br /> <level value="info" /><br /> </logger><br /> <root><br /> <level value="debug" /><br /> <appender-ref ref="STDOUT" /><br /> </root><br /></log4j:configuration>

③日志的级别

FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试)
从左到右打印的内容越来越详细

④STDOUT

是standard output的缩写,意思是标准输出。对于Java程序来说,打印到标准输出就是打印到控制台。

⑤打印效果

DEBUG 05-24 18:51:13,331 > Preparing: select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_id=? (BaseJdbcLogger.java:137) DEBUG 05-24 18:51:13,371 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:137) DEBUG 05-24 18:51:13,391 < Total: 1 (BaseJdbcLogger.java:137) o = Employee{empId=1, empName=’tom’, empSalary=200.33}

2、关联外部属性文件

①需求

在实际开发时,同一套代码往往会对应多个不同的具体服务器环境。使用的数据库连接参数也不同。为了更好的维护这些信息,我们建议把数据库连接信息提取到Mybatis全局配置文件外边。

②做法

02.HelloWorld强化 - 图2

创建jdbc.properties配置文件
wechat.dev.driver=com.mysql.jdbc.Driver
wechat.dev.url=jdbc:mysql://192.168.198.100:3306/mybatis-example
wechat.dev.username=root
wechat.dev.password=atguigu

wechat.test.driver=com.mysql.jdbc.Driver
wechat.test.url=jdbc:mysql://192.168.198.150:3306/mybatis-example
wechat.test.username=root
wechat.test.password=atguigu

wechat.product.driver=com.mysql.jdbc.Driver
wechat.product.url=jdbc:mysql://192.168.198.200:3306/mybatis-example
wechat.product.username=root
wechat.product.password=atguigu

在Mybatis全局配置文件中指定外部jdbc.properties文件的位置

在需要具体属性值的时候使用${key}格式引用属性文件中的键

<!-- 建立数据库连接的具体信息(引用了外部属性文件中的数据) --><br />    <property name="driver" value="${wechat.dev.driver}"/><br />    <property name="url" value="${wechat.dev.url}"/><br />    <property name="username" value="${wechat.dev.username}"/><br />    <property name="password" value="${wechat.dev.password}"/>

3、用上Mapper接口

前面已经使用MyBatis完成了对Emp表的CRUD操作,都是由SqlSession调用自身方法发送SQL命令并得到结果的,实现了MyBatis的入门。 但是却存在如下缺点: 1).不管是selectList()、selectOne()、selectMap(),都只能提供一个查询参数。如果要多个参数,需要封装到JavaBean中,并不一定永远是一个好办法。 2).返回值类型较为固定 3).只提供映射文件,没有提供数据库操作的接口,不利于后期的维护扩展,也和之前开发习惯不符
在MyBatis中提供了另外一种成为Mapper代理(或称为接口绑定)的操作方式。在实际开发中也使用该方式。
Mybatis中的Mapper接口相当于以前的Dao。但是区别在于,Mapper仅仅是接口,我们不需要提供实现类。

①思路

02.HelloWorld强化 - 图3

②调整junit代码

public class ImprovedMybatisTest {

private SqlSession session;

// junit会在每一个@Test方法前执行@Before方法<br />    @Before<br />    public void init() throws IOException {<br />         session = new SqlSessionFactoryBuilder()<br />                 .build(<br />                         Resources.getResourceAsStream("mybatis-config.xml"))<br />                 .openSession();<br />    }

// junit会在每一个@Test方法后执行@After方法<br />    @After<br />    public void clear() {<br />        session.commit();<br />        session.close();<br />    }

}

③完成Mapper接口

public interface EmployeeMapper {

Employee selectEmployee(Integer empId);

}

  • 方法名和SQL的id一致
  • 方法返回值和resultType一致
  • 方法的参数和SQL的参数一致
  • 接口的全类名和映射配置文件的名称空间一致

④最终的junit测试方法

@Test
public void testUsrMapperInterface() {

// 1.根据EmployeeMapper接口的Class对象获取Mapper接口类型的对象<br />    EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

// 2.调用EmployeeMapper接口的方法完成对数据库的操作<br />    Emp emp = employeeMapper.selectEmployee(1L);

// 3.打印查询结果<br />    System.out.println("emp = " + emp);<br />}

10、增删改操作

①insert

SQL语句






insert into t_emp(emp_name,emp_salary) values(#{empName},#{empSalary})

Java代码中的Mapper接口:
public interface EmployeeMapper {

Employee selectEmployee(Integer empId);

int insertEmployee(Employee employee);<br />}

Java代码中的junit测试:
@Test
public void testSaveEmployee() {

EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

// 创建要保存到数据库的对象<br />    Employee employee = new Employee();

// 给实体类对象设置具体属性值<br />    employee.setEmpName("jerry");<br />    employee.setEmpSalary(5000.33);

// 执行保存操作<br />    int result = employeeMapper.insertEmployee(employee);

// 打印受影响的行数<br />    System.out.println("result = " + result);<br />}

②delete

SQL语句

delete from t_emp where emp_id=#{empId}

Java代码中的Mapper接口:
public interface EmployeeMapper {

Employee selectEmployee(Integer empId);

int insertEmployee(Employee employee);

int deleteEmployee(Integer empId);<br />}

Java代码中的junit测试:
@Test
public void testRemoveEmployee() {

EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

int result = employeeMapper.deleteEmployee(1);

System.out.println("result = " + result);<br />}

③update

SQL语句:

update t_emp set emp_name=#{empName},emp_salary=#{empSalary} where emp_id=#{empId}

Java代码中的Mapper接口:
public interface EmployeeMapper {

Employee selectEmployee(Integer empId);

int insertEmployee(Employee employee);

int deleteEmployee(Integer empId);

int updateEmployee(Employee employee);<br />}

Java代码中的junit测试:
@Test
public void testUpdateEmployee() {

EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

Employee employee = new Employee(2, "AAAAAA", 6666.66);

int result = employeeMapper.updateEmployee(employee);

System.out.println("result = " + result);<br />}

上一节 回目录 下一节