【Mybatis 之基础应用小结】
1、不管怎么样,先建立一个简单的MySQL数据表,如下所示
2、接下来要做的事情就是通过Mybatis对数据表进行基础的增删查改,写好bean以及打算实现的方法
import java.util.List; public class PersonDAO { public void savePerson(Person person) { } public void removePersonByName(String name) { } public void removePersonByAge(int age) { } public List<Person> listPersonByName() { return null; } public List<Person> listPersonByAge() { return null; } public void updatePersonByName() { } }
3、在写代码之前,先添加必要的依赖包,
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.0.4</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
4、要实现上述罗列的方法的第一步就是获取数据表所在数据库的连接,
把配置文件COPY进来,编辑好连接所需要的信息,(mappers先注释掉,顺手把log4j的配置文件也丢进来
在这之前先把项目分好层次,
Configuration.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"> <property name="" value=""/> </transactionManager> <dataSource type="UNPOOLED"> <property name="driver" value="org.gjt.mm.mysql.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/my_test"/> <property name="username" value="root"/> <property name="password" value="19971019"/> </dataSource> </environment> </environments> <!--<mappers>--> <!--<mapper resource="????"/>--> <!--</mappers>--> </configuration>
log4j.properties
log4j.rootLogger=DEBUG, MyConsole
log4j.appender.MyConsole=org.apache.log4j.ConsoleAppender
log4j.appender.MyConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.MyConsole.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.org.apache=INFO
5、我们的最终目的是得到SqlSession类对象,以便通过该对象执行SQL语句,在此之前需要建立SqlSessionFactory,
我将这段代码独立地放在db层下,如下所示:
package db; 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; /** * 访问数据库类 */ public class DBAccess { public SqlSession getSqlSession() throws IOException { Reader reader = Resources.getResourceAsReader("Configuration.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession sqlSession = sqlSessionFactory.openSession(); return sqlSession; } }
这样就可以方便地获得SqlSession类对象了。
6、真正开始实现personDAO,先把模板COPY到类底下
private static DBAccess dbAccess = null;
private static SqlSession sqlSession = null;
static {
dbAccess = new DBAccess();
try {
sqlSession = dbAccess.getSqlSession();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void finalize() throws Throwable {
sqlSession.close();
super.finalize();
}
( 有错。线程不安全)
创建 person.xml 并把模板COPY进来略做修改
<?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="Person"> <resultMap type="bean.Person" id="PersonResult"> <result column="NAME" jdbcType="VARCHAR" property="name"/> <result column="AGE" jdbcType="INTEGER" property="age"/> </resultMap> </mapper>
修改Configuration.xml 中的 mapper
<mappers> <mapper resource="sqlxml/Person.xml"/> </mappers>
接下来的节奏就是 person.xml --> PersonDAO.java --> 测试 --> person.xml --> PersonDAO.java --> 测试 --> person.xml --> PersonDAO.java --> 测试 --> person.xml --> PersonDAO.java --> 测试 --> person.xml --> PersonDAO.java --> 测试 --> person.xml --> PersonDAO.java --> 测试 --> .... 一个一个方法写下来。在SQL语句中如何获取特定类型的参数值 可以参考 通过自动回复机器人学Mybatis:OGNL+log4j.properties 里面的图片。
7、完成之后是这个样子的,
person.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="Person"> <resultMap type="bean.Person" id="PersonResult"> <result column="NAME" jdbcType="VARCHAR" property="name"/> <result column="AGE" jdbcType="INTEGER" property="age"/> </resultMap> <insert id="savePerson" parameterType="bean.Person"> INSERT INTO person VALUES (#{name}, #{age}) </insert> <delete id="removePersonByName" parameterType="String"> DELETE FROM person WHERE name='${_parameter}' </delete> <delete id="removePersonByAge" parameterType="int"> DELETE FROM person WHERE name=${_parameter} </delete> <select id="listPersonByName" parameterType="String" resultMap="PersonResult"> SELECT name, age FROM person WHERE name='${_parameter}' </select> <select id="listPersonByAge" parameterType="int" resultMap="PersonResult"> SELECT name, age FROM person WHERE age=${_parameter} </select> <update id="updatePersonByName" parameterType="bean.Person"> UPDATE person SET age=${age} WHERE name='${name}' </update> </mapper>
personDAO.java
package dao; import bean.Person; import db.DBAccess; import org.apache.ibatis.session.SqlSession; import java.io.IOException; import java.util.List; public class PersonDAO { private static DBAccess dbAccess = null; private static SqlSession sqlSession = null; static { dbAccess = new DBAccess(); try { sqlSession = dbAccess.getSqlSession(); } catch (IOException e) { e.printStackTrace(); } } @Override protected void finalize() throws Throwable { sqlSession.close(); super.finalize(); } public static void main(String[] args) { Person person = new Person(); person.setName("小王"); person.setAge(23); PersonDAO personDAO = new PersonDAO(); personDAO.savePerson(person); // personDAO.removePersonByName("小王"); // personDAO.removePersonByAge(23); System.out.println(personDAO.listPersonByName("小王")); for (Person p : personDAO.listPersonByAge(19)) { System.out.println(p); } personDAO.updatePersonByName("小王", 0); } public void savePerson(Person person) { sqlSession.insert("Person.savePerson", person); sqlSession.commit(); } public void removePersonByName(String name) { sqlSession.delete("Person.removePersonByName", name); sqlSession.commit(); } public void removePersonByAge(int age) { sqlSession.delete("Person.removePersonByAge", age); sqlSession.commit(); } public List<Person> listPersonByName(String name) { return sqlSession.selectList("Person.listPersonByName", name); } public List<Person> listPersonByAge(int age) { return sqlSession.selectList("Person.listPersonByAge", age); } public void updatePersonByName(String name, int age) { Person person = new Person(); person.setName(name); person.setAge(age); sqlSession.update("Person.updatePersonByName", person); sqlSession.commit(); } }
这样写貌似会造成线程不安全,单个用户多次刷新的时候
【IntelliJ IDEA目录结构的一些小问题】
IntelliJ IDEA 的目录结构和 eclipse 的目录结构有那么一点不同,
如果在 IntelliJ IDEA 中采取 eclipse 中的方式来读取Mybatis配置文件是要出错的!(反之亦然
eclipse 的根目录是 src
而 IntelliJ IDEA 则把各类文件分了类,管你怎么弄,类别不对就是读不到。。。
我们需要自定义各种类型文件的根目录
为了顺利读到配置文件,个人采取的方式是把 config 文件直接分离出来并设置为 Sources Root
然后通过 Copy Relative Path 来得到所需配置文件的路径
在本例中结果是这样的,相对路径非常简洁