我搭建的Mybatis的框架的分层:
代码:实体层、业务对象层、映射对象层、工具层、测试层
配置文件:数据库配置文件、mapper映射配置文件、log日志配置文件
mybatis的配置的校验头
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
mybatis的mapper的校验头
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
日志文件 log4j.properties
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[service] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.logger.java.sql.Statement = debug
log4j.logger.java.sql.PreparedStatement = debug
log4j.logger.java.sql.ResultSet =debug
1.多表查询和单表插入的实例
创建用户实体类
package com.mybatis.domain;
public class UserInfo {
private int userId;
private String userName;
private String userSex;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
}
创建书籍和用户关联的业务类
package com.mybatis.BO;
/**
* Business Object
* 业务逻辑层
*/
import java.math.BigDecimal;
import java.sql.Date;
public class BookDetailBO {
private BigDecimal bookId;
private String bookName;
private BigDecimal bookPrice;
private Date bookDate;
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public BigDecimal getBookId() {
return bookId;
}
public void setBookId(BigDecimal bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public BigDecimal getBookPrice() {
return bookPrice;
}
public void setBookPrice(BigDecimal bookPrice) {
this.bookPrice = bookPrice;
}
public Date getBookDate() {
return bookDate;
}
public void setBookDate(Date bookDate) {
this.bookDate = bookDate;
}
@Override
public String toString() {
return "BookDetailBO [bookId=" + bookId + ", bookName=" + bookName + ", bookPrice=" + bookPrice + ", bookDate="
+ bookDate + ", userName=" + userName + "]";
}
}
在resources文件夹中创建数据库配置文件DateSource.properties
#数据库配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=123
创建mapper类
package com.mybatis.mapper;
import org.apache.ibatis.annotations.Param;
import com.mybatis.BO.BookDetailBO;
import com.mybatis.domain.UserInfo;
public interface BookInfoMapper {
BookDetailBO getid(@Param("bookId")Integer bookId,@Param("userName")String userName);
//已将它单独拆除来,作为userInfoMapper的方法
//int insertuser(UserInfo userInfo);
}
package com.mybatis.mapper;
import com.mybatis.domain.UserInfo;
public interface UserInfoMapper {
int insertuser(UserInfo userInfo);
}
创建bookInfoMapper的配置文件
<?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接口-->
<mapper namespace="com.mybatis.mapper.BookInfoMapper">
<resultMap id="BookDetailMapper" type="com.mybatis.BO.BookDetailBO">
<id property="bookId" column="book_id"/>
<result property="bookName" column="book_name"/>
<result property="bookPrice" column="book_price"/>
<result property="bookDate" column="book_date"/>
<result property="userName" column="user_name"/>
</resultMap>
<!-- 多表查询 : id="getid" 为借口中的名称,或者是普通方法调用的标识-->
<select id="getid" resultMap="BookDetailMapper">
SELECT
b.book_date,
b.book_name,
b.book_price,
u.user_name
FROM t_book b
INNER JOIN t_user u ON u.user_id=b.user_id
WHERE b.book_id=#{bookId,jdbcType=BIGINT}
<if test="userName !='' and userName !=null">
and u.user_name=#{userName,jdbcType=VARCHAR}
</if>
</select>
<!--当解开这个时,因为userInfoMapper也有这个方法,id会冲突,可以换一个id或者,调用时id换成全路径名称-->
<!-- <insert id="insertuser" parameterType="com.mybatis.domain.UserInfo">
INSERT t_user (user_id,user_name,user_sex) VALUES(#{userId},#{userName},#{userSex})
</insert> -->
</mapper>
创建userInfoMapper的配置文件
<?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.mybatis.mapper.UserInfoMapper">
<insert id="insertuser" parameterType="com.mybatis.domain.UserInfo">
INSERT t_user (user_id,user_name,user_sex) VALUES(#{userId},#{userName},#{userSex})
</insert>
</mapper>
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">
<configuration>
<!-- 把配置文件加载到mybatis中 -->
<properties resource="DateSource.properties"></properties>
<environments default="mysql">
<environment id="mysql">
<!-- JDBC 把事务管理直接使用数据库来控制
MANAGED 把事物交由用第三方事物管理(如整合spring时使用spring容器管理)
-->
<transactionManager type="JDBC"/>
<!-- 连接池 -->
<dataSource type="POOLED">
<!-- 加载数据库配置文件的数据 -->
<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>
<mappers>
<!-- 引入mapper文件-->
<mapper resource="mybatis/mapper/bookDetailBOMapper.xml"/>
<mapper resource="mybatis/mapper/userInfoMapper.xml"/>
</mappers>
</configuration>
工具类,返回sessionFactory
package com.mybatis.util;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* 获取SqlSession的工具类
* @author zy
*
*/
public class SQLSession {
private static SqlSessionFactory sessionFactory;
static{
try {
//mybatis封装的资源读取类,底层还是通过classLoader获取流
Reader reader=Resources.getResourceAsReader("SqlMapperConfig.xml");
sessionFactory=new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession(){
return sessionFactory.openSession();
}
}
测试类
package com.mybatis.test;
import org.apache.ibatis.session.SqlSession;
import com.mybatis.BO.BookDetailBO;
import com.mybatis.domain.UserInfo;
import com.mybatis.mapper.BookInfoMapper;
import com.mybatis.util.SQLSession;
public class Test {
public static void main(String[] args) {
SqlSession session=SQLSession.getSession();
/**
* 使用mapper操作
*/
BookInfoMapper bookInfoMapper = session.getMapper(BookInfoMapper.class);
BookDetailBO bookDetailBO = bookInfoMapper.getid(3, "");
System.out.println(bookDetailBO);
//会影响数据库行数的则需要commit,只有提交了才会持久化到数据库
UserInfo userInfo=new UserInfo();
userInfo.setUserId(7);
userInfo.setUserName("test");
userInfo.setUserSex("男");
//userInfoMapper也可以使用,自己可以试一试
/* int row=bookInfoMapper.insertuser(userInfo);
System.out.println(row>0 ? "添加成功" :"添加失败");*/
/**
* 通用操作
* insertuser为mapper配置文件中的id
*/
userInfo.setUserId(9);
int row=session.insert("insertuser", userInfo);
session.commit();
System.out.println(row>0 ? "添加成功" :"添加失败");
}
}
运行结果:
[service] 2018-11-14 15:13:40,433 - org.apache.ibatis.logging.LogFactory -0 [main] DEBUG org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
[service] 2018-11-14 15:13:40,558 - org.apache.ibatis.datasource.pooled.PooledDataSource -125 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[service] 2018-11-14 15:13:40,558 - org.apache.ibatis.datasource.pooled.PooledDataSource -125 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[service] 2018-11-14 15:13:40,558 - org.apache.ibatis.datasource.pooled.PooledDataSource -125 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[service] 2018-11-14 15:13:40,558 - org.apache.ibatis.datasource.pooled.PooledDataSource -125 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
[service] 2018-11-14 15:13:40,793 - org.apache.ibatis.transaction.jdbc.JdbcTransaction -360 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
[service] 2018-11-14 15:13:41,074 - org.apache.ibatis.datasource.pooled.PooledDataSource -641 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 660143728.
[service] 2018-11-14 15:13:41,074 - org.apache.ibatis.transaction.jdbc.JdbcTransaction -641 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@2758fe70]
[service] 2018-11-14 15:13:41,087 - com.mybatis.mapper.BookInfoMapper.getid -654 [main] DEBUG com.mybatis.mapper.BookInfoMapper.getid - ==> Preparing: SELECT b.book_date, b.book_name, b.book_price, u.user_name FROM t_book b INNER JOIN t_user u ON u.user_id=b.user_id WHERE b.book_id=?
[service] 2018-11-14 15:13:41,102 - com.mybatis.mapper.BookInfoMapper.getid -669 [main] DEBUG com.mybatis.mapper.BookInfoMapper.getid - ==> Parameters: 3(Integer)
[service] 2018-11-14 15:13:41,118 - com.mybatis.mapper.BookInfoMapper.getid -685 [main] DEBUG com.mybatis.mapper.BookInfoMapper.getid - <== Total: 1
BookDetailBO [bookId=null, bookName=三生花, bookPrice=12, bookDate=2018-10-23, userName=古月]
[service] 2018-11-14 15:13:41,118 - com.mybatis.mapper.UserInfoMapper.insertuser -685 [main] DEBUG com.mybatis.mapper.UserInfoMapper.insertuser - ==> Preparing: INSERT t_user (user_id,user_name,user_sex) VALUES(?,?,?)
[service] 2018-11-14 15:13:41,118 - com.mybatis.mapper.UserInfoMapper.insertuser -685 [main] DEBUG com.mybatis.mapper.UserInfoMapper.insertuser - ==> Parameters: 9(Integer), test(String), 男(String)
[service] 2018-11-14 15:13:41,134 - com.mybatis.mapper.UserInfoMapper.insertuser -701 [main] DEBUG com.mybatis.mapper.UserInfoMapper.insertuser - <== Updates: 1
[service] 2018-11-14 15:13:41,134 - org.apache.ibatis.transaction.jdbc.JdbcTransaction -701 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@2758fe70]
添加成功