第一个MyBatis程序
一、基本程序
需求:实现将student信息写入到DB中
1.定义实体类:
public class Student {
private Integer id;
private String name;
private int age;
private double score;
//无参、带参构造器
//getter、setter
//toString()
}
2.定义Dao接口:
public interface IStudentDao {
void insertStu(Student student);
}
3.定义映射文件(mapper.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" parameterType="com.hcx.beans.Student">
<insert id="insertStudent" parameterType="com.hcx.beans.Student">
insert into student(name,age,score)
values(#{name},#{age},#{score})
</insert>
</mapper>
注意:#{}中写入的是student类的属性名。
对于parameterType属性,框架会自动根据用户执行的Sqlsession方法中的参数自动检测到,所以一般我们不用指定parameterType属性。
4.定义主配置文件(mybatis.xml)
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 注册映射文件 -->
<mappers>
<mapper resource="com/hcx/dao/mapper.xml"/>
</mappers>
</configuration>
5.定义dao实现类
public class StudentDaoImpl implements IStudentDao {
private SqlSession sqlSession;
@Override
public void insertStu(Student student) {
try {
//读取主配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建sqlsession对象
sqlSession = sqlSessionFactory.openSession();
//操作
sqlSession.insert("insertStudent",student);
//Sqlsession提交
sqlSession.commit();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(sqlSession!=null){
sqlSession.close();
}
}
}
}
6.测试
public class MyTest {
private IStudentDao dao;
@Before
public void before(){
dao = new StudentDaoImpl();
}
@Test
public void testInsert(){
Student student = new Student("张三",23,99.8);
dao.insertStu(student);
}
}
7.添加日志控制文件
日志级别设置:
- debug:显示出所执行的sql语句、参数值、对DB的影响条数等信息。
- trace:显示出查询出的每条记录的每个字段名及值
可以指定要输出日志的工作空间的名字,此时,只会输出该namespace下执行的SQL的日志内容
##define a logger
log4j.rootLogger=trace,console
##define a logger
##log4j.logger.namespace_value=trace,console
log4j.logger.test=trace,console
二、使用工具类
每一次执行Sqlsession的方法,均需要首先获取到该对象。而Sqlsession对象的获取又相对比较繁琐,所以,可以获取Sqlsession对象定义为一个工具类方法。
Sqlsession对象是通过SqlsessionFactory对象创建的。由于SqlsessionFactory类为重量级对象,且为线程安全的,所以可以将SqlsessionFactory对象定义为单例的。
1.创建工具类
public class MyBatisUtil {
private static SqlSessionFactory factory;
public static SqlSession getSqlSession(){
try {
if(factory==null){
//读取主配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//创建Sqlsession工厂
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return factory.openSession();
}
}
2.修改dao接口的实现类
没有异常需要处理,但Sqlsession必须要关闭。
public class StudentDaoImpl implements IStudentDao {
private SqlSession sqlSession;
@Override
public void insertStu(Student student) {
try {
sqlSession = MyBatisUtil.getSqlSession();
sqlSession.insert("insertStu,student");
//Sqlsession提交
sqlSession.commit();
}finally {
if(sqlSession!=null){
sqlSession.close();
}
}
}
}
三、从属性文件中读取DB连接四要素
1.定义属性文件
在src下定义属性文件jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///test
jdbc.user=root
jdbc.password=root
2.修改主配置文件
对于主配置文件,第一,需要注册属性文件。第二,需要从属性文件中通过key,将其value读取出来。
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.dirver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 注册映射文件 -->
<mappers>
<mapper resource="com/hcx/dao/mapper.xml"/>
</mappers>
</configuration>
四、多个映射文件
在项目中,一般一个dao接口会对应一个映射文件。
1.新添加一个映射文件
<!-- 注册映射文件 -->
<mappers>
<mapper resource="com/hcx/dao/mapper.xml"/>
<mapper resource="com/hcx/dao/mapper2.xml"/>
</mappers>
2.修改任意一个映射文件
可以修改任意一个映射文件<mapper/>标签的namespace属性,将两个不用映射文件中的sql映射,归入为不同的命名空间。
命名空间的作用:用于区分不同命名空间中的同名的sql映射id。
3.修改dao实现类
在dao实现类中使用时,需要给出具体使用的是哪个命名空间下的sql映射语句。
public class StudentDaoImpl2 implements IStudentDao {
private SqlSession sqlSession;
@Override
public void insertStu(Student student) {
try {
sqlSession = MyBatisUtil.getSqlSession();
sqlSession.insert("test.insertStu,student");
//Sqlsession提交
sqlSession.commit();
}finally {
if(sqlSession!=null){
sqlSession.close();
}
}
}
}