创建maven工程后,在pom文件中加入下列包:
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.1</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> </dependencies>mybatis的程序首先是对配置文件的要求 第一步是核心配置文件:
<?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> <!-- 配置环境 --> <environments default="mysql"> <!-- 配置mysql的环境--> <environment id="mysql"> <!-- 配置事务的类型--> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源(连接池) --> <dataSource type="POOLED"> <!-- 配置连接数据库的4个基本信息 --> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/cz-mybatis"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 --> <mappers> <mapper resource="com/cz/Dao/UserDao.xml"/> </mappers> </configuration>核心配置文件的mappers标签可以在写完映射文件后再写,这里有对数据库的连接,确定是对哪一个数据库的访问。 日志文件log4j.properties也很重要:
# Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategory=INFO, CONSOLE debug info warn error fatal log4j.rootCategory=debug, CONSOLE, LOGFILE # Set the enterprise logger category to FATAL and its only appender to CONSOLE. log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE # CONSOLE is set to be a ConsoleAppender using a PatternLayout. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n # LOGFILE is set to be a File appender using a PatternLayout. log4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=d:\axis.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n然后就是写实体类:
package com.cz.pojo; import java.util.Date; public class User { private Integer id; private String username; private String address; private String sex; private Date birthday; }代码省略了setter/getter构造方法和toString方法。 下一步就是写持久层,持久层是一个接口类,用来定义数据操作的方法:
package com.cz.dao; import com.cz.pojo.User; import java.util.List; public interface UserDao { /** * 查找所有对象 * @return */ List<User> findAll(); /** * 保存用户 */ void saveUser(User user); /** *删除用户 * @param id */ void deleteUser(Integer id); /** * 更新操作 * @param user */ void updateUser(User user); /** * 查找一个 * @param id */ User findById(Integer id); /** * 根据名字模糊查找 * @param username * @return */ List<User> findByName(String username); int count(); }在持久层的同级包下,创建一个和持久层同样名字的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.cz.dao.UserDao"> <!--查询所有 --> <select id="findAll" resultType="com.cz.pojo.User"> select * from user </select> <!-- 保存用户--> <insert id="saveUser" parameterType="com.cz.pojo.User"> insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday}); </insert> <!--删除用户 --> <delete id="deleteUser" parameterType="Integer"> delete from user where id=#{id} </delete> <!-- 更新操作--> <update id="updateUser" parameterType="com.cz.pojo.User"> update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id} </update> <select id="findById" parameterType="Integer" resultType="com.cz.pojo.User"> select * from user where id=#{id} </select> <select id="findByName" resultType="com.cz.pojo.User" parameterType="String"> select * from user where username like #{username} </select> <select id="count" resultType="int" > select count(id) from user </select> </mapper>mapper的namespace就是文件的全限定类名,下面的每个操作标签的id属性就是前面持久层的方法名,resultType属性是持久层方法的返回值,当是返回值是void时,不用写resultType,当是返回值是基本类型或其他类型时,resultType和返回值类型保持一致;parameterType和方法的参数类型保持一致,当方法的参数类型是pojo类型时,parameterType的值也是相应的pojo类型。
最后就是测试方法的编写
package com.cz.test; import com.cz.dao.UserDao; import com.cz.pojo.User; 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.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; public class MybatisTest { /** * 创建对象 */ private InputStream inputStream; private SqlSession sqlSession; UserDao userDao; @Before public void init() throws Exception { //读取配置文件,生成字节输入流 inputStream = Resources.getResourceAsStream("MapConfig.xml"); //获取SQLSessionFactory工厂 SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSession对象 sqlSession = sqlSessionFactory.openSession(); //获取代理对象 userDao = sqlSession.getMapper(UserDao.class); } @After public void destory() throws Exception { sqlSession.commit(); sqlSession.close(); inputStream.close(); } @Test public void testfindAll() throws IOException { /** * 执行查询所有方法 */ List<User> users = userDao.findAll(); for(User user:users){ System.out.println(user); } } /** * 保存新的用户 */ @Test public void testSaveUser(){ User user = new User(); user.setAddress("新世界"); user.setBirthday(new Date()); user.setUsername("路飞"); user.setSex("男"); userDao.saveUser(user); } @Test public void TestDelete(){ userDao.deleteUser(102); } @Test public void TestUpdate(){ User user = new User(); user.setId(42); user.setAddress("第七宇宙"); user.setBirthday(new Date()); user.setUsername("孙悟空"); user.setSex("神"); userDao.updateUser(user); } @Test public void TestFindById(){ User user = userDao.findById(42); System.out.println(user); } @Test public void TestFindByName(){ List<User> user = userDao.findByName("%王%"); System.out.println(user); } @Test public void TestCount(){ int count = userDao.count(); System.out.println(count); } }首先可以将测试方法中需要一直用到的语句单独写出来,例如测试类开始的变量定义和@Before和@After操作,这样可以简化每个测试方法的书写。
