mybatis入门
首先来回顾一下jdbc
@Test public void testJdbc(){ Connection connection=null; PreparedStatement prepareStatement=null; ResultSet resultSet=null; try { //加载驱动 Class.forName("com.mysql.jdbc.Driver"); //建立连接 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ssm?characterEncoding=utf-8","root", "root"); //创建sql语句并执行 String sql="select * from user "; prepareStatement = connection.prepareStatement(sql); //prepareStatement.setString(1, "王五"); resultSet = prepareStatement.executeQuery(); //返回结果集并处理 while (resultSet.next()) { System.out.println(resultSet.getString("id")+"------>"+resultSet.getString("userName")); } } catch (Exception e) { e.printStackTrace(); }finally { if(resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if(prepareStatement!=null){ try { prepareStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
最基础的xml开发
然后再来看看mybatis
建立maven工程
file--new--project---maven--maven project--next
然后在pom中添加依赖
<dependencies> <!-- mybatis依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- mysql依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.35</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
建立pojo类
public class User { private int id; private String userId; private String userName; private String birthday; private String gender; private String address; private String tel; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } @Override public String toString() { return "User [id=" + id + ", userId=" + userId + ", userName=" + userName + ", birthday=" + birthday + ", gender=" + gender + ", address=" + address + ", tel=" + tel + "]"; } }
dao接口以及实现类daoImpl
public interface UserDao { public User findUserById(int id) ; public void insertUser(User user) ; }
public class UserDaoImpl implements UserDao { // 注入SqlSessionFactory public UserDaoImpl(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } private SqlSessionFactory sqlSessionFactory; @Override public User findUserById(int id) { SqlSession session = sqlSessionFactory.openSession(); User user = null; try { // 通过sqlsession调用selectOne方法获取一条结果集 // 参数1:指定定义的statement的id,参数2:指定向statement中传递的参数 user = session.selectOne("test.findUserById", id); System.out.println(user); } finally { session.close(); } return user; } @Override public void insertUser(User user) { SqlSession sqlSession = sqlSessionFactory.openSession(); try { sqlSession.insert("insertUser", user); sqlSession.commit(); } finally { sqlSession.close(); } } }
关键是配置文件
全局配置
<?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"> <configuration> <!-- 读取properties 配置文件 --> <properties resource="properties/db.properties"></properties> <!-- 配置数据源 --> <environments default="development"> <environment id="development"> <!-- 事务管理:采用的是JDBC的事务管理 --> <transactionManager type="JDBC" /> <!-- 配置数据源连接池: POOLED使用的是Mybatis自己的连接池 --> <dataSource type="POOLED"> <property name="driver" value="${db.driver}" /> <property name="url" value="${db.url}" /> <property name="username" value="${db.username}" /> <property name="password" value="${db.password}" /> </dataSource> </environment> </environments> <!-- 读取mapper映射文件 --> <mappers> <mapper resource="dao/UserMapper.xml" /> </mappers> </configuration>
映射文件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="test"> <select id="findUserById" parameterType="int" resultType="com.kkb.mybatis.dao.po.User"> SELECT * FROM user WHERE id = #{id} </select> <insert id="insertUser" parameterType="com.kkb.mybatis.dao.po.User" useGeneratedKeys="true"> INSERT INTO user (username,gender,birthday,address) VALUES (#{userName},#{gender},#{birthday},#{address}) </insert> </mapper>
db.properties
db.driver=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost:3306/ssm?characterEncoding=utf-8 db.username=root db.password=root
log4j.properties
# Global logging configuration log4j.rootLogger=DEBUG, stdout # MyBatis logging configuration... log4j.logger.com.kkb.mybatis.mapper=DEBUG # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
测试
public class UserDaoTest { private SqlSessionFactory sqlSessionFactory; @Before public void before() { try { // 指定全局配置文件路径 String resource = "dao/SqlMapConfig.xml"; // 加载资源文件(全局配置文件和映射文件) InputStream inputStream = Resources.getResourceAsStream(resource); // 还有构建者模式,去创建SqlSessionFactory对象 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } @Test public void testFindUserById() { UserDao dao = new UserDaoImpl(sqlSessionFactory); User user = dao.findUserById(2); System.out.println(user); } @Test public void testInsertUser() { UserDao dao = new UserDaoImpl(sqlSessionFactory); User user = new User(); user.setUserName("lucas"); user.setGender("男"); user.setAddress("上海"); // 调用dao的添加用户操作 dao.insertUser(user); // 打印通过主键返回策略生成的ID System.out.println(user.getId()); } }
控制台信息
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - Opening JDBC Connection DEBUG [main] - Created connection 813656972. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@307f6b8c] DEBUG [main] - ==> Preparing: SELECT * FROM user WHERE id = ? DEBUG [main] - ==> Parameters: 2(Integer) DEBUG [main] - <== Total: 1 User [id=2, userId=001, userName=王五, birthday=2019-05-17, gender=男, address=上海, tel=110] DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@307f6b8c] DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@307f6b8c] DEBUG [main] - Returned connection 813656972 to pool. User [id=2, userId=001, userName=王五, birthday=2019-05-17, gender=男, address=上海, tel=110]