【梗概】
1.根据XML配置文件(全局配置文件,有数据源的一些运行信息)创建一个SqlSessionFactory对象。
2.sql映射文件:配置了每一个sql以及sql的封装规则。
3.将sql映射文件注册在全局配置文件中。
4写代码:
(1)根据全局配置文件得到SqlSessionFactory。
(2)使用SqlSession工厂,得到sqlSession对象,使用它进行增删改查。一个sqlSession就是代表和数据库的一次会话,用完关闭。
(3)使用sql的唯一标识来告诉Mybatis执行执行哪个sql。sql都保存在sql映射文件中。
【编写第一个基于Mybatis的程序】
(1)添加jar包
Mybatis:mybatis-3.1.1.jar
MySQL驱动包:mysql-connector-java-5.1.7-bin.jar
(2)建库+表
1 create database mybatis; 2 use mybatis; 3 CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT); 4 INSERT INTO users(NAME, age) VALUES('Tom', 12); 5 INSERT INTO users(NAME, age) VALUES('Jack', 11);
(3) 添加 Mybatis 的配置文件 conf.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 4 <configuration> 5 <environments default="development"> 6 <environment id="development"> 7 <transactionManager type="JDBC" /> 8 <dataSource type="POOLED"> 9 <property name="driver" value="com.mysql.jdbc.Driver" /> 10 <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /> 11 <property name="username" value="root" /> 12 <property name="password" value="root" /> 13 </dataSource> 14 </environment> 15 </environments> 16 </configuration>
(4) 定义表所对应的实体类
1 public class User { 2 private int id; 3 private String name; 4 private int age; 5 //get,set 方法 6 }
(5)定义操作 users 表的 sql 映射文件 userMapper.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 <mapper namespace=" com.atguigu.mybatis_test.test1.userMapper"> 5 <select id="getUser" parameterType="int" 6 resultType="com.atguigu.mybatis_test.test1.User"> 7 select * from users where id=#{id} 8 </select> 9 </mapper>
(6)在 在 conf.xml 文件中注册 userMapper.xml
1 <mappers> 2 <mapper resource="com/atguigu/mybatis_test/test1/userMapper.xml"/> 3 </mappers>
(7)编写测试代码:执行定义的 select 语句
1 public class Test { 2 public static void main(String[] args) throws IOException { 3 String resource = "conf.xml"; 4 5 //加载 mybatis 的配置文件(它也加载关联的映射文件) 6 Reader reader = Resources.getResourceAsReader(resource); 7 8 //构建 sqlSession 的工厂 9 SqlSessionFactory sessionFactory = new 10 SqlSessionFactoryBuilder().build(reader); 11 12 //创建能执行映射文件中 sql 的 sqlSession 13 SqlSession session = sessionFactory.openSession(); 14 15 //映射 sql 的标识字符串 16 String statement = "com.atguigu.mybatis.bean.userMapper"+".selectUser"; 17 18 //执行查询返回一个唯一 user 对象的 sql 19 User user = session.selectOne(statement, 1); 20 System.out.println(user);
} 21 }
【操作 users 表的 CRUD】
1). 定义 sql 映射 xml 文件
1 <insert id="insertUser" parameterType="com.atguigu.ibatis.bean.User"> 2 insert into users(name, age) values(#{name}, #{age}); 3 </insert> 4 <delete id="deleteUser" parameterType="int"> 5 delete from users where id=#{id} 6 </delete> 7 <update id="updateUser" parameterType="com.atguigu.ibatis.bean.User"> 8 update users set name=#{name},age=#{age} where id=#{id} 9 </update> 10 <select id="selectUser" parameterType="int" resultType="com.atguigu.ibatis.bean.User"> 11 select * from users where id=#{id} 12 </select> 13 <select id="selectAllUsers" resultType="com.atguigu.ibatis.bean.User"> 14 select * from users 15 </select>
2). 在 在 config.xml 中注册这个映射文件
1 <mapper resource="net/lamp/java/ibatis/bean/userMapper.xml"/>
3). 在 在 dao 中调用:
1 public User getUserById(int id) { 2 SqlSession session = sessionFactory.openSession(); 3 User user = session.selectOne(URI+".selectUser", id); 4 return user; 5 }
【注解的实现】
1). 定义 sql 映射的接口
1 public interface UserMapper { 2 @Insert("insert into users(name, age) values(#{name}, #{age})") 3 public int insertUser(User user); 4 @Delete("delete from users where id=#{id}") 5 public int deleteUserById(int id); 6 @Update("update users set name=#{name},age=#{age} where id=#{id}") 7 public int updateUser(User user); 8 @Select("select * from users where id=#{id}") 9 public User getUserById(int id); 10 @Select("select * from users") 11 public List<User> getAllUser(); 12 }
2). 在 在 config 中注册这个映射接口
1 <mapper class="com.atguigu.ibatis.crud.ano.UserMapper"/>
3). 在 在 dao 类中调用
1 public User getUserById(int id) { 2 SqlSession session = sessionFactory.openSession(); 3 UserMapper mapper = session.getMapper(UserMapper.class); 4 User user = mapper.getUserById(id); 5 return user; 6 }
【几个可以优化的地方】
(1)连接数据库的配置单独放在一个 properties 文件中
## db.properties <properties resource="db.properties"/> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" />
(2)为实体类定义别名, 简化 sql 映射 xml 文件中的引用
1 <typeAliases> 2 <typeAlias type="com.atguigu.ibatis.bean.User" alias="_User"/> 3 </typeAliases>
(3)可以在 src 下加入 log4j 的配置文件, 打印日志信息
1. 添加 jar:
log4j-1.2.16.jar
2. log4j.properties(
log4j.properties,
log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
3.log4j.xml( 方式二)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L)
" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="debug" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>